文章目录

  • 1 MAVLink XML 文件的基本结构
  • 2 message
  • 3 enum

1 MAVLink XML 文件的基本结构

下面的代码块是 mavlink 消息定义的 xml 数据文档

代码块 1

<?xml version="1.0"?>
<mavlink><version>3</version><dialect>0</dialect><enums><enum name="aaaa"></enum><enum name="bbbb"></enum></enums><messages><message id='1' name="somename"></message><message id="2" name="anothername"></message></messages>
</mavlink>

xml 结构主要可以分为版本信息块、enums包括的枚举数据定义块以及messages 消息定义块。版本信息块如下

<version>3</version>
<dialect>0</dialect>

enums 枚举数据定义块是<enums></enums> 标签包括的内容,其中包括了很多通过<enum></enum>标签定义的数据。
messages 消息定义块是<messages></messages> 标签包括的内容,其中包括了很多通过<message></message> 定义的数据。

对于<enum></enum><message></message>内部的具体结构在 mavschema.xsd 中有定义。这里我们专注于 common.xml 的剖析,跳过mavschema.xsd 并不会影响我们对 common.xml 的理解。
下面分别分析 <enum></enum> 的结构和<message></message> 的结构。由于 <message></message> 包含了<enum></enum> 中的内容所以,这里先分析<message></message>

2 message

这里我们摘取名为SYS_STATUS 的 message 进行分析

代码块 2

    <message id="1" name="SYS_STATUS"><description>The general system state. If the system is following the MAVLink standard, the system state is mainly defined by three orthogonal states/modes: The system mode, which is either LOCKED (motors shut down and locked), MANUAL (system under RC control), GUIDED (system with autonomous position control, position setpoint controlled manually) or AUTO (system guided by path/waypoint planner). The NAV_MODE defined the current flight state: LIFTOFF (often an open-loop maneuver), LANDING, WAYPOINTS or VECTOR. This represents the internal navigation state machine. The system status shows whether the system is currently active or not and if an emergency occurred. During the CRITICAL and EMERGENCY states the MAV is still considered to be active, but should start emergency procedures autonomously. After a failure occurred it should first move from active to critical to allow manual intervention and then move to emergency after a certain timeout.</description><field type="uint32_t" name="onboard_control_sensors_present" enum="MAV_SYS_STATUS_SENSOR" display="bitmask" print_format="0x%04x">Bitmap showing which onboard controllers and sensors are present. Value of 0: not present. Value of 1: present.</field><field type="uint32_t" name="onboard_control_sensors_enabled" enum="MAV_SYS_STATUS_SENSOR" display="bitmask" print_format="0x%04x">Bitmap showing which onboard controllers and sensors are enabled:  Value of 0: not enabled. Value of 1: enabled.</field><field type="uint32_t" name="onboard_control_sensors_health" enum="MAV_SYS_STATUS_SENSOR" display="bitmask" print_format="0x%04x">Bitmap showing which onboard controllers and sensors have an error (or are operational). Value of 0: error. Value of 1: healthy.</field><field type="uint16_t" name="load" units="d%">Maximum usage in percent of the mainloop time. Values: [0-1000] - should always be below 1000</field><field type="uint16_t" name="voltage_battery" units="mV">Battery voltage, UINT16_MAX: Voltage not sent by autopilot</field><field type="int16_t" name="current_battery" units="cA">Battery current, -1: Current not sent by autopilot</field><field type="int8_t" name="battery_remaining" units="%">Battery energy remaining, -1: Battery remaining energy not sent by autopilot</field><field type="uint16_t" name="drop_rate_comm" units="c%">Communication drop rate, (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)</field><field type="uint16_t" name="errors_comm">Communication errors (UART, I2C, SPI, CAN), dropped packets on all links (packets that were corrupted on reception on the MAV)</field><field type="uint16_t" name="errors_count1">Autopilot-specific errors</field><field type="uint16_t" name="errors_count2">Autopilot-specific errors</field><field type="uint16_t" name="errors_count3">Autopilot-specific errors</field><field type="uint16_t" name="errors_count4">Autopilot-specific errors</field></message>

可以看到 message 的结构比较简单,主要由<description> 段和<field> 组成。<description> 是对这个消息的描述,<field>是消息中所包含数据的每个域的具体说明,包含域的数据类型(type),域的数据名称(name),及对该域数据的描述(嵌入在<field></field>标签中的文本)。可以看到<field> 中还有enumdisplayprint_formatunits等其他属性。enum属性的内容即上面通过<enum></enum> 标签定义的枚举数据类型,例如onboard_control_sensors_present 中引用的名称是MAV_SYS_STATUS_SENSOR 枚举数据类型。display 定义这个域主要是用来显示给用户的,print_format 则指定了打印格式。这个message 实际上就是传输中的数据的具体结构,message中定义的每个field 在数据中一定存在,且大小按其type 域指定的数据类型相一致。

3 enum

下面来剖析enum 节点,这里以上一节提到的MAV_SYS_STATUS_SENSOR为例来说明。

代码块 3

<enum name="MAV_SYS_STATUS_SENSOR"><description>These encode the sensors whose status is sent as part of the SYS_STATUS message.</description><entry value="1" name="MAV_SYS_STATUS_SENSOR_3D_GYRO"><description>0x01 3D gyro</description></entry><entry value="2" name="MAV_SYS_STATUS_SENSOR_3D_ACCEL"><description>0x02 3D accelerometer</description></entry><entry value="4" name="MAV_SYS_STATUS_SENSOR_3D_MAG"><description>0x04 3D magnetometer</description></entry><entry value="8" name="MAV_SYS_STATUS_SENSOR_ABSOLUTE_PRESSURE"><description>0x08 absolute pressure</description></entry><entry value="16" name="MAV_SYS_STATUS_SENSOR_DIFFERENTIAL_PRESSURE"><description>0x10 differential pressure</description></entry><entry value="32" name="MAV_SYS_STATUS_SENSOR_GPS"><description>0x20 GPS</description></entry><entry value="64" name="MAV_SYS_STATUS_SENSOR_OPTICAL_FLOW"><description>0x40 optical flow</description></entry><entry value="128" name="MAV_SYS_STATUS_SENSOR_VISION_POSITION"><description>0x80 computer vision position</description></entry><entry value="256" name="MAV_SYS_STATUS_SENSOR_LASER_POSITION"><description>0x100 laser based position</description></entry><entry value="512" name="MAV_SYS_STATUS_SENSOR_EXTERNAL_GROUND_TRUTH"><description>0x200 external ground truth (Vicon or Leica)</description></entry><entry value="1024" name="MAV_SYS_STATUS_SENSOR_ANGULAR_RATE_CONTROL"><description>0x400 3D angular rate control</description></entry><entry value="2048" name="MAV_SYS_STATUS_SENSOR_ATTITUDE_STABILIZATION"><description>0x800 attitude stabilization</description></entry><entry value="4096" name="MAV_SYS_STATUS_SENSOR_YAW_POSITION"><description>0x1000 yaw position</description></entry><entry value="8192" name="MAV_SYS_STATUS_SENSOR_Z_ALTITUDE_CONTROL"><description>0x2000 z/altitude control</description></entry><entry value="16384" name="MAV_SYS_STATUS_SENSOR_XY_POSITION_CONTROL"><description>0x4000 x/y position control</description></entry><entry value="32768" name="MAV_SYS_STATUS_SENSOR_MOTOR_OUTPUTS"><description>0x8000 motor outputs / control</description></entry><entry value="65536" name="MAV_SYS_STATUS_SENSOR_RC_RECEIVER"><description>0x10000 rc receiver</description></entry><entry value="131072" name="MAV_SYS_STATUS_SENSOR_3D_GYRO2"><description>0x20000 2nd 3D gyro</description></entry><entry value="262144" name="MAV_SYS_STATUS_SENSOR_3D_ACCEL2"><description>0x40000 2nd 3D accelerometer</description></entry><entry value="524288" name="MAV_SYS_STATUS_SENSOR_3D_MAG2"><description>0x80000 2nd 3D magnetometer</description></entry><entry value="1048576" name="MAV_SYS_STATUS_GEOFENCE"><description>0x100000 geofence</description></entry><entry value="2097152" name="MAV_SYS_STATUS_AHRS"><description>0x200000 AHRS subsystem health</description></entry><entry value="4194304" name="MAV_SYS_STATUS_TERRAIN"><description>0x400000 Terrain subsystem health</description></entry><entry value="8388608" name="MAV_SYS_STATUS_REVERSE_MOTOR"><description>0x800000 Motors are reversed</description></entry><entry value="16777216" name="MAV_SYS_STATUS_LOGGING"><description>0x1000000 Logging</description></entry><entry value="33554432" name="MAV_SYS_STATUS_SENSOR_BATTERY"><description>0x2000000 Battery</description></entry><entry value="67108864" name="MAV_SYS_STATUS_SENSOR_PROXIMITY"><description>0x4000000 Proximity</description></entry><entry value="134217728" name="MAV_SYS_STATUS_SENSOR_SATCOM"><description>0x8000000 Satellite Communication </description></entry><entry value="268435456" name="MAV_SYS_STATUS_PREARM_CHECK"><description>0x10000000 pre-arm check status. Always healthy when armed</description></entry><entry value="536870912" name="MAV_SYS_STATUS_OBSTACLE_AVOIDANCE"><description>0x20000000 Avoidance/collision prevention</description></entry></enum>

可以看出每个<enum></enum>中包括了很多的<entry></entry> ,每条<entry></entry>可以看作枚举的一个值,value 属性对应于值的具体大小,name 则可以看成是值的别名。
可以看出enum 类型不过是普通的数据型数据,那为什么要把这些数据类型单独拿出来定义呢。一个原因是,每个值都有确定的含义,假想两个系统之间进行通讯,虽然采用同样的协议,但是如果对值的约定不一样,这边用1 代表四旋翼,那边用1代表固定翼这样显然不匹配。另一个原因是,协议要自洽,尽量在协议文档里把协议的内容都包括进来,避免模糊和歧义。所以关于数值含义的约定也是协议的重要部分,单独列出来可以让协议结构更清晰明确。

MAVLink 协议解析之XML定义篇相关推荐

  1. mavlink协议_MAVLink学习之路05_MAVLink应用编程接口分析

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 前面写的几篇文章你掌握了,说明你离成功很近了 ...

  2. mavlink协议详解_MAVLink学习之路05_ MAVLink应用编程接口分析

    描述 MAVLink应用编程主要内容 2.1 发送和接收说明 利用MAVLink通信协议进行编程,主要实现的功能就是: 1.发送端 将需要发送的数据(如:SysState, BatVol),添加MAV ...

  3. Profinet非周期协议解析

    PROFINET的非周期通信,是想了又想,拖了又拖,终于鼓足勇气写一下.跟Ethercat和Canopen一样,任何一种完备的协议都不可能所有的内容通过过程数据解决.Ethercat有SDO数,对比于 ...

  4. mavlink协议_MAVLink学习之路03_XML中定义MSG并生成C代码

    说明: 本文原创作者『strongerHuang』 首发于微信公众号『嵌入式专栏』,同时也更新在我的个人网站:EmbeddedDevelop 一.写在前面 如果你前面两篇文章掌握了,说明你已经入门了. ...

  5. 解决wireshark安装mavlink协议插件后解析报错的问题

    在wireshark上安装mavlink的解析脚本后,在解析mavlink的udp报文时出现如下错误: Lua Error: D:\Program Files\Wireshark\mavlink_v1 ...

  6. mavlink协议详解_MAVLink通讯协议在STM32上移植,并自定义协议

    mavlink全称是(Micro Air Vehicle Message Marshalling Library),从名字可以看出,mavlink是主要面向飞控的一种开源通信协议.因此它默认定义了很多 ...

  7. 6003.mavlink协议自定义消息编程

    mavlink 自定义消息编程 紧接着上一篇的操作方法,根据自定义的xml生成基于mavlink协议形式的消息.将其添加到工程中,并且调用起来的示例demo代码如下: 将生成自定义消息目录拷贝到工程下 ...

  8. Mavlink协议概要

    转:http://blog.csdn.net/luckpl/article/details/52608868#mavlink协议简介 Mavlink协议简介 Mavlink协议简介 一Mavlink协 ...

  9. Mavlink协议(第二版)

    文章目录 协议简介 一.Mavlink协议 主要特点 二.数据结构 不兼容标志 (MAVLink 2) 兼容性标志 (MAVLink 2) 有效载荷格式 MAVLink 2 的数据包格式 三.航点协议 ...

最新文章

  1. 机器人导航两篇顶级会议论文解析
  2. php tp3 操作绑定到类,快速入门 17:操作绑定到类
  3. opencv 直线检测笔记
  4. leetcode算法题--最长定差子序列
  5. Adobe Flash Player 10新特性详解:支持GPU加速
  6. mysql 5.6 删除用户_mysql 新增 删除用户和权限分配
  7. SpringBoot之自定义验证码
  8. redis事物的使用
  9. DiskFileUpload上传与Spring的CommonsMultipartResolver上传对比
  10. 为android开发安装ubuntu系统环境纪要
  11. Overlay 网络 VXLAN 技术解析
  12. hdu5956, The Elder (树型dp, 斜率优化)
  13. rt-n18u usb3.0 linux ex,【晒一下论坛晒单奖品】华硕RT-N18U多功能无线路由器2.4G 600Mbps...
  14. python 学习爬取链家武汉二手房市场成交记录
  15. java锁的种类以及辨析(一):自旋锁
  16. 短域名服务设计与实现
  17. 网站排名优化快排SEO网站源码
  18. Matlab的插值与拟合
  19. 网页底部固定版权信息
  20. php和thinkphp实现页面调转

热门文章

  1. Composition-based Multi-Relational Graph Convolutional Networks 多关系图神经网络 ICLR 2020
  2. 程序员笔记|常见的Spring异常处理
  3. 1.1方程求根之二分法
  4. mysql的zip包的安装方法
  5. canvas 实现雷达图
  6. 《程序员代码面试指南》第五章 字符串问题 找到字符串的最长无重复字符子串...
  7. 使用pytesseract识别简单验证码
  8. 运维自动化之使用PHP+MYSQL+SHELL打造私有监控系统(五)
  9. JavaScript对象的深入理解 (一)
  10. 记录一下git 的常用命令