From 7a2adb22eb3ebec5fd90d1d4fbce3f5dbd61bb3c Mon Sep 17 00:00:00 2001 From: "Hyon Lim (Retina)" Date: Wed, 29 May 2013 00:45:02 +1000 Subject: [PATCH] Visualization code has been added. --- .../attitude_estimator_so3_comp/README | 5 + .../attitude_estimator_so3_comp_params.c | 14 +- .../attitude_estimator_so3_comp_params.h | 14 +- .../FreeIMU_cube/FreeIMU_cube.pde | 265 +++++++ .../FreeIMU_cube/LICENSE.txt | 674 ++++++++++++++++++ .../FreeIMU_cube/data/CourierNew36.vlw | Bin 0 -> 114920 bytes .../FreeIMU_yaw_pitch_roll.pde | 229 ++++++ .../FreeIMU_yaw_pitch_roll/LICENSE.txt | 674 ++++++++++++++++++ .../data/CourierNew36.vlw | Bin 0 -> 114920 bytes .../visualization_code/README | 9 + 10 files changed, 1882 insertions(+), 2 deletions(-) create mode 100644 src/modules/attitude_estimator_so3_comp/README create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/FreeIMU_cube.pde create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/LICENSE.txt create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/data/CourierNew36.vlw create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/FreeIMU_yaw_pitch_roll.pde create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/LICENSE.txt create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/data/CourierNew36.vlw create mode 100644 src/modules/attitude_estimator_so3_comp/visualization_code/README diff --git a/src/modules/attitude_estimator_so3_comp/README b/src/modules/attitude_estimator_so3_comp/README new file mode 100644 index 0000000000..26b270d37c --- /dev/null +++ b/src/modules/attitude_estimator_so3_comp/README @@ -0,0 +1,5 @@ +Synopsis + + nsh> attitude_estimator_so3_comp start -d /dev/ttyS1 -b 115200 + +Option -d is for debugging packet. See visualization_code folder. diff --git a/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.c b/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.c index 068e4340a6..1d5e0670a0 100755 --- a/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.c +++ b/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.c @@ -1,7 +1,19 @@ /* + * Author: Hyon Lim + * * @file attitude_estimator_so3_comp_params.c * - * Parameters for SO3 complementary filter + * Implementation of nonlinear complementary filters on the SO(3). + * This code performs attitude estimation by using accelerometer, gyroscopes and magnetometer. + * Result is provided as quaternion, 1-2-3 Euler angle and rotation matrix. + * + * Theory of nonlinear complementary filters on the SO(3) is based on [1]. + * Quaternion realization of [1] is based on [2]. + * Optmized quaternion update code is based on Sebastian Madgwick's implementation. + * + * References + * [1] Mahony, R.; Hamel, T.; Pflimlin, Jean-Michel, "Nonlinear Complementary Filters on the Special Orthogonal Group," Automatic Control, IEEE Transactions on , vol.53, no.5, pp.1203,1218, June 2008 + * [2] Euston, M.; Coote, P.; Mahony, R.; Jonghyuk Kim; Hamel, T., "A complementary filter for attitude estimation of a fixed-wing UAV," Intelligent Robots and Systems, 2008. IROS 2008. IEEE/RSJ International Conference on , vol., no., pp.340,345, 22-26 Sept. 2008 */ #include "attitude_estimator_so3_comp_params.h" diff --git a/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.h b/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.h index 2fccec61ce..f006956308 100755 --- a/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.h +++ b/src/modules/attitude_estimator_so3_comp/attitude_estimator_so3_comp_params.h @@ -1,7 +1,19 @@ /* + * Author: Hyon Lim + * * @file attitude_estimator_so3_comp_params.h * - * Parameters for EKF filter + * Implementation of nonlinear complementary filters on the SO(3). + * This code performs attitude estimation by using accelerometer, gyroscopes and magnetometer. + * Result is provided as quaternion, 1-2-3 Euler angle and rotation matrix. + * + * Theory of nonlinear complementary filters on the SO(3) is based on [1]. + * Quaternion realization of [1] is based on [2]. + * Optmized quaternion update code is based on Sebastian Madgwick's implementation. + * + * References + * [1] Mahony, R.; Hamel, T.; Pflimlin, Jean-Michel, "Nonlinear Complementary Filters on the Special Orthogonal Group," Automatic Control, IEEE Transactions on , vol.53, no.5, pp.1203,1218, June 2008 + * [2] Euston, M.; Coote, P.; Mahony, R.; Jonghyuk Kim; Hamel, T., "A complementary filter for attitude estimation of a fixed-wing UAV," Intelligent Robots and Systems, 2008. IROS 2008. IEEE/RSJ International Conference on , vol., no., pp.340,345, 22-26 Sept. 2008 */ #include diff --git a/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/FreeIMU_cube.pde b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/FreeIMU_cube.pde new file mode 100644 index 0000000000..3706437d33 --- /dev/null +++ b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/FreeIMU_cube.pde @@ -0,0 +1,265 @@ +/** +Visualize a cube which will assumes the orientation described +in a quaternion coming from the serial port. + +INSTRUCTIONS: +This program has to be run when you have the FreeIMU_serial +program running on your Arduino and the Arduino connected to your PC. +Remember to set the serialPort variable below to point to the name the +Arduino serial port has in your system. You can get the port using the +Arduino IDE from Tools->Serial Port: the selected entry is what you have +to use as serialPort variable. + + +Copyright (C) 2011-2012 Fabio Varesano - http://www.varesano.net/ + +This program is free software: you can redistribute it and/or modify +it under the terms of the version 3 GNU General Public License as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +*/ + +import processing.serial.*; +import processing.opengl.*; + +Serial myPort; // Create object from Serial class + +final String serialPort = "/dev/ttyUSB9"; // replace this with your serial port. On windows you will need something like "COM1". + +float [] q = new float [4]; +float [] hq = null; +float [] Euler = new float [3]; // psi, theta, phi + +int lf = 10; // 10 is '\n' in ASCII +byte[] inBuffer = new byte[22]; // this is the number of chars on each line from the Arduino (including /r/n) + +PFont font; +final int VIEW_SIZE_X = 800, VIEW_SIZE_Y = 600; + +final int burst = 32; +int count = 0; + +void myDelay(int time) { + try { + Thread.sleep(time); + } catch (InterruptedException e) { } +} + +void setup() +{ + size(VIEW_SIZE_X, VIEW_SIZE_Y, OPENGL); + myPort = new Serial(this, serialPort, 115200); + + // The font must be located in the sketch's "data" directory to load successfully + font = loadFont("CourierNew36.vlw"); + + println("Waiting IMU.."); + + myPort.clear(); + + while (myPort.available() == 0) { + myPort.write("v"); + myDelay(1000); + } + println(myPort.readStringUntil('\n')); + myPort.write("q" + char(burst)); + myPort.bufferUntil('\n'); +} + + +float decodeFloat(String inString) { + byte [] inData = new byte[4]; + + if(inString.length() == 8) { + inData[0] = (byte) unhex(inString.substring(0, 2)); + inData[1] = (byte) unhex(inString.substring(2, 4)); + inData[2] = (byte) unhex(inString.substring(4, 6)); + inData[3] = (byte) unhex(inString.substring(6, 8)); + } + + int intbits = (inData[3] << 24) | ((inData[2] & 0xff) << 16) | ((inData[1] & 0xff) << 8) | (inData[0] & 0xff); + return Float.intBitsToFloat(intbits); +} + +void serialEvent(Serial p) { + if(p.available() >= 18) { + String inputString = p.readStringUntil('\n'); + //print(inputString); + if (inputString != null && inputString.length() > 0) { + String [] inputStringArr = split(inputString, ","); + if(inputStringArr.length >= 5) { // q1,q2,q3,q4,\r\n so we have 5 elements + q[0] = decodeFloat(inputStringArr[0]); + q[1] = decodeFloat(inputStringArr[1]); + q[2] = decodeFloat(inputStringArr[2]); + q[3] = decodeFloat(inputStringArr[3]); + } + } + count = count + 1; + if(burst == count) { // ask more data when burst completed + p.write("q" + char(burst)); + count = 0; + } + } +} + + + +void buildBoxShape() { + //box(60, 10, 40); + noStroke(); + beginShape(QUADS); + + //Z+ (to the drawing area) + fill(#00ff00); + vertex(-30, -5, 20); + vertex(30, -5, 20); + vertex(30, 5, 20); + vertex(-30, 5, 20); + + //Z- + fill(#0000ff); + vertex(-30, -5, -20); + vertex(30, -5, -20); + vertex(30, 5, -20); + vertex(-30, 5, -20); + + //X- + fill(#ff0000); + vertex(-30, -5, -20); + vertex(-30, -5, 20); + vertex(-30, 5, 20); + vertex(-30, 5, -20); + + //X+ + fill(#ffff00); + vertex(30, -5, -20); + vertex(30, -5, 20); + vertex(30, 5, 20); + vertex(30, 5, -20); + + //Y- + fill(#ff00ff); + vertex(-30, -5, -20); + vertex(30, -5, -20); + vertex(30, -5, 20); + vertex(-30, -5, 20); + + //Y+ + fill(#00ffff); + vertex(-30, 5, -20); + vertex(30, 5, -20); + vertex(30, 5, 20); + vertex(-30, 5, 20); + + endShape(); +} + + +void drawCube() { + pushMatrix(); + translate(VIEW_SIZE_X/2, VIEW_SIZE_Y/2 + 50, 0); + scale(5,5,5); + + // a demonstration of the following is at + // http://www.varesano.net/blog/fabio/ahrs-sensor-fusion-orientation-filter-3d-graphical-rotating-cube + rotateZ(-Euler[2]); + rotateX(-Euler[1]); + rotateY(-Euler[0]); + + buildBoxShape(); + + popMatrix(); +} + + +void draw() { + background(#000000); + fill(#ffffff); + + if(hq != null) { // use home quaternion + quaternionToEuler(quatProd(hq, q), Euler); + text("Disable home position by pressing \"n\"", 20, VIEW_SIZE_Y - 30); + } + else { + quaternionToEuler(q, Euler); + text("Point FreeIMU's X axis to your monitor then press \"h\"", 20, VIEW_SIZE_Y - 30); + } + + textFont(font, 20); + textAlign(LEFT, TOP); + text("Q:\n" + q[0] + "\n" + q[1] + "\n" + q[2] + "\n" + q[3], 20, 20); + text("Euler Angles:\nYaw (psi) : " + degrees(Euler[0]) + "\nPitch (theta): " + degrees(Euler[1]) + "\nRoll (phi) : " + degrees(Euler[2]), 200, 20); + + drawCube(); + //myPort.write("q" + 1); +} + + +void keyPressed() { + if(key == 'h') { + println("pressed h"); + + // set hq the home quaternion as the quatnion conjugate coming from the sensor fusion + hq = quatConjugate(q); + + } + else if(key == 'n') { + println("pressed n"); + hq = null; + } +} + +// See Sebastian O.H. Madwick report +// "An efficient orientation filter for inertial and intertial/magnetic sensor arrays" Chapter 2 Quaternion representation + +void quaternionToEuler(float [] q, float [] euler) { + euler[0] = atan2(2 * q[1] * q[2] - 2 * q[0] * q[3], 2 * q[0]*q[0] + 2 * q[1] * q[1] - 1); // psi + euler[1] = -asin(2 * q[1] * q[3] + 2 * q[0] * q[2]); // theta + euler[2] = atan2(2 * q[2] * q[3] - 2 * q[0] * q[1], 2 * q[0] * q[0] + 2 * q[3] * q[3] - 1); // phi +} + +float [] quatProd(float [] a, float [] b) { + float [] q = new float[4]; + + q[0] = a[0] * b[0] - a[1] * b[1] - a[2] * b[2] - a[3] * b[3]; + q[1] = a[0] * b[1] + a[1] * b[0] + a[2] * b[3] - a[3] * b[2]; + q[2] = a[0] * b[2] - a[1] * b[3] + a[2] * b[0] + a[3] * b[1]; + q[3] = a[0] * b[3] + a[1] * b[2] - a[2] * b[1] + a[3] * b[0]; + + return q; +} + +// returns a quaternion from an axis angle representation +float [] quatAxisAngle(float [] axis, float angle) { + float [] q = new float[4]; + + float halfAngle = angle / 2.0; + float sinHalfAngle = sin(halfAngle); + q[0] = cos(halfAngle); + q[1] = -axis[0] * sinHalfAngle; + q[2] = -axis[1] * sinHalfAngle; + q[3] = -axis[2] * sinHalfAngle; + + return q; +} + +// return the quaternion conjugate of quat +float [] quatConjugate(float [] quat) { + float [] conj = new float[4]; + + conj[0] = quat[0]; + conj[1] = -quat[1]; + conj[2] = -quat[2]; + conj[3] = -quat[3]; + + return conj; +} + diff --git a/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/LICENSE.txt b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/LICENSE.txt new file mode 100644 index 0000000000..94a9ed024d --- /dev/null +++ b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/data/CourierNew36.vlw b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_cube/data/CourierNew36.vlw new file mode 100644 index 0000000000000000000000000000000000000000..904771486a1a6d241fb5184282eb99780f730615 GIT binary patch literal 114920 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 Port: the selected entry is what you have +to use as serialPort variable. + +Copyright (C) 2011-2012 Fabio Varesano - http://www.varesano.net/ + +This program is free software: you can redistribute it and/or modify +it under the terms of the version 3 GNU General Public License as +published by the Free Software Foundation. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +*/ + +import processing.serial.*; + +Serial myPort; // Create object from Serial class + + +float [] q = new float [4]; +float [] Euler = new float [3]; // psi, theta, phi + +int lf = 10; // 10 is '\n' in ASCII +byte[] inBuffer = new byte[22]; // this is the number of chars on each line from the Arduino (including /r/n) + +PFont font; +final int VIEW_SIZE_X = 800, VIEW_SIZE_Y = 600; + +int burst = 32, count = 0; + +void myDelay(int time) { + try { + Thread.sleep(time); + } catch (InterruptedException e) { } +} + +void setup() +{ + size(VIEW_SIZE_X, VIEW_SIZE_Y, P3D); + myPort = new Serial(this, "/dev/ttyUSB9", 115200); + + // The font must be located in the sketch's "data" directory to load successfully + font = loadFont("CourierNew36.vlw"); + + println("Waiting IMU.."); + + myPort.clear(); + + while (myPort.available() == 0) { + myPort.write("v"); + myDelay(1000); + } + println(myPort.readStringUntil('\n')); + myPort.write("q" + char(burst)); + myPort.bufferUntil('\n'); +} + + +float decodeFloat(String inString) { + byte [] inData = new byte[4]; + + if(inString.length() == 8) { + inData[0] = (byte) unhex(inString.substring(0, 2)); + inData[1] = (byte) unhex(inString.substring(2, 4)); + inData[2] = (byte) unhex(inString.substring(4, 6)); + inData[3] = (byte) unhex(inString.substring(6, 8)); + } + + int intbits = (inData[3] << 24) | ((inData[2] & 0xff) << 16) | ((inData[1] & 0xff) << 8) | (inData[0] & 0xff); + return Float.intBitsToFloat(intbits); +} + + +void serialEvent(Serial p) { + if(p.available() >= 18) { + String inputString = p.readStringUntil('\n'); + //print(inputString); + if (inputString != null && inputString.length() > 0) { + String [] inputStringArr = split(inputString, ","); + if(inputStringArr.length >= 5) { // q1,q2,q3,q4,\r\n so we have 5 elements + q[0] = decodeFloat(inputStringArr[0]); + q[1] = decodeFloat(inputStringArr[1]); + q[2] = decodeFloat(inputStringArr[2]); + q[3] = decodeFloat(inputStringArr[3]); + } + } + count = count + 1; + if(burst == count) { // ask more data when burst completed + p.write("q" + char(burst)); + count = 0; + } + } +} + + + +void buildBoxShape() { + //box(60, 10, 40); + noStroke(); + beginShape(QUADS); + + //Z+ (to the drawing area) + fill(#00ff00); + vertex(-30, -5, 20); + vertex(30, -5, 20); + vertex(30, 5, 20); + vertex(-30, 5, 20); + + //Z- + fill(#0000ff); + vertex(-30, -5, -20); + vertex(30, -5, -20); + vertex(30, 5, -20); + vertex(-30, 5, -20); + + //X- + fill(#ff0000); + vertex(-30, -5, -20); + vertex(-30, -5, 20); + vertex(-30, 5, 20); + vertex(-30, 5, -20); + + //X+ + fill(#ffff00); + vertex(30, -5, -20); + vertex(30, -5, 20); + vertex(30, 5, 20); + vertex(30, 5, -20); + + //Y- + fill(#ff00ff); + vertex(-30, -5, -20); + vertex(30, -5, -20); + vertex(30, -5, 20); + vertex(-30, -5, 20); + + //Y+ + fill(#00ffff); + vertex(-30, 5, -20); + vertex(30, 5, -20); + vertex(30, 5, 20); + vertex(-30, 5, 20); + + endShape(); +} + + +void drawcompass(float heading, int circlex, int circley, int circlediameter) { + noStroke(); + ellipse(circlex, circley, circlediameter, circlediameter); + fill(#ff0000); + ellipse(circlex, circley, circlediameter/20, circlediameter/20); + stroke(#ff0000); + strokeWeight(4); + line(circlex, circley, circlex - circlediameter/2 * sin(-heading), circley - circlediameter/2 * cos(-heading)); + noStroke(); + fill(#ffffff); + textAlign(CENTER, BOTTOM); + text("N", circlex, circley - circlediameter/2 - 10); + textAlign(CENTER, TOP); + text("S", circlex, circley + circlediameter/2 + 10); + textAlign(RIGHT, CENTER); + text("W", circlex - circlediameter/2 - 10, circley); + textAlign(LEFT, CENTER); + text("E", circlex + circlediameter/2 + 10, circley); +} + + +void drawAngle(float angle, int circlex, int circley, int circlediameter, String title) { + angle = angle + PI/2; + + noStroke(); + ellipse(circlex, circley, circlediameter, circlediameter); + fill(#ff0000); + strokeWeight(4); + stroke(#ff0000); + line(circlex - circlediameter/2 * sin(angle), circley - circlediameter/2 * cos(angle), circlex + circlediameter/2 * sin(angle), circley + circlediameter/2 * cos(angle)); + noStroke(); + fill(#ffffff); + textAlign(CENTER, BOTTOM); + text(title, circlex, circley - circlediameter/2 - 30); +} + +void draw() { + + quaternionToYawPitchRoll(q, Euler); + + background(#000000); + fill(#ffffff); + + textFont(font, 20); + //float temp_decoded = 35.0 + ((float) (temp + 13200)) / 280; + //text("temp:\n" + temp_decoded + " C", 350, 250); + textAlign(LEFT, TOP); + text("Q:\n" + q[0] + "\n" + q[1] + "\n" + q[2] + "\n" + q[3], 20, 10); + text("Euler Angles:\nYaw (psi) : " + degrees(Euler[0]) + "\nPitch (theta): " + degrees(Euler[1]) + "\nRoll (phi) : " + degrees(Euler[2]), 200, 10); + + drawcompass(Euler[0], VIEW_SIZE_X/2 - 250, VIEW_SIZE_Y/2, 200); + drawAngle(Euler[1], VIEW_SIZE_X/2, VIEW_SIZE_Y/2, 200, "Pitch:"); + drawAngle(Euler[2], VIEW_SIZE_X/2 + 250, VIEW_SIZE_Y/2, 200, "Roll:"); +} + + +void quaternionToYawPitchRoll(float [] q, float [] ypr) { + float gx, gy, gz; // estimated gravity direction + + gx = 2 * (q[1]*q[3] - q[0]*q[2]); + gy = 2 * (q[0]*q[1] + q[2]*q[3]); + gz = q[0]*q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3]; + + ypr[0] = atan2(2 * q[1] * q[2] - 2 * q[0] * q[3], 2 * q[0]*q[0] + 2 * q[1] * q[1] - 1); + ypr[1] = atan2(gx, sqrt(gy*gy + gz*gz)); + ypr[2] = atan2(gy, sqrt(gx*gx + gz*gz)); +} + + diff --git a/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/LICENSE.txt b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/LICENSE.txt new file mode 100644 index 0000000000..94a9ed024d --- /dev/null +++ b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/data/CourierNew36.vlw b/src/modules/attitude_estimator_so3_comp/visualization_code/FreeIMU_yaw_pitch_roll/data/CourierNew36.vlw new file mode 100644 index 0000000000000000000000000000000000000000..904771486a1a6d241fb5184282eb99780f730615 GIT binary patch literal 114920 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 p1I#39Op8e4s4-Q(8grS&7FzR}3|8Ks5wrTh1g$ attitude_estimator_so3_comp start -d /dev/ttyS1 -b 115200 + +This visualization code can be executed by Processing. + Download : http://www.processing.org/download/ + +The visualization code works with Processing version 1.5.1.