User:Earthpatrol
Overview
Developing autonomous capabilities for HooperFly using the Lisa MX autopilot from 1BitSquared in tandem with PaparazziUAV.
Frames & Components
The collection of HooperFly frames configured to fly with Paparazzi.
HooperFly RacerPEX : Azul
- Frame: HooperFly RacerPEX
- Autopilot: 1BitSquared Lisa/MX
- GPS: UBLOX LEA-6H GPS Module w/Built-in Antenna
- ESCs: HobbyKing 30A Blue Series (flashed with SimonK Firmware)
- Motors: RCTimer 2830-14 750k Brushless
- Props: HobbyKing 10x4.5 Green SlowFly
- Receiver: OrangeRx R110XL 2.4Ghz DSMX Satellite Receiver (long antenna version)
- Telemetry Radios: Xbee 802.15.4 Low-Power Module w/ Wire Antenna
HooperFly RacerPEX : Verde
- Frame: HooperFly RacerPEX
- Autopilot: 1BitSquared Lisa/MX
- GPS: UBLOX LEA-6H GPS Module w/Built-in Antenna
- ESCs: HobbyKing 30A Afro Series (default with SimonK Firmware)
- Motors: RCTimer 2830-14 750k Brushless
- Props: HobbyKing 10x4.5 Blue SlowFly
- Receiver: OrangeRx R110XL 2.4Ghz DSMX Satellite Receiver (long antenna version)
- Telemetry Radios: Xbee 802.15.4 Low-Power Module w/ Wire Antenna
HooperFly TeensyFly Quad
- Frame: HooperFly TeensyFly Quad
- Autopilot: 1BitSquared Lisa/MX
- GPS: UBLOX LEA-6H GPS Module w/Built-in Antenna
- ESCs: RCTimer ESC12A SimonK Firmware
- UBEC: TURNIGY 3A UBEC w/ Noise Reduction
- Motors: T-Motor MN1804 2400kv Brushless
- Props: GemFan 5x3 Propellers
- Receiver: OrangeRx R110XL 2.4Ghz DSMX Satellite Receiver (long antenna version)
- Telemetry Radios: Xbee 802.15.4 Low-Power Module w/ Wire Antenna
HooperFly TeensyFly Hexa
- Frame: HooperFly TeensyFly Hexa
- Autopilot: 1BitSquared Lisa/MX
- GPS: UBLOX LEA-6H GPS Module w/Built-in Antenna
- ESCs: RCTimer ESC12A SimonK Firmware
- UBEC: TURNIGY 3A UBEC w/ Noise Reduction
- Motors: RCTimer SL1806/2300KV CW CCW Brushless
- Props: GemFan 5x3 Propellers
- Receiver: OrangeRx R110XL 2.4Ghz DSMX Satellite Receiver (long antenna version)
- Telemetry Radios: Xbee 802.15.4 Low-Power Module w/ Wire Antenna
Frame/Component Test Bench : MultiWii FC & DSM2 Receiver
Each frame and associated components(motors/escs/wiring harness) are tested for functionality using a MultiWii FC and DSM2 receiver prior to the Lisa/MX autopilot integration.
Flight Preparation
Airframes: HooperFly TeensyFly and RacerPEX
Attempting to use PaparazziUAV to fly four HooperFly frames in a synchronized autonomous fashion.
Airframe Configuration
Motor Layout Diagrams: Quad, Hexa, Octo
Motor position and rotation diagrams for "x" and "+" configurations of HooperFly quads, hexa, and octocopters. The top row consists of the "x" configuration frames and the bottom row contains the "+" configurations. Odd numbered motors(1, 3, 5, 7), blue in color, rotate clockwise. Even numbered motors(2, 4, 6, 8), green in color, rotate counter-clockwise.
All HooperFly airframe configuration files are located in the directory:
$PAPARAZZI_HOME/conf/airframes/HooperFly
Airframe | File |
---|---|
TeensyFly Quad | teensyfly_quad_lisa_mx_20.xml |
TeensyFly Hexa | teensyfly_hexa_lisa_mx_20.xml |
RacerPEX Quad | racerpex_quad_lisa_mx_20.xml |
RacerPEX Hexa | racerpex_hexa_lisa_mx_20.xml |
RacerPEX Octo | racerpex_octo_lisa_mx_20.xml |
JSBSim Aircraft Configuration
JSBSim defines a "BODY" frame with the following cartesian coordinate system to quantify propulsion forces:
- Top Left Quadrant (e.g.: NW, FL) -, -
- Top Right Quadrant (e.g.: NE, FR) -, +
- Bottom Right Quadrant (e.g.: SE, BR) +, +
- Bottom Left Quadrant (e.g.: SW, BL) +, -
Reference the JSBSim Documentation for a discussion about the STRUCTURAL vs. BODY frame as well as details related to each section of a jsbsim configuration file.
All HooperFly JSBSim aircraft configuration files are located in the directory:
$PAPARAZZI_HOME/conf/simulator/jsbsim/aircraft/HooperFly
Airframe | File |
---|---|
TeensyFly Quad | teensyfly_quad.xml |
TeensyFly Hexa | teensyfly_hexa.xml |
RacerPEX Quad | racerpex_quad.xml |
RacerPEX Hexa | racerpex_hexa.xml |
RacerPEX Octo | racerpex_octo.xml |
Telemetry - 2.4Ghz Xbee Radios
Radio Setup
- Dowloaded and installed XCTU - Next generation configuration platform for XBee
- Solder instructions for the XBee modem adapter boards
- Telemetry radios configuration instructions
- Telemetry configuration definition
- Data sheet
Links
Transmitter - 2.4Ghz DSM2/DSMX Compatible
For this project, a Spektrum DX6i transmitter is used for the RC link.
Airframe Radio Section
Define the roles of the "flap" and "gear" switch for the transmitter. In this example, the "flap" toggle is used for the radio mode and the "gear" toggle as the kill switch.
<subsystem name="radio_control" type="spektrum"> <define name="RADIO_MODE" value="RADIO_FLAP"/> <define name="RADIO_KILL_SWITCH" value="RADIO_GEAR"/> <configure name="USE_SECONDARY_SPEKTRUM_RECEIVER" value="1"/> </subsystem>
Deriving 3-State Behavior with Two Toggle Switches
The Spektrum DX6i does not have a 3-state toggle switch. A little bit of "mixing magic" between two toggle switches is needed to express 3-state toggle switch behavior. Use the following setup for "Mix 1" to emulate a 3-state toggle switch using two toggle switches.
FLAP-> FLAP ACT RATE D -100% U 0% SW ELE D/R TRIM INH
Receiver - 2.4Ghz DSM2/DSMX Satellite
Wiring/Binding
The transmitter must bind using the DSM2 protocol only. Note: The DSMX protocol is not currently support in Paparazzi.
Links
Verify TX/RX Connection
- Lisa MX led 4 light on: red
- Select the PPM settings and display the TX/RX related messages using the message tool.
Autopilot - Lisa/MX
- Autopilot documentation
- Autopilot rotorcraft documentation
- Rotorcraft configuration definition blocks
- Mount to HooperFly RacerPEX along with GPS, Telemetry, and Receiver
Lisa MX Mounting Orientation
The default "front" of the Lisa MX controller is dependent on the placement of the IMU on the autopilot pcb board. This can differ between revisions of the autopilot. The PHI/THETA/PSI parameters, in the IMU section of the airframe definition file, are used to normalize the body to IMU placement.
File: conf/airframes/HooperFly/teensyfly_quad_lisa_mx_20.xml |
<section name="IMU" prefix="IMU_">
<define name="ACCEL_X_NEUTRAL" value="11"/>
<define name="ACCEL_Y_NEUTRAL" value="11"/>
<define name="ACCEL_Z_NEUTRAL" value="-25"/>
<!-- replace this with your own calibration -->
<define name="MAG_X_NEUTRAL" value="-179"/>
<define name="MAG_Y_NEUTRAL" value="-21"/>
<define name="MAG_Z_NEUTRAL" value="79"/>
<define name="MAG_X_SENS" value="4.17334785618" integer="16"/>
<define name="MAG_Y_SENS" value="3.98885954135" integer="16"/>
<define name="MAG_Z_SENS" value="4.40442339014" integer="16"/>
<define name="BODY_TO_IMU_PHI" value="0." unit="deg"/>
<define name="BODY_TO_IMU_THETA" value="0." unit="deg"/>
<define name="BODY_TO_IMU_PSI" value="0." unit="deg"/>
</section>
|
Command Line Loader Using Black Magic Probe(BMP)
The following command will upload firmware to the autopilot using the JTAG connected Black Magic Probe:
Syntax: make AIRCRAFT=<aircraft_name> ap.upload BMP_PORT=<bmp_device_id> Examples: make AIRCRAFT=Teensy_Fly_Quad ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1 make AIRCRAFT=Teensy_Fly_Hexa ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1
Add the clean_ac target prior to the ap.upload target to force a clean build and load:
Syntax: make AIRCRAFT=<aircraft_name> clean_ac ap.upload BMP_PORT=<bmp_device_id> Examples: make AIRCRAFT=Teensy_Fly_Quad clean_ac ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1 make AIRCRAFT=Teensy_Fly_Hexa clean_ac ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1
GPS - UBLOX LEA-6H
Links
Verify GPS Connection
- Lisa MX led 3 light on: green
- GPS unit leds active
Flight Testing
RC Transmitter Verification
With the propellers removed from the multirotor, verify throttle, roll, pitch and yaw functionality prior to initial flight tests as well as expected motor spin directions. The autopilot should be in manual flight mode during this verification process.
Airframe | Throttle | Yaw | Pitch | Roll | M1 | M2 | M3 | M4 | M5 | M6 |
---|---|---|---|---|---|---|---|---|---|---|
TeensyFly Quad | + | + | + | + | CW | CCW | CW | CCW | ||
TeensyFly Hexa | + | + | + | + | CW | CCW | CW | CCW | CW | CCW |
IMU Calibration
It is best to have a fully populated airframe with a working telemetry radio running on battery power for IMU calibration purposes. Be sure to remove the propellers from the motors before proceeding with IMU calibration. For a general overview reference: Calibration of an IMU.
Accelerometer
- Power up the flight controller/IMU circuitry on your aircraft with a functioning telemetry radio
- Start paparazzi
- Run the session that connects the ground station telemetry to the aircraft
- In the "Settings" tab for the aircraft select the "raw sensors" and commit
- Viewing sensor data in real-time (optional step)
- Open the "Messages" tool and select the "IMU_ACCEL_RAW"
- Open the "Real-Time Plotter" tool and reduce the "Update time" slider to the far left (smaller the value, the faster the update)
- Drag and drop the IMU_ACCEL_RAW fields "ax", "ay", and "az", from the Message window to the Real-Time Plotter window
- Stop the "server" process and restart to begin the capture of calibration related information
- Begin aircraft manipulations - "Flat/Flip/Edge Stepping Rotation"
- Place on a flat surface in the "normal" position, wait 10 seconds
- Flip aircraft top down on the flat surface, wait 10 seconds
- Hold aircraft on edge, perpendicular to the flat surface, wait 10 seconds
- Rotate craft 90 degrees on edge, still perpendicular to the flat surface, wait 10 seconds
- Rotate craft another 90 degrees on edge, still perpendicular to the flat surface, wait 10 seconds
- Rotate craft the final 90 degrees on edge, still perpendicular to the flat surface, wait 10 seconds
- Stop the "server" process to finish the data capture
From the command line, run the "calibrate.py" tool over the collected accelerometer sensor data
python ./sw/tools/calibration/calibrate.py -s ACCEL -p ./var/logs/15_02_18__18_19_04.data
Copy and paste the resulting displayed IMU values into the IMU section of the aircraft configuration file
<define name="ACCEL_X_NEUTRAL" value="36"/> <define name="ACCEL_Y_NEUTRAL" value="15"/> <define name="ACCEL_Z_NEUTRAL" value="-108"/> <define name="ACCEL_X_SENS" value="4.86727226621" integer="16"/> <define name="ACCEL_Y_SENS" value="4.87315360311" integer="16"/> <define name="ACCEL_Z_SENS" value="4.85264051322" integer="16"/>
Save the aircraft configuration file and upload the new firmware
make AIRCRAFT=Teensy_Fly_Quad ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1
Magnetometer
- Power up the flight controller/IMU circuitry on your aircraft with a functioning telemetry radio
- Start paparazzi
- Run the session that connects the ground station telemetry to the aircraft
- In the "Settings" tab for the aircraft select the "raw sensors" and commit
- Viewing sensor data in real-time (optional step)
- Open the "Messages" tool and select the "IMU_MAG_RAW"
- Open the "Real-Time Plotter" tool and reduce the "Update time" slider to the far left (smaller the value, the faster the update)
- Drag and drop the IMU_MAG_RAW fields "mx", "my", and "mz", from the Message window to the Real-Time Plotter window
- Stop the "server" process and restart to begin the capture of calibration related information
- Begin aircraft manipulation "Global Bee Dance"
- Hold craft out from body and rotate frame about axis parallel to the ground while rotating your body slower than the craft is spinning
- Continue this motion until your body has completed 360 degrees of rotation
- Turn the craft 90 degrees on edge and repeat the process
- Hold craft out from body and rotate frame about axis parallel to the ground while rotating your body slower than the craft is spinning
- Continue this motion until your body has completed 360 degrees of rotation
- Stop the "server" process to finish the data capture
From the command line, run the "calibrate.py" tool over the collected magnetometer sensor data
python ./sw/tools/calibration/calibrate.py -s MAG -p ./var/logs/15_02_18__18_26_49.data
Copy and paste the resulting displayed MAG values into the MAG section of the aircraft configuration file
<define name="MAG_X_NEUTRAL" value="262"/> <define name="MAG_Y_NEUTRAL" value="-108"/> <define name="MAG_Z_NEUTRAL" value="43"/> <define name="MAG_X_SENS" value="3.26330433172" integer="16"/> <define name="MAG_Y_SENS" value="3.22600231318" integer="16"/> <define name="MAG_Z_SENS" value="3.76287398848" integer="16"/>
Save the aircraft configuration file and upload the new firmware
make AIRCRAFT=Teensy_Fly_Quad ap.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1
ESC/Actuator Setup
IMPORTANT: Remove propellers before proceeding with ESC/Actuator Setup
Flash Lisa/MX with Setup Firmware
- Start the Paparazzi Center and choose "setup_lisamx_20" as the aircraft
- Compile the "setup_actuators" target
- Connect the BMP including the serial line to UART3
- On the command line, flash the firmware using the following command:
make AIRCRAFT=setup_lisamx_20 setup_actuators.upload BMP_PORT=/dev/cu.usbmodemE2B9BDC1
Setup - Unified Power System
For autopilots and ESCs that are powered from a unified connection use the following steps:
In the Paparazzi Center, execute the "Setup Actuators Lisa/MX V2.0" session
- Unplug power (mine is one power connection for autopilot and motor controllers)
- Plug in power (the pwm outputs are not active until you commit a setting through the settings app)
- Set the first actuator output to 2000
- Submit with green check mark (you should hear all the esc beep)
- Set the first actuator output to 1000
- Submit with the green check mark (you will hear the first esc beep)
- Return to step 1 and repeat this procedure for each of the remaining actuators
Setup - Dual Power System
For autopilots and ESCs that are powered from separate connections use the following steps:
In the Paparazzi Center, execute the "Setup Actuators Lisa/MX V2.0" session
- Unplug all power
- Plugin autopilot power
- Set all actuators in the settings app to 2000
- Submit all actuators settings using the green check mark
- Plugin ESC power (all esc should beep)
- Set all actuators in the settings app to 1000
- Submit all actuators settings using the green check mark (for each submitted value the corresponding esc should beep)
- Setup of the actuators is complete
Resulting Setup
After doing this the 0 value for the esc is 1000 and max is 2000. The motor should not turn on before you give it less than 1065 making the 1100 setting in the airframe file is a good value to use for neutral (motors running at idle), 1000 for minimum (motors off) and 1900 for maximum throttle.
<servos driver="Pwm"> <servo name="FRONT_LEFT" no="0" min="1000" neutral="1100" max="1900"/> <servo name="FRONT_RIGHT" no="1" min="1000" neutral="1100" max="1900"/> <servo name="BACK_RIGHT" no="2" min="1000" neutral="1100" max="1900"/> <servo name="BACK_LEFT" no="3" min="1000" neutral="1100" max="1900"/> </servos>
PID Tuning
- Discuss using the interactive telemetry method of tuning
- Update and save values to the PID section of the airframe file
Manual Flight (ATT)
First flights are conducted using RC control only. Any issues related to normal/manual flight should be addressed before attempting more autonomous forms of flight.
- Program Lisa MX for manual flight mode: AP_MODE_ATTITUDE_DIRECT (a.k.a. ATT)
- GPS and Xbee Telemetry not required but are useful if mounted for monitoring flight characteristics with Paparazzi
- Note telemetry and GPS data while running manual test flights as a correlation exercise with respect to expected vs. observed data
- Verify all flight systems are stable, reliable and behaving as expected before attempting more advanced flight modes
Hybrid Flight (HOVER)
- TBP: Define a flight scenario for testing the HOVER mode of the autopilot
Autonomous Flight (NAV)
- Define a thoughtful flight plan with the appropriate safety features for limiting flyaway risk
- Simulate flight plan until satisfied with behaviors
- Program Lisa MX to include a full navigation flight mode: AP_MODE_NAV (a.k.a. NAV)
- TBD: Establish a set of pre-flight system checks
Paparazzi UAV Project Development and Compilation
Project Related
- Project Flow: Github Project Flow
- Project Pull Process: Creating Effective Pull Requests
- Project Software: Github
- Wiki: This Wiki
- Project Discussion: Gitter
Environment
OPAM
$ opam list Installed packages for 4.01.0: base-bigarray base Bigarray library distributed with the OCaml compiler base-threads base Threads library distributed with the OCaml compiler base-unix base Unix library distributed with the OCaml compiler camlp4 4.01.0 Camlp4 is a system for writing extensible parsers for programming language ivy 1.2.2 This OCaml-library interfaces the Ivy software bus C-library. lablgtk 2.18.2 OCaml interface to GTK+ ocamlfind 1.5.3 A library manager for OCaml ocamlnet 3.7.6 Internet protocols (http, cgi, email etc.) and helper data structures (mai xml-light 2.4 Xml-Light is a minimal XML parser & printer for OCaml $ opam switch system I system System compiler (4.02.0) 4.02.0 I 4.02.0 Official 4.02.0 release 4.01.0 C 4.01.0 Official 4.01.0 release -- -- 3.11.2 Official 3.11.2 release -- -- 3.12.1 Official 3.12.1 release -- -- 4.00.0 Official 4.00.0 release -- -- 4.00.1 Official 4.00.1 release $ opam switch 4.01.0 # To complete the configuration of OPAM, you need to run: eval `opam config env` $ eval `opam config env`
Command Line Tools
Ivyprobe
With the command line tool ivyprobe, you can see what is being sent over the IVY bus.
$ ivyprobe -help ivyprobe: illegal option -- h usage: ivyprobe [options] [regexps] -b bus defines the Ivy bus to which to connect to, defaults to 127:2010 -t triggers the timer test -n name changes the name of the agent, defaults to IVYPROBE -v prints the ivy relase number regexp is a Perl5 compatible regular expression (see ivyprobe(1) and pcrepattern(3) for more info use .help within ivyprobe -s bindcall active the interception of regexp's subscribing or unscribing -f regexfile read list of regexp's from file one by line -c msg1,msg2,msg3,... filter the regexp's not beginning with words
The following command will display all packages with all their content:
ivyprobe "(.*)"
You can constrain what ivyprobe displays by extending the regular expression for example, the following command will display raw accelerometer data that is being sent over the IVY bus
ivyprobe “[\d]+ IMU_ACCEL_RAW (.*)”
ivyprobe takes that regular expression and prints the match inside the (), by default it is only showing telemetry:*
Note: The packages/class names returned by ivyprobe can be used as input to the messages tool.
Messages
$ ./messages -help Usage: -b <ivy bus> Default is 224.255.255.255:2010 -c class name -help Display this list of options --help Display this list of options
GCS
$ ./gcs -help Usage: -auto_ortho IGN tiles path -b <ivy bus> Default is 224.255.255.255:2010 -center Initial map center (e.g. 'WGS84 43.605 1.443') -center_ac Centers the map on any new A/C -edit Flight plan editor -fullscreen Fullscreen window -maps_fill Automatically start loading background maps -maps_zoom Background maps zoomlevel (default: 20, min: 18, max: 22) -ign IGN tiles path -lambertIIe Switch to LambertIIe projection -layout <XML layout specification> GUI layout. Default: horizontal.xml -m Map XML description file -maximize Maximize window -mercator Switch to Mercator projection, default -mplayer Launch mplayer with the given argument as X plugin -no_alarm Disables alarm page -maps_no_http Switch off downloading of maps, always use cached maps -ortho IGN tiles path -osm Use OpenStreetMap database (default is Google) -ms Use Microsoft maps database (default is Google) -particules Display particules -plugin External X application (launched with the id of the plugin window as argument) -ref Geographic ref (e.g. 'WGS84 43.605 1.443') -speech Enable vocal messages -srtm Enable SRTM elevation display -track_size Default track length (500) -utm Switch to UTM local projection -wid <window id> Id of an existing window to be attached to -zoom Initial zoom -auto_hide_fp Automatically hide flight plans of unselected aircraft -help Display this list of options --help Display this list of options
Link
$ ./link --help Usage: -aerocomm Set serial Aerocomm data mode -audio Listen a modulated audio signal on <port>. Sets <port> to /dev/dsp (the -d option must used after this one if needed) -b <ivy bus> Default is 224.255.255.255:2010 -d <port> Default is /dev/ttyUSB0 -dtr Set serial DTR to false (deprecated) -fg Enable trafic statistics on standard output -noac_info Disables AC traffic info (uplink). -nouplink Disables the uplink (from the ground to the aircraft). -s <baudrate> Default is 9600 -hfc Enable UART hardware flow control (CTS/RTS) -local_timestamp Add local timestamp to messages sent over ivy -transport <transport> Available protocols are modem,pprz,pprz2 and xbee. Default is pprz -udp Listen a UDP connection on <udp_port> -udp_port <UDP port> Default is 4242 -udp_uplink_port <UDP uplink port> Default is 4243 -udp_port <UDP port> Default is 4242 -uplink Deprecated (now default) -xbee_addr <my_addr> (256) -xbee_retries <nb retries> (10) -xbee_868 Enables the 868 protocol -redlink Sets whether the link is a redundant link. Set this flag and the id flag to use multiple links -id Sets the link id. If multiple links are used, each must have a unique id. Default is 0 -help Display this list of options --help Display this list of options
Server
$ ./server --help Usage: -b Bus Default is 224.255.255.255:2010 -hostname <hostname> Set the address for the http server -http Send http: URLs (default is file:) -kml Enable KML file updating -kml_no_http KML without web server (local files only) -kml_port Port for KML files (default is 8889) -n Disable log -no_md5_check Disable safety matching of live and current configurations -replay_old_log Enable aircraft registering on PPRZ_MODE messages -help Display this list of options --help Display this list of options
Settings
$ ./settings --help Usage: -b <ivy bus> Default is 224.255.255.255:2010 -ac A/C name -help Display this list of options --help Display this list of options
Calibrate
$ python ./sw/tools/calibration/calibrate.py -help Usage: calibrate.py [options] log_filename.data Run calibrate.py --help to list the options. Options: -h, --help show this help message and exit -i AC_ID, --id=AC_ID aircraft id to use -s SENSOR, --sensor=SENSOR sensor to calibrate (ACCEL, MAG) -p, --plot Show resulting plots -a, --auto_threshold Try to automatically determine noise threshold -v, --verbose