示例:添加与编译一个mavlink(test.xml)
Posted XXX_UUU_XXX
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了示例:添加与编译一个mavlink(test.xml)相关的知识,希望对你有一定的参考价值。
MAVLINK 是个小型的数据通信协议,负责地面站和飞控本身的数据交互和地面站向飞控发送数据指令。
比如我们添加一个新的传感器,会把新的传感器数据发送回来和地面站交互,这时候就会涉及到自定义一个 MAVLINK 的消息包,自定义消息包的数据,发送给地面站来解析显示。对于 MAVLINK 这套系统,有对应的工具,来自动生成MAVLINK 的库函数,只要约定好消息包的结构体,我们就可以用相应的MAVLINK工具,来生成 MAVLINK 库的头文件和功能接口函数。
使用 MAVLINK GENERATOR(mavlink 生成器)
git clone https://github.com/mavlink/mavlink.git
cd mavlink
git submodule update --init --recursive
sudo apt-get install python3-tk
sudo pip3 install future
示例:
在mavlink/message_definitions/v1.0/目录下创建test.xml文件,id为0-255之间
<?xml version="1.0"?>
<mavlink>
<version>3</version>
<messages>
<message id="208" name="TEST_TYPES">
<description>Test all field types</description>
<field type="char" name="c">char</field>
<field type="char[10]" name="s">string</field>
<field type="uint8_t" name="u8">uint8_t</field>
<field type="uint16_t" name="u16">uint16_t</field>
<field print_format="0x%08x" type="uint32_t" name="u32">uint32_t</field>
<field type="uint64_t" name="u64">uint64_t</field>
<field type="int8_t" name="s8">int8_t</field>
<field type="int16_t" name="s16">int16_t</field>
<field type="int32_t" name="s32">int32_t</field>
<field type="int64_t" name="s64">int64_t</field>
<field type="float" name="f">float</field>
<field type="double" name="d">double</field>
<field type="uint8_t[3]" name="u8_array">uint8_t_array</field>
<field type="uint16_t[3]" name="u16_array">uint16_t_array</field>
<field type="uint32_t[3]" name="u32_array">uint32_t_array</field>
<field type="uint64_t[3]" name="u64_array">uint64_t_array</field>
<field type="int8_t[3]" name="s8_array">int8_t_array</field>
<field type="int16_t[3]" name="s16_array">int16_t_array</field>
<field type="int32_t[3]" name="s32_array">int32_t_array</field>
<field type="int64_t[3]" name="s64_array">int64_t_array</field>
<field type="float[3]" name="f_array">float_array</field>
<field type="double[3]" name="d_array">double_array</field>
</message>
</messages>
</mavlink>
在mavlink/目录下运行
python3 -m mavgenerate
选择xml文件,输出文件夹,语言选C,协议选2.0
生成后在mavlink/目录下生成test文件夹,将test文件夹下的mavlink_msg_test_types.h文件复制到Firmware/mavlink/include/mavlink/v2.0/common/目录下
修改Firmware/mavlink/include/mavlink/v2.0/common/common.h头文件,添加头文件
#include "./mavlink_msg_test_types.h"
修改 Firmware/src/modules/mavlink/mavlink_messages.cpp文件,添加类 MavlinkStreamMytest
class MavlinkStreamMytest: public MavlinkStream
{
public:
const char *get_name() const
{
return MavlinkStreamMytest::get_name_static();
}
static constexpr const char *get_name_static()
{
return "TEST_TYPES";
}
static constexpr uint16_t get_id_static()
{
return MAVLINK_MSG_ID_TEST_TYPES;
}
uint16_t get_id()
{
return get_id_static();
}
static MavlinkStream *new_instance(Mavlink *mavlink)
{
return new MavlinkStreamMytest(mavlink);
}
unsigned get_size() override
{
return MAVLINK_MSG_ID_TEST_TYPES_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES ; // commands stream is not regular and not predictable
}
private:
/* do not allow top copying this class */
MavlinkStreamMytest(MavlinkStreamMytest &);
MavlinkStreamMytest &operator = (const MavlinkStreamMytest &);
protected:
explicit MavlinkStreamMytest(Mavlink *mavlink) : MavlinkStream(mavlink){}
~MavlinkStreamMytest(){}
bool send(const hrt_abstime t)
{
mavlink_test_types_t test;
test.c = 8;
mavlink_msg_test_types_send_struct(_mavlink->get_channel(), &test);
return true;
}
};
在static const StreamListItem streams_list[] = {}中添加类,
create_stream_list_item<MavlinkStreamMytest>(),
修改Firmware/src/modules/mavlink/mavlink_main.cpp文件,设置频率
configure_stream("TEST_TYPES", 20.0f); //TEST_TYPES为mavlink_messages.cpp中添加的类中的值
编译/下载
make px4_fmu-v5_default upload
查看mavlink结果,ID
git https://github.com/ArduPilot/MissionPlanner
用Visual Studio打开MissionPlanner/ExtLibs/SimpleExample/SimpleEample.sln
运行
xml 文件定义了 mavlink 消息 ID 号,消息结构体数据类型
可以按照心跳包的消息格式,我们来在mavlink_messages.cpp写一个自己定义的消息,要在头文件里面添加好我们用mavlink generator生成的mavlink头文件,里面定义了消息ID的编号和这个消息的结构体的函数。
以上是关于示例:添加与编译一个mavlink(test.xml)的主要内容,如果未能解决你的问题,请参考以下文章