Running an autopilot on Android


Here's a fun little project I've been working on for ~6 months now.  It started when I looked at my phone and thought this has everything needed for an autopilot - 3-axis gyros, accelerometers, magnetometers, GPS, fast CPU, plus a nice big touch screen and more wireless modems than you can point a stick at.  The only problems are (1) it's a multitasking operating system, not real-time; and (2) needs extra hardware to drive servos and switch between manual and auto control.

I solved the first problem by buying a used Samsung Nexus S with a faulty screen (discolouration) on ebay for $80, installing a stable, bare-bones version of android 2.3, rooting it, and disabling CPU throttling.  50Hz servo update loops and 110Hz sampling loops are no problem - timing is reliable and it only uses ~5% CPU (using floating point everywhere and some bloaty object-oriented code). 

Second problem was solved like this:

3689468686?profile=originalThe Ardupilot legacy board doesn't actually run any ardupilot code - it's just a convenient and cheap way to get an Arduino and a multiplexer.  It just takes servo commands from the phone and uses the Arduino servo library code to drive the servos.  Most of its time is spent sampling the baro sensor.  It samples at around 20kHz, and using 4096x oversampling I get 4 16-bit samples per second with an altitude resolution of around 15cm and noise of about +/- 30cm.  The bluetooth link looks scary but works fine.  It's done about 10 hours of autonomous flight with no issues, and only drops out if I take the phone at least 10 meters away from the plane. 

Waypoints are selected on a google map interface:

3689468765?profile=originalGains etc can be easily adjusted:

And, of course, a flight video:

Behind the scenes it runs the DCM + complimentary filter code.  I've added some extra features over the last few months:

Autonomous thermaling (works well in warmer weather)

Hardware in loop simulation with X-Plane and MS FSX over WiFi

Wind and airspeed estimation

Dead reckoning (using gyros/magnetometer and estimated speed - can work through short GPS dropouts)

Android-to-Android Telemetry over WiFi or mobile internet (later requires sim with public IP - hard to find)

Features I plan to add:

Waypoint addition/modification from Android groundstation (if/when I can convince a telco to give me public IPs)

Fly-by-wire(less) over mobile internet (ditto)

Photo/video taking at specified locations with onboard camera (will require mounting under wing)

I'll post about some of these over the next few weeks.

E-mail me when people leave their comments –

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

Join diydrones


  • Distributor

    Not actually related, but what is that plane you use?

  • @Chris: I plan on releasing the code at some point, but want to clean it up a bit first.  There's some big chunks of code with no comments and some "workyouf$&$#&%" variable names floating around in there.

    @Savraj - Could use a server, but direct comms would be much simpler and more elegant... will go that way if I have to though.

  • But how do you pass the time waiting for your drone to come back if your phone is in the air?

  • True I guess :) I just have a somewhat strange love for using ssh for everything I can :)

  • you could also poll a url... but that's totally a hack. ;)

  • You could also use a reverse ssh tunnel through a publicly accessible server.

  • why do you need public IPs from the telco? You can send a 'push notification' to your app from a server.  On iOS it's the push notification API, not sure what it is on Android but there's an equivalent.

  • 3D Robotics

    This is awesome! Is it going to be open source?

  • Impressive work!! Looks like it does more than Ardupilot does...

  • really cool.. great post and work. time to replace the screen on the old driod x

This reply was deleted.