Before doing anything here go through the below setup and start the Arducopter service after the Navio2 setup.
Setup -> Navio2 with Raspberry Pi 3 B+ for the Ardupilot flight controller setup
Setup Dronekit-Python
– We will go through dronekit however, other option is pymavlink (https://www.ardusub.com/developers/pymavlink.html)
Hello Drone
Install
– From Source in ==Python 3.5 with dronekit 2.9.1== http://python.dronekit.io/contributing/developer_setup_windows.html
git clone https://github.com/dronekit/dronekit-python.git cd dronekit-python && python setup.py build && python setup.py install
Alternately,
pip install dronekit==2.9.1 future==0.15.2 monotonic==1.2 pymavlink==2.0.6
Successfully installed dronekit-2.9.1 future-0.15.2 monotonic-1.2 pymavlink-2.0.6
Ardupilot configuration
cd dronekit-python\examples\vehicle_state
Edit TELEM variables in PI@/etc/default/arducopter
- Listen as a TCP server on 14550 (Runs only onec client connection at a time)
Edit the /etc/default/arducopter file
TELEM1="-A tcp:0.0.0.0:14550"
Run on client (IP addr of the Raspberry PI will go in the CLI)
python vehicle_state.py --connect tcp:172.31.254.100:14550
- Broadcast to dedicated Client (Like Mission Planner or Mavproxy)
Edit the /etc/default/arducopter file (Configure IP of the Mission Planner/GCS client)
TELEM1="-A udp:172.31.254.15:14550"
Run on client
(cv2) λ python vehicle_state.py --connect udp:0.0.0.0:14550
Result
(cv3) λ python NavDrn.py
Get some vehicle attribute values: Autopilot Firmware version: APM:Copter-3.5.5 Major version number: 3 Minor version number: 5 Patch version number: 5 Release type: rc Release version: 0 Stable release?: True Autopilot capabilities Supports MISSION_FLOAT message type: True Supports PARAM_FLOAT message type: True Supports MISSION_INT message type: True Supports COMMAND_INT message type: True Supports PARAM_UNION message type: False Supports ftp for file transfers: False Supports commanding attitude offboard: True Supports commanding position and velocity targets in local NED frame: True Supports set position + velocity targets in global scaled integers: True Supports terrain protocol / data handling: True Supports direct actuator control: False Supports the flight termination command: True Supports mission_float message type: True Supports onboard compass calibration: True Global Location: LocationGlobal:lat=0.0,lon=0.0,alt=17.03 Global Location (relative altitude): LocationGlobalRelative:lat=0.0,lon=0.0,alt=17.03 Local Location: LocationLocal:north=None,east=None,down=None Attitude: Attitude:pitch=0.02147647738456726,yaw=2.0874133110046387,roll=-0.12089607864618301 Velocity: [0.0, 0.0, -0.02] GPS: GPSInfo:fix=1,num_sat=0 Gimbal status: Gimbal: pitch=None, roll=None, yaw=None Battery: Battery:voltage=0.0,current=None,level=None EKF OK?: False Last Heartbeat: 0.6720000000204891 Rangefinder: Rangefinder: distance=None, voltage=None Rangefinder distance: None Rangefinder voltage: None Heading: 119 Is Armable?: False System status: CRITICAL Groundspeed: 0.005300579592585564 Airspeed: 0.0 Mode: STABILIZE Armed: False
For Simulation use Dronekit-SITL with Mission Planner
Source code: NavDrn.py
# Import DroneKit-Python (https://github.com/dronekit/dronekit-python) from dronekit import connect, VehicleMode import json import data.log as logger """ Docs: Dronekit: http://python.dronekit.io/guide/quick_start.html Dronekit.Vehicle: http://python.dronekit.io/automodule.html#dronekit.Vehicle Derived from: http://python.dronekit.io/examples/vehicle_state.html """ """ Class for DroneKit related operations """ class NavDrn(): def __init__(self): self.log = logger.getNewFileLogger(__name__,"sens.log") def printVehicleInfo(self): self.vehicle.wait_ready(True) # Get some vehicle attributes (state) print("\nGet some vehicle attribute values:") print(" Autopilot Firmware version: %s" % self.vehicle.version) print(" Major version number: %s" % self.vehicle.version.major) print(" Minor version number: %s" % self.vehicle.version.minor) print(" Patch version number: %s" % self.vehicle.version.patch) print(" Release type: %s" % self.vehicle.version.release_type()) print(" Release version: %s" % self.vehicle.version.release_version()) print(" Stable release?: %s" % self.vehicle.version.is_stable()) print(" Autopilot capabilities") print(" Supports MISSION_FLOAT message type: %s" % self.vehicle.capabilities.mission_float) print(" Supports PARAM_FLOAT message type: %s" % self.vehicle.capabilities.param_float) print(" Supports MISSION_INT message type: %s" % self.vehicle.capabilities.mission_int) print(" Supports COMMAND_INT message type: %s" % self.vehicle.capabilities.command_int) print(" Supports PARAM_UNION message type: %s" % self.vehicle.capabilities.param_union) print(" Supports ftp for file transfers: %s" % self.vehicle.capabilities.ftp) print(" Supports commanding attitude offboard: %s" % self.vehicle.capabilities.set_attitude_target) print(" Supports commanding position and velocity targets in local NED frame: %s" % self.vehicle.capabilities.set_attitude_target_local_ned) print(" Supports set position + velocity targets in global scaled integers: %s" % self.vehicle.capabilities.set_altitude_target_global_int) print(" Supports terrain protocol / data handling: %s" % self.vehicle.capabilities.terrain) print(" Supports direct actuator control: %s" % self.vehicle.capabilities.set_actuator_target) print(" Supports the flight termination command: %s" % self.vehicle.capabilities.flight_termination) print(" Supports mission_float message type: %s" % self.vehicle.capabilities.mission_float) print(" Supports onboard compass calibration: %s" % self.vehicle.capabilities.compass_calibration) print(" Global Location: %s" % self.vehicle.location.global_frame) print(" Global Location (relative altitude): %s" % self.vehicle.location.global_relative_frame) print(" Local Location: %s" % self.vehicle.location.local_frame) print(" Attitude: %s" % self.vehicle.attitude) print(" Velocity: %s" % self.vehicle.velocity) print(" GPS: %s" % self.vehicle.gps_0) print(" Gimbal status: %s" % self.vehicle.gimbal) print(" Battery: %s" % self.vehicle.battery) print(" EKF OK?: %s" % self.vehicle.ekf_ok) print(" Last Heartbeat: %s" % self.vehicle.last_heartbeat) print(" Rangefinder: %s" % self.vehicle.rangefinder) print(" Rangefinder distance: %s" % self.vehicle.rangefinder.distance) print(" Rangefinder voltage: %s" % self.vehicle.rangefinder.voltage) print(" Heading: %s" % self.vehicle.heading) print(" Is Armable?: %s" % self.vehicle.is_armable) print(" System status: %s" % self.vehicle.system_status.state) print(" Groundspeed: %s" % self.vehicle.groundspeed) # settable print(" Airspeed: %s" % self.vehicle.airspeed) # settable print(" Mode: %s" % self.vehicle.mode.name) # settable print(" Armed: %s" % self.vehicle.armed) # settable print(" Channel values from RC Tx:", self.vehicle.channels) print(" Home location: %s" % self.vehicle.home_location) # settable print(" ----- ") """ Initialize the TCP connection to the vehicle """ def init(self, connectionString="tcp:localhost:14550"): try: self.connectVehicle(connectionString) except Exception as e: self.log.error("{0}\n Retry ".format(str(e))) self.connectVehicle(connectionString) """ Connect to the Vehicle """ def connectVehicle(self, connectionString="tcp:localhost:14550"): self.log.info("Connecting to vehicle on: %s" % (connectionString,)) self.vehicle = connect(connectionString, wait_ready=True) return self.vehicle """ Close connection to the Vehicle """ def closeVehicle(self): self.vehicle.close() self.log.info("Closed connection to vehicle") if __name__ == "__main__": navDrn = NavDrn() # Establish connection with the Raspberry Pi with Navio2 hat on connectionString = "tcp:172.31.254.100:14550" navDrn.init(connectionString) while True: try: # Print the data navDrn.printVehicleInfo() except KeyboardInterrupt: print("\n Bye Bye") break # Close vehicle object navDrn.closeVehicle()