示例:添加与编译一个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)的主要内容,如果未能解决你的问题,请参考以下文章

Tower 实战一:MavLink的连接与通信

Mavlink - 无人机通讯协议

Mission PLanner地面站构架分析之MAVLINK航点读写

[pixhawk笔记]7-MAVLink消息机制

PX4模块设计之四十七:mavlink模块

PX4模块设计之四十七:mavlink模块