开源飞控初探(五):MAVLink协议和Java库

概述

MAVLink协议是一种(应用层)数据协议,不依赖传输协议。传输层可以是TCP、UDP、RS232串口,甚至基于WebSocket。在定义数据的基础上,补充描述了几种子协议(microservice,直译是微服务)的现有实现。协议不保证送达,客户端需要经常检查机器状态确认命令被执行。

具体的数据定义包括:

  1. 数据帧格式,包括协议头和载荷(Payload),协议头包括协议版本、载荷长度、兼容标识、次序号、发送者系统号、发送者组件号、消息号、CRC检验和可选的签名。

  1. 消息号枚举和意义,不同的消息号其载荷的长度和意义。

  1. 命令子协议(一种特殊的消息),命令枚举和意义

官方提供了数据帧的装帧和解析基础库,支持12种语言,还有非官方的库额外多支持3种语言。官方的基础库是通过脚本解析多个XML生成的,XML原始地描述了所有的消息、命令、枚举。这些XML是包含的关系,按消息数量多少排序是:厂商定制消息集(例如ardupilotmega.xml) > common.xml(常用消息集,有161种消息)> minimal.xml(最小消息集,有2种消息)。生成基础库时可传参给脚本指定消息集。

MAVLink的Java库

生成目标为APM板子。源码都在com.MAVLink包中,目录文件结构:

  • uAvionix/CRC.java。CRC算法,算法的约定整数序列全是0。

  • enums/

  • 97个java文件,按协议规范定义了各种枚举值。

  • Messages/

  • MAVLinkMessage.java。各种消息的抽象基类。每种MAVLink消息都有一个子类。

  • MAVLinkPayload.java。表示协议载荷,直接操作ByteBuffer。

  • MAVLinkStats.java。统计收发帧的数量和错误数。主要实现协议中的seq消息次序号。

  • ardupilotmega/

  • CRC.java。CRC算法,算法的约定整数序列已设为MAVLink自定义的值。

  • msg_*.java。63个消息类,APM特有的,都继承MAVLinkMessage。

  • common/

  • CRC.java。和ardupilot/CRC.java是一样的。

  • msg_*.java。136个消息类,都继承MAVLinkMessage。

  • MAVLinkPacket.java。对一帧数据的封装,有装帧和解析(生成一个具体的消息类)操作。

  • Parser.java。解析过程的实现类,逐字节传入数据。

数据接收流程:

  1. 将底层连接接收的字节流逐个字节传入Parser.mavlink_parse_char(int c)函数,至一帧接收完毕时会返回一个MAVLinkPacket实例,否则返回null。

  1. 调用MAVLinkPacket.unpack()函数,即得到一个MAVLinkMessage实例

  1. 根据msgid成员变量判断,强制转换成对应子类。

发送流程:

  1. new一个具体的消息,对成员变量赋(业务)值

  1. 调用MAVLinkMessage.pack()函数得到一个MAVLinkPacket实例

  1. 调用MAVLinkPacket.encodePacket()函数得到byte[]传给底层连接。

重要的协议流程

系统号和组件号

协议中各用一个字节(0~255)分别表示消息发送者的系统号(system ID)和组件号(component ID)。系统就两种,飞控和地面站(飞控客户端都叫地面站)。可以同时有多架飞机和多个地面站连接,所以系统号必须唯一。组件可以是飞控(固件)、无线电台、相机、电机、万向节、电池、显示设备、降落伞,地面站控制模块、惯性导航、GPS等,有固定枚举值来表示这些组件。

部分消息的载荷里,有targetSystemID和targetComponentID参数来表示期望执行命令的系统组件。

多架飞机的SystemID从1开始递增。多个地面站的SystemID从255开始递减。

心跳

各组件都发出HEARTBEAT ( #0 )消息,被其它系统组件用来判断是否在线。各组件必须有规律地发出心跳消息,即使不发控制命令的也要。通常频率为1Hz,如果连续4或5次没收到消息就认为那个系统掉线了。

参数type

  • 地面站应为6,MAV_TYPE_GCS

  • 飞控是按类型有不同取值,例如14,MAV_TYPE_OCTOROTOR,是4轴8桨飞行器。

参数(组件能力与状态)

飞控客户端可以请求想要的数据以及设置响应频率,这些数据都来自上文的组件。完整的可请求的数据列表在这:https://ardupilot.org/dev/docs/mavlink-requesting-data.html

涉及4种消息。

获取

PARAM_REQUEST_LIST,获取所有参数。地面站发出这个命令,飞控用PARAM_VALUE消息逐个参数回复。PARAM_VALUE消息有param_count参数表示总共有多少个参数以及param_index表示这是第几个。

PARAM_REQUEST_READ,获取单个参数,飞控用PARAM_VALUE消息回复。

设置

PARAM_SET,设置单个参数。地面站发出这个命令,飞控用PARAM_VALUE消息再广播一次表示收到。

航线

涉及10种消息

上传

  1. 地面站发出MISSION_COUNT,表示有多少个item

  1. 飞控发来MISSION_REQUEST_INT,参数seq表示第几个。

  1. 地面站回复MISSION_ITEM_INT,按seq第几个来上传

  1. 飞控发来MISSION_ACK表示已接受所有item。

查询

  1. 地面站发出MISSION_REQUEST_LIST

  1. 然后是上传过程调换角色,即地面站发MISSION_REQUEST_INT,飞控发MISSION_ITEM_INT,最后地面站发MISSION_ACK

流程图如下:

报告

飞控发出MISSION_CURRENT消息,当前执行的item:飞控会报告当前执行的mission item seq号

飞控发出MISSION_ITEM_REACHED消息,飞控每到达一个mission item的地点就会报告一次,参数为seq

设置当前item

地面站发出MISSION_SET_CURRENT消息。我们不会用。

清除

地面站发出MISSION_CLEAR_ALL消息,清除所有任务item

重要的命令

  • MAV_CMD_NAV_WAYPOINT (16 ),航点信息,会直线飞过去。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_RETURN_TO_LAUNCH (20 ),返航命令。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_LAND (21 ),着陆命令。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_TAKEOFF (22 ),起飞命令。用在COMMAND_LOG消息中

  • MAV_CMD_NAV_SPLINE_WAYPOINT (82 ),航点信息,会延曲线路径飞过去。用在MISSION_ITEM_INT消息中

  • MAV_CMD_MISSION_START (300 ),开始执行任务。用在COMMAND_LOG消息中

  • MAV_CMD_COMPONENT_ARM_DISARM (400 ),锁定或解锁。用在COMMAND_LOG消息中

  • MAV_CMD_SET_MESSAGE_INTERVAL (511 ),设置消息的发送间隔。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_MESSAGE (512 ),511命令的一次性版。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_PROTOCOL_VERSION (519 ),请求对方的MAVLink版本兼容性。对方应该ACK并发回一个PROTOCOL_VERSION消息。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES (520 ),获取自动驾驶的能力。用在COMMAND_LOG消息中。

参考资料

  • 0
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MavLink协议的建立具有重要意义。MavLink是一种轻量级、高效且可扩展的通信协议,专门用于飞行控制系统与地面站或其他设备之间的通信。它被广泛应用于无人机系统,如无人机的飞行控制器与地面站之间的通信。 首先,MavLink协议的建立使得不同厂商开发的无人机系统能够实现互联互通。在无人机市场中,有许多不同厂商提供各种不同的飞控器系统和地面站软件。MavLink协议的出现消除了各个厂商之间不同通信协议的差异,从而实现了设备之间的无缝连接和信息交换。这样一来,飞行控制系统的开发商和地面站软件开发商可以更加专注于产品的独特特性和创新,而不必担心兼容性问题。 其次,MavLink协议的建立提供了一种统一的通信方式和数据格式,方便了数据的传输和解析。MavLink协议使用轻量级的二进制数据格式,可以有效地传输大量的实时数据,如传感器数据、飞行状态数据等。同时,MavLink的数据格式的设计也非常灵活,可以根据具体需求进行定制化。这样一来,飞行控制系统与地面站之间的数据交换更加高效和可靠。 此外,MavLink协议的建立还促进了无人机系统的开源和共享。MavLink是一个开放的协议,其源代码和文档都是公开的,可以随意使用和修改。这为开发者和爱好者提供了一个共同的平台,他们可以共同参与无人机系统的开发和改进,从而推动整个行业的发展。 总之,MavLink协议的建立为无人机系统的通信提供了一种标准化和统一的解决方案,促进了不同厂商设备之间的互联互通,提高了数据传输和解析的效率,促进了行业的开源和共享。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hursing

来一个五羊香芋甜筒~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值