Wednesday, November 5, 2014
APM Octocopter Build First Test Flight
Tuesday, September 16, 2014
108 km/h SplineNav with Arducopter 3.2
Monday, March 17, 2014
Wednesday, October 30, 2013
New SplineNav 0.3: Smoother Yaw, and Manual Yaw Override
After a few months of hard work, SplineNav 0.3 is now ready to fly! This SplineNav release started with the goal of simply reducing the yaw jitter issues of SplineNav 0.2, but in the end it turned into a major rewrite of the code.
New Features:
- Smoother Yaw: Updates x and y spline derivative calculations faster, in a separate loop, for a more precise yaw control. Uses a fast approximation of the atan2 function to compute the yaw angle from the spline derivative.
- Features yaw rate smoothing for much smoother video, avoiding the small yaw "jerk" at each waypoint.
- Allows manual override of yaw control, then takes back auto control of yaw if the pilot centers the stick when yaw is directed approximately in the direction of the spline curve.
- Now enters SplineNav mode smoothly, without an initial jerk.
- Uses it's own flight mode, so unlike SplineNav 0.2 it doesn't override your Circle mode. To use SplineNav 0.3, set one of your FLTMODE parameters to 14 in the Full Parameter List.
SplineNav Waypoints
![]() |
| Waypoints recorded during FPV flight and adjusted in Mission Planner |
The GPS track indicates it hit all the waypoints quite precisely, on each lap for a total of 3 laps (72 waypoints in total):
![]() |
| GPS track from dataflash log shows SplineNav hitting each waypoint precisely over 3 complete laps |
![]() |
| GPS flight profile from dataflash logs after 3 complete laps |
Hardware Used:
Autopilot: 3DR APM 2.6, with external compass/GPS module
Motors: T-Motor MT2216 KV800
Props: APC 11x4.7
Gimbal: WIND-1 two-axis brushless
Camera: GoPro Hero 3 Silver
Telemetry: 3DR 433 MHz
R/C: FlySky TH9X(ER9X FW) + 2.4GHz FrSky DJT module + V8R7-II rx
FPV: ImmersionRC 5.8GHz 600mA + FatShark Predator + SecurityCamera2000 CMQ1993X
Also: These mods for longer range FPV.
SplineNav 0.3 Firmware Installation:
- First make sure your quad copter is flying well with ArduCopter version 3.0.1, since SplineNav 0.3 is based on this firmware version.
- Go to https://github.com/mavbot/SplineNav, and click the "Download ZIP" link.
- In the special Ardupilot version of Arduino, go to File -> Preferences and set your sketch directory to the path of the "SplineNav-SplineNav-0.3" directory from the extracted zip archive.
- Restart Arduino, then choose File -> Sketchbook -> ArduCopter from the menu.
- From the ArduPilot menu, make sure your HAL Board is set correctly.
- Connect your copter's APM via USB, and from Arduino's Tools menu make sure the serial port is set correctly.
- Click the Upload arrow button and wait for the code to compile and upload to your APM.
- Set one of your FLTMODE parameters to 14 in Mission Planner's Full Parameter List, Set your waypoints (either with Mission Planner or with the channel 7 or 8 switch), then go fly!
Parameters:
WPNAV_SPEED: 1350 cm/s
This should make SplineNav go about 49 km/h on straight segments.
WPNAV_SPEED_UP: 1000 cm/s
WPNAV_SPEED_DN: 650 cm/s
WPNAV_LOIT_SPEED: 1500 cm/s
Should be set higher than WPNAV_SPEED.
WPNAV_ACCEL: 180 cm/s/s
Nice low value for a smooth steady start.
Also, the following parameters are #defines in the splinenav.h source code, and can be changed at compile time:
SPLINE_TENSION: 1.6
Higher tension splines curve more tightly at waypoints, but straighter in between waypoints. A tension value of 2 makes it a Catmull-Rom spline. We found that slightly lower tensions tend to give nice loose curves for smooth aerial video.
SPLINE_CURVE_ACCEL_MULTIPLE: 2.0
This allows for twice the max curve acceleration as set in the WPNAV_ACCEL parameter. Added this parameter to allow for smooth slow starts without making tight curves overly sluggish.
SPLINE_JERK: 200.0 cm/s/s/s
Jerk is the maximum rate that SplineNav increases or decreases acceleration as it flies the curve.
SPLINE_LOOP: true
This makes SplineNav loop the waypoints forever until you exit out into another mode.
Sunday, September 29, 2013
Longer Range FPV for Cheap
1. I replaced the 5.8 GHz clover leaf antenna on my FatShark goggles with a helical antenna (and learned to use my own head as an antenna tracker).
2. I boosted my 2.4 GHz radio control signal with a 2-Watt WiFi booster.
The Antenna
![]() |
| Cheap 5.8 GHz RHCP 7-turn helical antenna from BEVRC |
WiFi Signal Booster
This cheap 2-Watt WiFi signal booster works with any 2.4 GHz radio, just connect it between tx module and antenna with the included coax cable.
![]() |
| Cheap 2-Watt WiFi Signal Booster |
The WiFi signal booster came with a wall adapter for power. I cut the output cord off the wall adapter and soldered it to the outputs of a SkyRC 10-Amp BEC, which in turn is powered from the 3S transmitter LiPo. I installed the signal booster and BEC to the back of my FlySky TH9X radio using zip ties:
![]() |
| WiFi signal booster and BEC installed on TH9X radio |
Range Test
In order to test the FPV range, I took a flight up in the mountains. The quadcopter got 2.3 km away and 600 meters up from the launch point before its battery was half exhausted and I had to turn it back. But the video and RC control were still great at that distance, so I was unable to determine the absolute range of this setup. Enjoy the video recovered from the GoPro:
Other Hardware Used
Airframe: ArduPhantom (DJI Phantom case, stock ESC, props, and battery)
Motors: T-Motor MN2214 upgrade for DJI Phantom
Autopilot: 3DR APM 2.5 with ArduCopter 3.0.1 firmware
Gimbal: Hummer 2-axis brushless gimbal for DJI Phantom
Camera: GoPro Hero 3 Silver
GPS: 3DR ublox LEA-6H
Telemetry: 3DR 433 MHz
R/C: FlySky TH9X(ER9X FW) + 2.4GHz FrSky DJT module, V8R7-II rx
FPV: ImmersionRC 5.8GHz 600mA tx + CL antenna, FatShark Predator goggles
Ground station: Mavbot Finder
Friday, September 13, 2013
FPV Crash into Obstacle on RTL
This was the first time I've crashed while flying FPV. Crashes are usually caused by a series of mistakes, and this crash was no exception:
Mistake #1: Some of the hills around the flying area rose to at least 100 meters above the launch point, but I had the Return to Launch (RTL) minimum altitude set to only 50 meters above launch altitude. Note: I later realized that setting the RTL alt even higher wouldn't have helped anyway, because the current ArduCopter code foolishly limits RTL height to 80 meters).
Mistake #2: I flew behind the hill at such a low altitude that the forest cover on one of the hill's ridges came between me and the vehicle, thus scrambling my video signal (the 5.8GHz video is so high frequency that even vegetation can scramble the signal quite easily; whereas my RC control on 2.4GHz remained solid through the entire ordeal).
Mistake #3: Upon losing the video I did not back up or gain some altitude, but instead just kept going forward for a couple seconds, hoping video would come back. This just made the problem worse.
Mistake #4: When the video signal didn't come back, I switched into autopilot-controlled RTL mode, without gaining some altitude first. Thus the autopilot, already well above the set RTL minimum altitude, simply initiated a high speed beeline back towards the launch point...
RTL Code Change:
Hardware:
Airframe: ArduPhantom (DJI Phantom case, stock ESC, props, and battery)
Motors: T-Motor MN2214 upgrade for DJI Phantom
Autopilot: 3DR APM 2.5
Gimbal: Hummer 2-axis brushless gimbal for DJI Phantom and GoPro 3
Camera: GoPro Hero 3 Silver
GPS: 3DR ublox LEA-6H
Telemetry: 3DR 433 MHz
R/C: FlySky TH9X(ER9X FW) + 2.4GHz FrSky DJT module + 2W WiFi booster, V8R7-II rx
FPV: ImmersionRC 5.8GHz 600mA tx + CL antenna, FatShark Predator goggles + 11db patch antenna
Ground station: Mavbot Finder (first time actually used to find lost aircraft!)
Friday, July 19, 2013
New SplineNav Version 0.2 on a 63 km/h Tour of Chinese Lotus Pond
I've now finished coding up SplineNav version 0.2. It's almost a complete rewrite from version 0.1. Besides flying smoother and using processor resources more efficiently, it now restricts maximum speed to prevent lag. For example, if you're flying fast into a strong headwind, then altitude may get low due to insufficient downward thrust, and position may also start lagging target, resulting in corner cutting. SplineNav now tracks this, and continuously and smoothly adjusts target speed to allow the copter to keep up without major altitude loss. So it's now completely safe to crank up the speed settings and fly SplineNav really fast.
SplineNav Waypoints
I collected the waypoints for this video while flying FPV, and flipping the channel 8 switch at each point I wanted to record. Then I loaded the waypoints into Mission Planner, and made some small adjustments (Figure 1). I also checked them by flying SplineNav at low speed first, and watching via FPV how close it got to the trees.
![]() |
| Figure 1: Waypoints recorded during FPV flight and adjusted in Mission Planner |
After the low speed check I felt comfortable to fly it at max speed, although it was still very nerve racking, because it was zipping by a few meters from those weeping willow trees at about 60 km/h. I'm not sure I could have reacted in time to prevent my copter going to the bottom of the pond had a GPS error caused it to brush the willow branches and careen out of control!
Flight Log Track
After the flight, I loaded the log data into Google Earth and exported a KML file to overlay on the map, using Mission Planner's handy KML Overlay feature (Figure 2).
![]() |
| Figure 2: Purple track is GPS recorded track during SplineNav flight |
As you can see, the GPS track indicates it hit all the waypoints very precisely, expect it slightly missed waypoint 8, which I attribute to the copter having just flown right next to a large building which could have caused GPS signal reflections.
The waypoints had a range of altitudes set, for a more interesting flight. Here is the flight profile from the data logs, imported into Google Earth:
![]() |
| Altitude profile generated in Google Earth from flight log data |
Hardware Used
Airframe: ArduPhantom (DJI Phantom case, stock motors, ESC, and battery)
Autopilot: 3DR APM 2.5
Gimbal: Hummer 2-axis brushless gimbal for DJI Phantom and GoPro 3
Camera: GoPro Hero 3 Silver
GPS: 3DR ublox LEA-6H
Telemetry: 3DR 433 MHz
R/C: FlySky TH9X(ER9X FW) + 2.4GHz FrSky DJT module + V8R7-II rx
FPV: ImmersionRC 5.8GHz 600mA + FatShark Predator goggles
Software
This test was done using the excellent new ArduCopter 3.0.1 release code, that I then modified to include and call the SplineNav code.
The latest SplineNav code, already integrated into my own branch of ArduCopter 3.0.1, is available here: https://github.com/mavbot/SplineNav
SplineNav 0.2 Firmware Installation
Warning: Only install SplineNav if your copter is already working well with ArduCopter Version 3.0.1, and if you're experienced enough to test fly it safely.
1. Download the code with this link: https://github.com/mavbot/SplineNav/archive/SplineNav-0.2.zip and extract the zip file.
2. In the special Ardupilot version of Arduino, go to File -> Preferences and set your sketch directory to the path of the "SplineNav-SplineNav-0.2" directory from the extracted zip archive.
3. Restart Arduino, and choose File -> Sketchbook -> ArduCopter from the menu.
4. From the ArduPilot menu, make sure your HAL Board is set correctly.
5. Connect your copter's APM via USB, and from the Tools menu make sure the serial port is set correctly.
6. Click the Upload arrow button and wait for the code to compile and upload to your APM.
7. Set your waypoints (either with Mission planner or with the channel 7 or 8 switch), then go fly!
Note: Since there is not yet any SPLINENAV mode in Mission Planner, SplineNav for now just commandeers CIRCLE mode. So switch to CIRCLE mode on your transmitter when you're ready to fly your waypoints with SplineNav.
Parameters
Here are the speed and acceleration parameters I used for this video (set in Mission Planner):
WPNAV_SPEED: 2000 cm/s
My copter can't fly 2000 cm/s, but SplineNav correctly kept the speed adjusted to what my copter can actually handle, and according to the GPS data it reached a maximum velocity of 1760 cm/s (63 km/hour).
WPNAV_SPEED_UP: 350 cm/s
WPNAV_SPEED_DN: 450 cm/s
WPNAV_LOIT_SPEED: 2500 cm/s
WPNAV_ACCEL: 500 cm/s/s
Also, the following parameters are #defines in the splinenav.h source code, but hopefully they will eventually become configurable parameters:
SPLINE_TENSION: 1.4
Higher tension splines curve more tightly at waypoints, but straighter in between waypoints. A tension value of 2 makes it a Catmull-Rom spline. I found that slightly lower tensions tend to give nice loose curves for smooth aerial video.
SPLINE_JERK: 500.0 cm/s/s/s
Jerk is the maximum rate that SplineNav increases or decreases acceleration as it flies the curve.
SPLINE_LOOP: true
This makes SplineNav loop the waypoints forever until you exit out into another mode.
Saturday, June 15, 2013
Coding: Flying 3D Spline Curves between Waypoints with ArduCopter 3.0
![]() |
| Figure 1: Mission Planner waypoints and telemetry track after 3 spline circuits |
![]() |
| Figure 2: Autopilot logged track after 3 spline circuits |
For this video I wanted a slightly more wild ride, so I increased my WPNAV_SPEED_DN to 250 cm/s, and WPNAV_SPEED_UP to 350 cm/s. I left WPNAV_SPEED at 500 cm/s for now, but will try increasing it later. Figure 2 shows the 3D track in Google Earth. If you reduce these UP/DN speed parameters you will get the same 3D track for these waypoints, but at the steep up and down locations SplineNav will reduce its travel speed along the 3D curve.
Video
I shot this SplineNav demonstration video with my ArduPhantom. The GoPro is mounted on a Hummer 2-axis brushless gimbal designed for DJI Phantom.Source Code
Here's the source code for developers and brave testers to test and suggest fixes and improvements. There's a .PDE file and an .H file, both of which go in your ArduCopter 3.0 sketch folder:SplineNav.h
SplineNav.pde
Follow the directions in the SplineNav Readme to make the ArduCopter 3.0 code call SplineNav. Then compile with the special ArduPilot version of the Arduino IDE, and upload to your copter. Set your waypoints with Mission Planner, or with the channel 7 switch, and go test out SplineNav.
Warnings
Make sure your loiter is rock solid before you test, because SplineNav relies on the loiter controller. Also, the first time you test a new set of waypoints, you should probably keep WPNAV_SPEED low, perhaps just 200 cm/s or so. That way you'll have enough time to take over control in case the spline curve intersects any solid objects!Tuesday, April 9, 2013
Build Log: "ArduPhantom" APM ArduCopter in a DJI Phantom Airframe
![]() |
| Figure 1: DJI Phantom Night Flying |
I also wanted a very small, lightweight, and extremely rugged FPV platform that I could carry in my backpack when I go hiking. The DJI Phantom air frame seems perfect for this, as the propellers are extremely easy and fast to remove, and once removed the rest of the aircraft can be stuffed in my backpack as is, and is sturdy enough to not worry about it being damaged during the trip.
Materials
Power System Wiring
There is not much space inside the case for a lot of wiring and connectors, so I just cut off the XT60 connector from the output side of the APM power module, and soldered the connection directly, insulating with heat shrink of course. If you plan to use an internal battery, make sure the wiring doesn't cross over the central area where the battery goes, because it will snag on the battery when you take it in or out, and it's already a fairly tight fit for the battery as is.
Also, be sure to keep all the wiring as low in the bottom of the case as possible, so the magnetic fields from high-current wires will not interfere with the autopilot's magnetometer (Figure 2).
![]() |
| Figure 4: APM mounted on LDPE food lid greatly reduces vibration |
LED Connection
![]() |
| Figure 5: Armed and GPS fix LEDs visible through tailight port |
Final Assembly
![]() |
| Figure 6: Ready to Fly |
Flight Testing
It flies very nicely, even in auto modes. The main issue is shakiness and vibration of the recorded video. Hopefully I can reduce that with some tuning, better camera mounting, and perhaps stiffer props.

















