DroneKit教程(五):使用自定义MAVLink指令
DroneKit的实质是通过发送和接受MAVLink消息,向飞控发送控制指令、从飞控获取各种状态信息。DroneKit的所有内置功能都是基于MAVLink实现的。DroneKit内置了simple_takeoff和simple_goto指令,以及部分云台的指令;如果要使用到DroneKit中没有的指令,则需要自定义MAVLink消息并发送。
编程示例
使用SET_POSITION_TARGET_LOCAL_NED设置速度
from pymavlink import mavutil
def send_nav_velocity(self, velocity_x, velocity_y, velocity_z):
msg = self.vehicle.message_factory.set_position_target_local_ned_encode(
0,
0, 0,
mavutil.mavlink.MAV_FRAME_BODY_NED,
0b0000111111000111,
0, 0, 0,
velocity_x, velocity_y, velocity_z,
0, 0, 0,
0, 0)
self.vehicle.send_mavlink(msg)
self.vehicle.flush()
使用MAV_CMD_CONDITION_YAW设置航向(yaw轴)
from pymavlink import mavutil
def condition_yaw(self, heading, relative, clock_wise):
if relative:
isRelative = 1
else
isRelative = 0
if clock_wise:
direction = 1
else:
direction = -1
if not relative:
direction = 0
msg = self.vehicle.message_factory.command_long_encode(
0, 0,
mavutil.mavlink.MAV_CMD_CONDITION_YAW,
0,
heading,
0,
direction,
isRelative,
0, 0, 0)
self.vehicle.send_mavlink(msg)
self.vehicle.flush()
MAVLink指令
MAVLink是运行ArduPilot和PX4飞控软件的无人机与外界通信的协议。MAVLink中的指令部分称为MAVLink Command Messages(MAV_CMD)。
MAV_CMD分为三种指令类型:
- MAV_CMD_NAV导航命令(Navigation commands),用于控制无人机的运动
- MAV_CMD_DO命令(Do commands),用于辅助性的功能,不会影响无人机的位置
- MAV_CMD_CONDITION命令(Conditional commands),在满足相应条件之前,阻塞下一个DO命令的执行
对MAV_CMD,最多可以同时执行一条NAV命令,一条DO或CONDITION命令。
此外,SET_POSITION_TARGET_LOCAL_NED是无人机速度和位置控制中常用的指令。
完整的命令文档可参见ArduPilot开发者文档:Copter Commands in Guided Mode以及Mission Planner中的MAV_CMD文档。
Frame
Frame of reference,意味参考系。在使用部分MAVLink指令时,需要声明使用的参考系。常用的参考系为:
Frame名称 | 位置参考点 | 位置参考方位 | 速度参考方位 |
---|
MAV_FRAME_LOCAL_NED | home | NED | NED |
MAV_FRAME_LOCAL_OFFSET_NED | vehicle | NED | NED |
MAV_FRAME_BODY_OFFSET_NED | vehicle | FRD | FRD |
MAV_FRAME_BODY_NED | home | NED | FRD |
名词解释:
- home - 以home点的位置(通常是无人机初始化完成的位置)作为参考点
- vehicle - 以无人机的当前位置作为参考点
- NED - North East Down,即 x轴=正北方,y轴=正东方,z轴=正下方,绝对方位朝向
- FRD - Forward Right Down,即 x轴=正前方,y轴=正右方,z轴=正下方,相对方位朝向
生成和发送MAVLink指令
生成MAVLink指令
通过调用vehicle.message_factory,可以生成“原生”的MAVLink指令。在使用前,需要
from pymavlink import mavutil
对于多数MAVLink指令,生成相应指令的函数为“小写指令名”+“_encode”。例如,对于SET_POSITION_TARGET_LOCAL_NED,我们使用message_factory.set_position_target_local_ned_encode()
:
msg = vehicle.message_factory.set_position_target_local_ned_encode(
0,
0,
0,
mavutil.mavlink.MAV_FRAME_BODY_NED,
0b0000111111000111,
0, 0, 0,
velocity_x, velocity_y, velocity_z,
0, 0, 0,
0, 0)
对于一类MAVLink指令——MAV_CMD指令,我们使用message_factory.command_long_encode()
函数:
msg = vehicle.message_factory.command_long_encode(
0,
0,
mavutil.mavlink.MAV_CMD_CONDITION_YAW,
0,
heading,
0,
1,
1,
0, 0, 0)
发送MAVLink指令
使用send_mavlink()
函数发送指令,flush()
函数将等待指令发送成功。
vehicle.send_mavlink(msg)
vehicle.flush()
版本信息
1.0 20170915 initial commit
本作品采用知识共享署名-相同方式共享 3.0 未本地化版本许可协议进行许可。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)