PX4飞控-自定义发送MavLink消息

news/2024/7/24 10:39:09 标签: linux, 嵌入式硬件, ubuntu

PX4飞控-自定义发送MavLink消息

一、自定义XML文件

在这里插入图片描述

如图所示。

这相当于定义了一个结构体,结构体里面就有一个类型为uint8_t的u8元素。

使用的id端口为150,这里注意不要与已经存在的id重复。

二、使用XML文件生成对应的头文件

在这里需要使用到一个工具mavlink_generator,它的安装方法比较简单。

在命令行依次输入下方命令即可完成安装:

git clone https://github.com/mavlink/mavlink.git

cd mavlink
    
git submodule update --init --recursive
    
python -m mavgenerate

之后会弹出下图界面:

在这里插入图片描述

点击第一个Browse,选择之前新建的XML文件。

点击第二个Browse,选择最终的输出文件夹。

将Language切换为C,其他保持默认。

最终选择界面如下图所示

在这里插入图片描述

点击Generate按钮,会弹出一个窗口,点击OK即可。

在这里插入图片描述

最后成功生成最终文件。

三、将生成的头文件添加到源代码中

在生成目录找到mavlink_msg_mytestmessage.h(这个文件名不是固定的,根据个人定义而不同。)

将这个文件复制到源代码/mavlink/include/mavlink/v2.0/common目录下。

同时在同目录的common.h文件中添加刚才复制的头文件。

在这里插入图片描述

四、 修改mavlink_messages.cpp文件

class MavlinkMytestMessage : public MavlinkStream
{
public:
	const char *get_name() const override
	{
		return MavlinkMytestMessage::get_name_static();
	}

	static constexpr const char *get_name_static()
	{
		return "MytestMessage";
	}

	static constexpr uint16_t get_id_static()
	{
		return MAVLINK_MSG_ID_TEST_TYPES;
	}

	uint16_t get_id() override
	{
		return get_id_static();
	}

	bool const_rate() override
	{
		return true;
	}

	static MavlinkStream *new_instance(Mavlink *mavlink)
	{
		return new MavlinkMytestMessage(mavlink);
	}

	unsigned get_size() override
	{
		return MAVLINK_MSG_ID_TEST_TYPES_LEN + MAVLINK_NUM_NON_PAYLOAD_BYTES;
	}

private:
	/* do not allow top copying this class */
	MavlinkMytestMessage(MavlinkMytestMessage &) ;
	MavlinkMytestMessage &operator = (const MavlinkMytestMessage &) ;

protected:
	explicit MavlinkMytestMessage(Mavlink *mavlink) : MavlinkStream(mavlink)
	{}
	~MavlinkMytestMessage()
	{}
    /* 发送函数 */
	bool send(const hrt_abstime t) override
	{
        /* 创建结构体 */
		mavlink_test_types_t test;
        /* 结构体变量赋值 */
		test.u8 = 150;
        /* 发送函数 */
		mavlink_msg_test_types_send_struct(_mavlink->get_channel(), &test);
		return true;
	}
};

mavlink_messages.cpp文件中添加如上面代码差不多的类。有一些地方需要对应起来,也可以参考这个文件中其他类的定义来进行修改和理解。

添加完自定义的类之后还需要修改static const StreamListItem streams_list这个列表。

这个列表里面存放着目前所有需要输出的Mavlink消息,可以根据自己的需要进行取舍,注释掉不需要的消息。

要发送自定义的消息,就需要把刚才自定义的类添加到这个列表中来。

在这里插入图片描述

五、 修改mavlink_main.cpp文件

需要在Mavlink::configure_streams_to_default(const char *configure_single_stream)这个函数里面添加要发送的消息。(位置差不多在函数尾处)

在这里插入图片描述

这个函数第二个参数是发送速率,可以通过修改它来更改发送速率。

六、 上传固件

编译已经修改过的源代码,并上传到飞行器中。之后查看Mavlink消息就会找到自己定义的消息了。

推荐测试的时候把其他所有消息全部注释,只留自己自定义的消息,这样可以更清晰的看到输出结果。

QGC地面站可能无法正常查看到自己自定义的消息,可能还需要进一步修改地面站的配置。所以这里还是推荐使用串口助手直接调试查看。


http://www.niftyadmin.cn/n/1286664.html

相关文章

胆小的俾格米小人儿!

在线demo Dome在这 由于兼容性的问题还没解决! 建议Chrome打开,建议Chrome打开,建议Chrome打开。 灵感来源 某天在观看TED演讲Aparna Rao High tech Art with a sense of humor的时候看到里面的一个项目叫做pygmies,中文名叫俾格米…

【MindSpore】简单使用Resnet50实现狗狼图片分类。附全部代码下载。

本文章用的例子来自MindSpore官网教程,这里主要是分享一下个人理解和整合一下相关代码。 个人博客网站查看 环境配置: windows10MindSpore1.6.1 CPU版本python3.9.0 一、数据集和预训练模型下载 数据集下载 预训练模型下载 注:以上链接…

2018-2019-1 20165231 《信息安全系统设计基础》第七周学习总结

教材学习内容总结 异常控制流 异常 异常类别: 中断陷阱故障终止中断处理: 陷阱处理: 故障处理: 终止处理: 进程 上周考试错题总结 错题1: read(fd, buf, 30)执行成功,返回可能不是30的是(&#…

箱子只有木质的吗_夏天的雨季频频,你的钢琴做好保养了吗?

说到夏天除了炎热,那就是雨季了下雨天真的是各种不方便就连小编家里的钢琴也出现了一些小毛病那今天我们来聊聊在雨季或者在某些环境下#我们应该怎样保养好我们的钢琴?#钢琴的养护一架钢琴一般能用20年时间,有的可用七八十年甚至更长。钢琴作…

华为云ModelAtrs创建GPU环境训练模型

华为云ModelAtrs创建GPU环境训练模型 个人博客网站 创建Notebook 首先需要创建新的Notebook 然后根据自己的训练需求选择要创建的镜像和规格。我这里选择mindspore的GPU进行创建,规格选择64GB的。 如果要选择SSH远程开发的话需要填写这个密钥对,没有的…

Linux基础命令 整理

Linux常用知识Linux基础命令整理Linux 命令重定向 /dev/null 2>&1|输出重定向Linux命令行:find的26个用法示例Linux-ssh证书登录(实例详解)https://www.cnblogs.com/JohnABC/p/4001383.html文件操作查找文件#查找文件 find / -name filename.txt …

python生成器与迭代器的区别_python生成器与迭代器的区别

详细内容对于list、string、tuple、dict等这些容器对象,使用for循环遍历是很方便的。在后台for语句对容器对象调用iter()函数。iter()是python内置函数。iter()函数会返回一个定义了next()方法的迭代器对象,它在容器中逐个访问容器内的元素。next()也是python内置函…

Atlas200DK环境配置

Atlas200DK环境配置 个人博客网站 dd镜像安装 推荐使用dd镜像安装环境,这种方式更快更方便。 直接去网站下载需要版本的dd镜像,然后利用Etcher烧录到sd卡中就行。 参考链接: Atlas 200DK样例速跑_哔哩哔哩_bilibili 更方便的200DK合设环…