IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 示例:添加与编译一个mavlink(test.xml) -> 正文阅读

[Python知识库]示例:添加与编译一个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的编号和这个消息的结构体的函数。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:24:46  更:2021-08-31 15:27:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 14:04:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码