# 使用 DroneKit 与 PX4 通信

无人机套件 (打开新窗口) 帮助您为无人机创建功能强大的应用程序。这些应用程序在无人机的伴侣计算机上运行,通过执行计算密集型和需要低延迟链接的任务(如计算机视觉)来增强自动驾驶功能。

DroneKit 和 PX4 目前正在努力实现完全兼容。目前,DroneKit-python 2.2.0 已基本支持任务处理和飞行器监控。

# 用 PX4 设置 DroneKit

首先从当前的主控程序安装 DroneKit-python。

Git 克隆 https://github.com/dronekit/dronekit-python.git
CD ./dronekit-python
苏都 python setup.py build
苏都 python setup.py 安装

创建新的 python 文件并导入 DroneKit、ppmavlink 和基本模块

# 导入 DroneKit-Python
from dronekit import connect, 指挥, LocationGlobal from pymavlink import mavutil import time, 系统, 参数, 算术

连接到无人机或模拟器的 MAVLink 端口(例如 JMavSim).

# 与载具连接
打印 "连接";
连接字符串 = '127.0.0.1:14540'
汽车 = 接通(连接字符串, 等待就绪=正确)

显示一些基本状态信息

# 显示载具基本状态
打印 "类型:%s"; % 汽车.载具类型 打印 "上膛:%s"; % 汽车.上膛印刷 系统状态:%s"; % 汽车.系统状态.国印 " GPS: %s"; % 汽车.gps_0 打印 " Alt: %s"; % 汽车.地点.global_relative_frame.选一

# 完整任务示例

下面的 python 脚本使用 DroneKit 和 PX4 展示了一个完整的任务示例。DroneKit 尚不完全支持模式切换,因此我们发送了自己的自定义模式切换命令。

################################################################################################ # @File DroneKitPX4.py
# 将 DroneKit 与 PX4 结合使用的示例
# # @作者桑德尔-斯梅茨 <;sander@droneslab.>;
#
# 代码部分基于 无人机套件 (c) 版权 2015-2016, 3D 机器人.
################################################################################################
# 导入 DroneKit-Python
from dronekit import connect, 指挥, LocationGlobal from pymavlink import mavutil import time, 系统, 参数, 数学 ################################################################################################
# 设置
################################################################################################ connection_string       = '127.0.0.1:14540'
自动飞行器模式   = 4
# https://github.com/PX4/PX4-Autopilot/blob/master/Tools/mavlink_px4.py
# 解析连接参数
解析器 = 参数.参数解析器()
解析器.添加参数("-c";, "--连接";, 帮助="连接字符串";)
参数 = 解析器.解析参数()
如果 参数.接通:
    连接字符串 = 参数.连接 ################################################################################################
# 启动
################################################################################################
# 与载具连接
打印 "连接";
汽车 = 接通(连接字符串, 等待就绪=正确)
捍卫 PX4setMode(mavMode):
    汽车.我是校长.马夫.命令长发送(汽车.我是校长.目标系统, 汽车.我是校长.目标组件,
                                               mavutil.多点连接.mav_cmd_doo_set_mode, 0,
                                               mavMode,
                                               0, 0, 0, 0, 0, 0)
捍卫 获取位置偏移参数(原始位置, d 北部, d 东部, 选一):
    "";返回包含纬度的 LocationGlobal 对象。/距指定 "原位置 "的经度 "北纬 "和 "东经 "米数. 返回的位置会将输入的 `alt` 值添加到 `original_location` 的高度上。.
    当您想移动载具,指定相对于当前载具位置的位置时,该功能非常有用.
    该算法在较小的 距离 (101公里) 除两极以外.
    更多信息,请参见:
    http://gis.stackexchange.com/questions/2951/algorithm-for-offsetting-a-latitude-longitude-by-some-amount-of-meters
    "";地球半径=6378137.0 #Radius of "球形"; 地球
    #以弧度为单位的坐标偏移
    dLat = d 北部/地球半径 dLon = d 东部/(地球半径*算术.系数(算术.pi*原始位置.纬度/180))
    #以十进制度数表示的新位置
    newlat = 原始位置.纬度 + (dLat * 180/算术.pi)
    纽伦 = 原始位置.+ (dLon * 180/算术.pi)
    返回 地点全球(newlat, 纽伦,原始位置.选一+选一)
################################################################################################
# 听众
################################################################################################ home_position_set = 假的
#创建消息监听器 对于 原点复位
@ 载具.信息(主位置)
捍卫 听众(自我, 名字, 原点):
    global home_position_set home_position_set = True ################################################################################################
# 启动任务示例
################################################################################################
# 等待 对于 原点锁
虽然 不是原点设置:
    打印 等待主位置......";
    时间.睡眠(1)
# 显示载具基本状态
打印 "类型:%s"; % 汽车.载具类型 打印 "上膛:%s"; % 汽车.上膛印刷 系统状态:%s"; % 汽车.系统状态.国印 " GPS: %s"; % 汽车.gps_0 打印 " Alt: %s"; % 汽车.地点.global_relative_frame.选一
# 更改为自动模式
PX4setMode(自动飞行器模式)
时间.睡眠(1)
# 加载命令
cmds = 汽车.命令 cmds.清除()
首页 = 汽车.地点.global_relative_frame
# 起飞 10 米数
wp = 获取位置偏移参数(首页, 0, 0, 10);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_takeoff, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 行动 10 向北
wp = 获取位置偏移参数(wp, 10, 0, 0);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_waypoint, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 行动 10 向东
wp = 获取位置偏移参数(wp, 0, 10, 0);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_waypoint, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 行动 10 向南
wp = 获取位置偏移参数(wp, -10, 0, 0);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_waypoint, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 行动 10 向西
wp = 获取位置偏移参数(wp, 0, -10, 0);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_waypoint, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 土地
wp = 获取位置偏移参数(首页, 0, 0, 10);
cmd = 指挥(0,0,0, mavutil.多点连接.mav_frame_global_relative_alt, mavutil.多点连接.mav_cmd_nav_land, 0, 1, 0, 0, 0, 0, wp.纬度, wp., wp.选一)
cmds.增加(cmd)
# 上传任务
cmds.上传()
时间.睡眠(2)
# 臂式载具
汽车.上膛 = 正确
# 监控器 任务执行
下一个航点 = 汽车.指令.下一个
虽然 下一个航点 <; (汽车.指令):
    如果 汽车.指令.下一个 >; 下一个航点:
        显示序列 = 汽车.指令.下一个+1
        打印 移动到航点 %s"; % display_seq nextwaypoint = 汽车.指令.下次.睡眠(1)
# 等待 对于 载具着陆
虽然 汽车.指令.下一个 >; 0:
    时间.睡眠(1)
# 解除载具上膛
汽车.上膛 = 假时间.睡眠(1)
# 退出脚本前关闭载具对象
汽车.关闭()
时间.睡眠(1)