-
Notifications
You must be signed in to change notification settings - Fork 119
04 Autonomous drone programming in Python
Please check our online course (slides or videos) to understand:
- how to connect to the flight controller
- what's the general software architecture
- how to use yocto or ubuntu or the linux OS of choice in a container
Here's a simple python script using the basic pymavlink wrapper to arm the motors for 3 seconds.
Arming the motors is the simplest action we can test to show everything is connected.
Note: we're using tcp:127.0.0.1:5760
to connect to the flight controller, as we'll do for all the following examples.
UNPLUG THE PROPELLERS BEFORE RUNNING THIS CODE. WE INSIST.
#!/usr/bin/python
from __future__ import print_function
import pymavlink.mavutil as mavutil
import sys
mav = mavutil.mavlink_connection('tcp:127.0.0.1:5760')
mav.wait_heartbeat()
mav.mav.command_long_send(mav.target_system, mav.target_component,
mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, 0, 1,
0, 0, 0, 0, 0, 0)
sleep(3)
mav.mav.command_long_send(mav.target_system, mav.target_component,
mavutil.mavlink.MAV_CMD_COMPONENT_ARM_DISARM, 0, 0,
0, 0, 0, 0, 0, 0)
It’s important to know the basics of MAVLINK, as it the base of all communications with the Flight Controllers. But coding frames with python-mavlink is not developer friendly. DroneKit, developed by 3D Robotics, is one of the friendly python abstractions available under Apache v2 Licence : python.dronekit.io To install on Intel Aero:
pip install dronekit
UNPLUG THE PROPELLERS BEFORE RUNNING THIS CODE. WE INSIST.
Here's the code, still arming the motors for 5 seconds:
#!/usr/bin/python
from dronekit import connect, VehicleMode, LocationGlobalRelative
import time
vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True)
print "Arming motors:"
vehicle.mode = VehicleMode("GUIDED")
vehicle.armed = True
while not vehicle.armed:
print " Waiting for arming to be finished"
time.sleep(1)
print "Keeping motors armed for 5s"
time.sleep(5)
print "Disarming"
vehicle.armed = False
On top of being a developer friendly layer on top of MAVLINK, MAVProxy was designed to bridge the gap between programming-only libraries like DroneKit and graphical-only tools like QGroundControl. Check: ardupilot.github.io/MAVProxy Some people use it on a remote computer to control the drone and have optional user interfaces to complex functions, but you an use on the drone itself for autonomous drone development. To install on Intel Aero:
pip install MAVProxy
UNPLUG THE PROPELLERS BEFORE RUNNING THIS CODE. WE INSIST.
Launch the shell
mavproxy.py --master=tcp:127.0.0.1:5760 --quadcopter
And type a few commands to arm/disarm the motors:
arm throttle
disarm
bat
Please refer to the module D2 - Software - Networked Drone
of the course for more information about the following codes.
UNPLUG THE PROPELLERS BEFORE RUNNING THIS CODE. WE INSIST.
The Python websocket API on Intel Aero:
pip install websocket-server
A WebSocket client in your browser, to simulate a web call:
Optionally, a Library on your development station to send the request from a script instead of your browser:
pip install websocket-client
And here's the server code running on Intel Aero:
from websocket_server import WebsocketServer
import re
from dronekit import connect, VehicleMode, LocationGlobalRelative
import time
vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True)
vehicle.mode = VehicleMode("GUIDED")
print("Flight Controller Connected")
def new_client(client, server):
print("Client connected")
server.send_message_to_all("Client connected")
def message_received(client, server, message):
if len(message) > 200:
message = message[:200]+'..'
print("Arming motors")
vehicle.armed = True
while not vehicle.armed:
time.sleep(1)
time.sleep(5)
print("Disarming")
vehicle.armed = False
server = WebsocketServer(8080, '0.0.0.0')
server.set_fn_new_client(new_client)
server.set_fn_message_received(message_received)
server.run_forever()
And the optional client code, running on a remote computer (change the IP 192.168.0.100 with Aero's IP on YOUR NETWORK):
from websocket import create_connection
ws = create_connection("ws://192.168.0.100:8080")
ws.send("Alert, send drone")
result = ws.recv()
print("Received '%s'" % result)
ws.close()
Please refer to the module D2 - Software - Networked Drone
of the course for more information about the following codes.
To install the Python MQTT API on Intel Aero (should be there already):
pip install paho-mqtt
A MQTT client in your browser, to generate a message posting.
UNPLUG THE PROPELLERS BEFORE RUNNING THIS CODE. WE INSIST.
Here's the client code, running on Intel Aero:
import paho.mqtt.client as mqtt
from dronekit import connect, VehicleMode, LocationGlobalRelative
import time
vehicle = connect('tcp:127.0.0.1:5760', wait_ready=True)
vehicle.mode = VehicleMode("GUIDED")
print("Flight Controller Connected")
def on_connect(client, userdata, rc):
print("Client connected ")
client.subscribe("aero-paul")
def on_message(client, userdata, msg):
print("Arming motors ("+msg.topic+"/"+str(msg.payload)+")")
vehicle.armed = True
while not vehicle.armed:
time.sleep(1)
time.sleep(5)
print("Disarming")
vehicle.armed = False
client = mqtt.Client()
client.on_connect = on_connect
client.on_message = on_message
client.connect("test.mosquitto.org", 1883, 60)
client.loop_forever()
There's a multicolor LED on top of the board (if the board is in the enclosure, you can see the light from the white cable hole), and an orange LED under the board. As the LEDs are enclosed in the Ready-To-Fly design, it is not very useful. But if you build your own drone design or enclosing you may want to let the LEDs visible and use them. To install the IO module:
pip install python-periphery
And here is a sample code to test all the LED colors:
import time
from periphery import GPIO
print "Top LED Blue"
gpio = GPIO(403, "out")
gpio.write(bool(1))
time.sleep(1)
gpio.write(bool(0))
gpio.close()
print "Top LED Green"
gpio = GPIO(397, "out")
gpio.write(bool(1))
time.sleep(1)
gpio.write(bool(0))
gpio.close()
print "Top LED Red"
gpio = GPIO(437, "out")
gpio.write(bool(1))
time.sleep(1)
gpio.write(bool(0))
gpio.close()
print "Bottom LED Orange"
gpio = GPIO(507, "out")
gpio.write(bool(1))
time.sleep(1)
gpio.write(bool(0))
gpio.close()
The Intel Aero Compute Board includes a MCP2515 CAN controller and MCP2562 CAN transceiver. The controller is connected to the Atom processor via the SPI interface on bus 1 (SPI1) chip select 0 (CS0). It can be accessed via spidev as /dev/spidev1.0. Python spidev libraries
All product and company names are trademarks or registered trademarks of their respective holders. Use of them does not imply any affiliation with or endorsement by them.
Latest Software (BIOS & OS image) BSP Released: v1.6.1 on 2017-12-18
Important: This repository is no longer being maintained
- About Intel Aero
- Initial Setup
- First Flight
- Ubuntu* installation
- Video Course - Autonomous Drone Engineer
- Intel Aero Ecosystem