3D Robotics

ArduPlane home page




Convert any RC airplane into a fully-autonomous UAV!
Just add the APM 2 autopilot to any RC aircraft and it becomes a fully-programmable flying robot with a powerful ground station and Mission Planner.  


Features include:

  • Return to Launch with a flick of your RC toggle switch or a mouse click in the graphical Ground Station
  • Unlimited 3D GPS waypoints
  • Built-in camera control
  • Fully-scriptable missions
  • One-click software load, and easy point-and-click configuration in the powerful Mission Planner. NO programming required!
  • Replay recorded missions and analyze all the data with a graphing interface
  • Supports two-way telemetry with Xbee wireless modules. 
  • Point-and-click waypoint entry or real-time mission commands while the UAV is in the air
  • Fly with a joystick or gamepad via your PC--no need for RC control!
  • Built-in failsafe will bring your aircraft home in the case of radio loss


All instructions and software are here.






APM 2 is an open source, Arduino-compatible, pro-quality autopilot. It is the most advanced IMU-based open source autopilot available today, and provides an entire UAV control system with scriptable missions with 3D waypoints, in-flight uploading of commands and powerful ground station software. 


APM 2 supports any kind of of vehicle with a one-click change of code. Available code include ArduPlane (fixed wing), ArduCopter (rotary wing), ArduRover (ground vehicles) and more.


Everything you need to create an ArduPlane UAV:


APM 2.5 autopilot with GPS ($179)

[Optional] Telemetry kit ($75).



You'll also need a at least a five-channel RC radio setup, a soldering iron, a mini USB cable and of course something that flies!3689354440?profile=original (We're partial to the SkyFun delta wing (right) and
Bixlee 2   powered glider (left) or its equivalents ourselves).






Source code/firmware

Note: ArduPilot Mega requires no programming, but it's open source and you're welcome to modify it if you'd like. If you are going to play with the code, you can use the free Arduino IDE to edit and upload the code to the ArduPilot board.



E-mail me when people leave their comments –

You need to be a member of diydrones to add comments!

Join diydrones


  • I have problem with my UBLOX GPS. I bought it from diyrones with the ardupilot ready.

    I'm using v1.03 alpha code but i can't find the GPS_UBLOX.pde in the folder. Do i need this GPS_UBLOX.pde so my GPS will work? I'm guessing is it the USB port do not provide enough current?
  • Developer
    @Tim - You could try building an EMI shield for the APM. However, if you're radiating that hard from your ESC/power system, chances are that you'll be upsetting your receiver too. In your shoes, I'd want to get to the root of the issue and work out why the ESC is radiating so hard.
  • Thanks Dave. Great explanation.
  • @Michael - Thank you for the info.

    To clarify, I held a large PCB (computer motherboard) in between the ESC and the aircraft. The motherboard appeared to shield the APM from the ESC and eliminated most of the drift in the servos. Also, the drift is always in the same direction. The servos are not "twitching."

    Do you have any shielding ideas that I could apply either to the ESC or the APM that might help?
  • Developer
    @Tim - The accelerometer and gyro sensors are sensitive MEMS devices. If your ESC/motor setup is radiating significantly, either broadcast RF energy or strong magnetic currents you may induce false readings.

    I couldn't quite visualise your test setup (e.g. what you meant by "thick piece of material"); a picture might help, but in general you'll want to keep the autopilot as far away from all of your high-power circuitry as possible.
  • I have a weird thing happening, and I appreciate any insight that anyone can give.

    On one of the testbeds I am using to test the APM, I am using a pretty heavy duty, high voltage speed controller. It appears that the speed controller is causing the the APM to sense motion (even though the aircraft is stationary and on the bench) and counteract with significant movement on the servos. This is happening whenever I throttle up the motor.

    I was able to isolate the speed controller by holding the speed controller in my hand away from the aircraft and placing a thick piece of material between it and the APM. This causes the drift in the servos to almost completely go away.

    Also, I am not running the throttle through the APM. I am going directly from the radio receiver to the speed controller.

    Why would my speed controller be causing interference with the APM?
  • Chris and Michael, thank you for the info about upgrading to Arduino 0019. That solved the compiliation error relating to the stream.h library.
  • 3D Robotics
    Hoopty: As Jason mentioned, please don't use the latest code from the SVN until we release a public beta zip file at the end of the month. We're moving things around and it's in an unstable state. If you want to mess around with the code while you're waiting, please use an older version
  • yes I am here again. I have just created a new sketchbook directory since the old sketchbook directory seems to have been corrupted by a download. Every time I compile I get some variation of what is seen below. I went to the manual and looked for compilation errors. The manual refers me to a ardupilot 2.x compilation error site. Most of these suggestions will confuse people b y telling them to select

    "3.If you have the older ATmega168 board did you select "Arduino Diecimila" as the board in the Arduino Tools menu? If you have the newer ATmega328 board, did you select "Arduino Duemilanova w/ATmega328"?"

    I dont think it is me this time ;-) Library 533 Ardupilot 908

    ArduPilotMega.cpp:6147:1: error: unterminated #if
    ArduPilotMega:93: error: invalid conversion from 'const char*' to 'char'
    ArduPilotMega.cpp: In function 'void update_GPS()':
    ArduPilotMega:699: error: 'ALTITUDE_MIX' was not declared in this scope
    ArduPilotMega.cpp: In function 'void read_user_configs()':
    EEPROM:232: error: 'flight_mode_channel' was not declared in this scope
    EEPROM:233: error: 'auto_trim' was not declared in this scope
    EEPROM:234: error: invalid conversion from 'int16_t*' to 'const uint16_t*'
    EEPROM:234: error: initializing argument 1 of 'uint16_t eeprom_read_word(const uint16_t*)'
    ArduPilotMega.cpp: In function 'void save_user_configs()':
    EEPROM:254: error: 'flight_mode_channel' was not declared in this scope
    GCS_Ardupilot:0: error: 'auto_trim' was not declared in this scope
    ArduPilotMega.cpp: In function 'byte readSwitch()':
    control_modes:45: error: 'flight_mode_channel' was not declared in this scope
    ArduPilotMega.cpp: In function 'void init_ardupilot()':
    system:145: error: 'flight_mode_channel' was not declared in this scope
    ArduPilotMega.cpp: In function 'void set_mode(byte)':
    system:236: error: 'auto_trim' was not declared in this scope
  • Take a look at the code in control_modes.pde - routines read_control_switch and readSwitch should help you understand. You need to figure out what the pulse width settings you can generate with your transmitter - maybe the gear or flaps or aux switches and once you know that (using the DEBUG_SYSTEM==1 setting), you can change the header file (config.h) so that you have modes that you want - I just want FlyByWIreA and AUTO to start with (in addition to hardware MANUAL which is > 1750)
This reply was deleted.