mavlink作为PX4以及APM两大开源飞控的通讯协议,应用非常广泛。在进行开源飞控二次开发时,增加自定义消息非常普遍。比如在offboard模式下,将视觉避障信息或者雷达信息发送给飞控,这时候就需要在mavlink中自定义一些消息了。
- 创建一个自定义MAVLink消息
在/msg文件夹下面添加debug_vect_one.msg,添加内容如下1
2
3
4
5
6
uint64 timestamp # time since system start (microseconds)
float32 x # x value
float32 y # y value
float32 z # z value先自定义在mavlink/message_definitions/v1.0下创建自定义消息debug_vect_one.xml文件,与debug_vect_one.msg中结构一致,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0"?>
<mavlink>
<version>3</version>
<messages>
<message id="1001" name="DEBUG_VECT_ONE">
<description>Test all field types</description>
<field type="uint64_t" name="timestamp">uint64_t</field>
<field type="float" name="x">float</field>
<field type="float" name="y">float</field>
<field type="float" name="z">float</field>
</message>
</messages>
</mavlink>注意需要添加一个timestamp的成员,因为在编译时为了记录,会增加一个timestamp的成员。然后使用mavlink generator生成c语言源文件。
-
1.去git 官网上下载源码
git clone https://github.com/mavlink/mavlink.git
2.进入代码目录并更新子模块
cd mavlink
git submodule update --init --recursive
3.编译并运行python脚本
python -m mavgenerate
完成以上步骤即可。
XML文件定位可以直接定位到mavlink/message_definitions/v1.0/debug_vect_one.xml,Out目录定位到mavlink,注意语言选择C,协议选择2.0,如下图所示:
然后点击Generate即可生成c代码源文件。
- 发送自定义MAVLink消息
自定义信息的发送主要通过修改src/modules/mavlink/下的mavlink_messsages.cpp文件来实现。- 添加自定义消息的头文件
1
2
#include <uORB/topics/debug_vect_one.h>
并且在Common.h (\firmware\mavlink\include\mavlink\v2.0\common) 中添加#include "./mavlink_msg_debug_vect_one.h"
注意添加到已有包含文件的尾部,否则编译时可能会出现类型为定义的错误。
-
创建自定义消息对应的类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#if 1
class MavlinkStreamDebugVectOne : public MavlinkStream
{
public:
const char *get_name() const
{
return MavlinkStreamDebugVectOne::get_name_static();
}static const char *get_name_static()
{
return "DEBUG_VECT_ONE";
}static uint16_t get_id_static()
{
return MAVLINK_MSG_ID_DEBUG_VECT_ONE;
}uint16_t get_id()
{
return get_id_static();
}static MavlinkStream *new_instance(Mavlink *mavlink)
{
return new MavlinkStreamDebugVectOne(mavlink);
}unsigned get_size()
{
return (_debug_time > 0) ? MAVLINK_MSG_ID_DEBUG_VECT_ONE_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES : 0;
}private:
MavlinkOrbSubscription *_debug_sub;
uint64_t _debug_time;/* do not allow top copying this class */
MavlinkStreamDebugVectOne(MavlinkStreamDebugVectOne &) = delete;
MavlinkStreamDebugVectOne &operator = (const MavlinkStreamDebugVectOne &) = delete;protected:
explicit MavlinkStreamDebugVectOne(Mavlink *mavlink) : MavlinkStream(mavlink),
_debug_sub(_mavlink->add_orb_subscription(ORB_ID(debug_vect_one))),
_debug_time(0)
{}bool send(const hrt_abstime t)
{
struct debug_vect_one_s debug = {};if (1) {
mavlink_debug_vect_one_t msg = {};msg.timestamp = debug.timestamp;
//memcpy(msg.name, debug.name, sizeof(msg.name));
/* enforce null termination */
//msg.name[sizeof(msg.name) - 1] = '\0';
msg.x = 1;
msg.y = 2;
msg.z = 3;mavlink_msg_debug_vect_one_send_struct(_mavlink->get_channel(), &msg);
return true;
}return false;
}
};
#endif -
在附加流类中添加该自定义项
1
2
3
4
5
StreamListItem *streams_list[] = {
...
StreamListItem(&MavlinkStreamDebugVectOne::new_instance, &MavlinkStreamDebugVectOne::get_name_static, &MavlinkStreamDebugVectOne::get_id_static)
};
- 添加自定义消息的头文件
-
- 在mavlink_main.cpp中加入自定义消息的更新频率:
1
configure_stream(
"DEBUG_VECT_ONE"
, 50.0f);
- 在mavlink_main.cpp中加入自定义消息的更新频率:
- 通过串口助手查看定义的新消息,其ID为1001
E9 03即为新加的消息ID。