PX4 Mavlink自定义消息生成
这里只给出windows版本哈……
PX4的Mavlink消息的xml定义在:Firmware\mavlink\include\mavlink\v1.0\message_definitions\common.xml(其他的xml是什么鬼本人也不知道)
PX4的Mavlink头文件在:Firmware\mavlink\include\mavlink\v1.0\common中
其生成逻辑如下图所示:
Mavlink的生成逻辑
有2种方法,不管怎么样,第一步都是修改你的xml文件,mavlink主要由2部分组成,一个是enums和messages。对于我们来说,主要关注messages,先看一个本身的例子:HEARTBEAT,打开Firmware\mavlink\include\mavlink\v1.0\message_definitions\common.xml
<message id="0" name="HEARTBEAT">
<description>The heartbeat message shows that a system is present and responding. The type of the MAV and Autopilot hardware allow the receiving system to treat further messages from this system appropriate (e.g. by laying out the user interface based on the autopilot).
</description>
<field type="uint8_t" name="type">Type of the MAV (quadrotor, helicopter, etc., up to 15 types, defined in MAV_TYPE ENUM)</field>
<field type="uint8_t" name="autopilot">Autopilot type / class. defined in MAV_AUTOPILOT ENUM</field>
<field type="uint8_t" name="base_mode">System mode bitfield, see MAV_MODE_FLAG ENUM in mavlink/include/mavlink_types.h</field>
<field type="uint32_t" name="custom_mode">A bitfield for use for autopilot-specific flags.</field>
<field type="uint8_t" name="system_status">System status flag, see MAV_STATE ENUM</field>
<field type="uint8_t_mavlink_version" name="mavlink_version">MAVLink version, not writable by user, gets added by protocol because of magic data type: uint8_t_mavlink_version</field>
</message>
主要关注<field>域:
<field type="uint8_t" name="type">
这个意思就是定义个uint8_t的量,然后名称是type
其他的就以此类推了……
照葫芦画瓢,我们自己定义一个message
<message id="8" name="MYTEST">
<description>this is a test</ description >
<field type=”uint8_t” name=”temp1”>
<field type=”uint8_t” name=”temp2”>
</message>
注意红色的ID,这个ID是唯一的,好多都被占用了,选个没占用的8吧,吉祥。
以上就是更改xml的过程。
先将生成方法2:
靠你的智慧和双手,这个笨方法其实我没有试过,其原理就是打开Firmware\mavlink\include\mavlink\v1.0\common,自己去写mavlink消息头文件,包括生成一个mavlink_msg_XXX.h的头文件,然后在common.h和mavlink.h中添加这个头文件和相关代码,这要求你很有耐心地去理解这些.h文件之间的关系,熟练之后改改也很快,就是笨点儿。
生成方法1:
也就是通用做法,是靠一个mavgenerate.py去实现。在PX4中没有相关的东西,只有生成好的include,所以我们的第一步就是去git一个mavlink。
我本身把px4放在d:\px4下面了,这个没啥关系。
进入git命令行,到d:\px4下面,然后
执行git clone https://github.com/mavlink/mavlink
下载完成后,cd进入这个mavlink文件夹。下载他的子模块。
执行git submodule update --init --recursive
下载了一个子模块是什么的:pymavlink
进入windows命令行后,cd到d:\px4\mavlink下面
执行python mavgenerate.py
这个时候,跳出了喜人的界面:
第一行,选择xml的路径,也就是Firmware\mavlink\include\mavlink\v1.0\message_definitions\common.xml
第二行,选择生成的头文件存放的文件夹,我们暂时放在当前目录的一个aaa文件夹
Language选择C
协议选择1.0
然后,点击generate按钮
生成…,完成后我们可以看到当前目录下生成了:
然后把这些拷贝到Firmware\mavlink\include\mavlink\v1.0\common中,覆盖那些原来的,大功告成!
问题:
整个过程是不是很简单?比手动方法好多了,而且不容易出错,但是作者还是很艰辛地完成了,为什么?坑在python中缺了一个future模块(我是一个python菜鸟)
在一开始的时候执行mavgenerate.py,报了一个错,no module named ‘future’,怎么解决呢,就是去下一个,这得利用get-pip.py,下载地址:https://bootstrap.pypa.io/get-pip.py
下载完成后,拷贝到python的安装目录下,我是C:\Python36
然后进入我们的cmd,cd到C:\Python36下,执行python get-pip.py,安装得到了get-pip,再利用pip去安装future
保持该目录,执行pip install future
完成后,发现python拥有了future模块了,重新去执行mavgenerate.py吧。
针对这个问题,附加一个linux的解决,差不多吧:
http://www.cnblogs.com/shushanxiaoyao/p/6594809.html
另外,本人没用PX4自带的python 2.7.3进行处理,而是用python 3.6.1,不知道有没有问题。
附录:
附带一个python 3.6.1的下载地址:https://www.python.org/downloads/release/python-361/
附带一个官方生成新mavlink的说明:http://qgroundcontrol.org/mavlink/create_new_mavlink_message