通过Mavlink消息请求数据流
参考网页:从自动驾驶仪请求数据 — 开发文档 (ardupilot.org)
![](https://img-blog.csdnimg.cn/923544145be34d3ba3f0c3cdd0e22ea7.png)
在这里我们使用Mavlink的REQUEST_DATA_STREAM 消息来获取我们需要的数据流(此消息可以设置数据流的频率),然后再数据流中解析我们需要的数据,整个过程分为请求数据、解析数据两步。
第一步:利用mavlink消息请求数据流
利用mavlink源码Common文件夹下的mavlink_msg_request_data_stream.h文件中的mavlink_msg_request_data_stream_pack函数,具体如下:
![](https://img-blog.csdnimg.cn/28d794b293b8479ca682ed9ca3b30f5b.png)
函数中的每个参数的说明如下:
![](https://img-blog.csdnimg.cn/1639f17936154a198beebe2d8514662b.png)
system_id发送端的系统id;target_system目标(接收端)的系统id。系统id是用来区分系统中的不同个体的,常用于多机编队中,因为此时需要详细确认发送方和接收方的身份。mavlink最多允许一个系统中存在255个id。
component_id发送组件的id;target_component目标组件id,这是用来区分同一个体中不同组件的,如区分地面站cpu发给机载gpu,或地面站cpu发给机载imu。这个id可以明确消息的发送源和接收方。0代表发送给目标系统的所有组件。
函数的参数设置:
system_id 自己系统的ID,先设为255
component_id 发送组件的id,设为190,通过Mavlink官网中的MAV_COMPONENT可以看到190表示地面站MAV_COMP_ID_MISSIONPLANNER
![](https://img-blog.csdnimg.cn/2eb6445e3feb46ca8aa809097d4471cd.png)
msg 通用的mavlink消息数据类型,用于存储打包后的结果,最后通过串口发送
target_system 该参数与自己所连接飞控有关,一般可以在飞控全部参数表里设置,如下图
![](https://img-blog.csdnimg.cn/fbe92b1f05ea467a8cc4a99e7c289fa6.png)
也可以通过读取心跳包来获得。
target_component 设置为1,表示发送给飞机的控制组件,也可以在MAV_COMPONENT中找到
![](https://img-blog.csdnimg.cn/a27689b026e64e7d943b784a134bb594.png)
req_stream_id 请求数据流的ID, 可以在MAV_DATA_STREAM中找到(对应的value值),在描述中有其数据流包含哪些数据的值
![](https://img-blog.csdnimg.cn/763d1f7392164c7584fb3be61fdb1e54.png)
req_mssage_rate 请求消息的频率Hz,自己设置为5
start_stop 1表示开始,0表示停止,设置为1
1.首先需要获得想要数据对应数据流的组别ID和消息ID
在参考网页的Using SRx Parameters部分可以找到自己需要的数据,及其属于的组别
也可以在Mavlink源码的common文件夹的common.h文件中的MAV_DATA_STREAM枚举的相应数据流的注释部分找到其包含的消息,其中MAV_DATA_STREAM_EXTRA1~3,注释为取决与飞控,通过搜索飞快的全部参数表(搜索EXTRA)可以看到,具体的数据流内容
![](https://img-blog.csdnimg.cn/137d5777a2844719b66f7dbaacf0105c.png)
如:想要获得GPS数据,GLOBAL_POSITION_INT消息,属于POSITION组,其数据流对应的ID在MAV_DATA_STREAM枚举中为MAV_DATA_STREAM_POSITION,
![](https://img-blog.csdnimg.cn/55aae06dada845e28e1757933900e07c.png)
然后点击GLOBAL_POSITION_INT,其会自动跳转到Mavlink官网中GLOBAL_POSITION_INT消息对应的消息ID(33),可以看到该消息的具体参数及说明,以用于解析该消息的数据。
![](https://img-blog.csdnimg.cn/337f51ce6a44443ca368f0d8bb4680cf.png)
从Mavlink源码的common.h文件夹的MAV_DATA_STREAM枚举中可以获得其消息组别ID为6
![](https://img-blog.csdnimg.cn/61dc5730d17b46aba5e9558aae0d0147.png)
然后利用mavlink_msg_request_data_stream_pack 函数,通过串口发送给飞控请求该组数据
请求部分代码:
![](https://img-blog.csdnimg.cn/4bff0612a16e402084d7165c4a57dc58.png)
在解析部分,先利用mavlink_parse_char函数,解析串口数据存在message
![](https://img-blog.csdnimg.cn/dc57c8242f6748e9b404b763c7c2af34.png)
根据message的msgid进行利用相应的解析函数进行解析,及对应消息的ID,如GLOBAL_POSITION_INT消息对应的消息ID(33),其对应的解析函数根据消息的名称可以在Mavlink源码的common文件夹的mavlink_msg_global_position_int.h中找到mavlink_msg_global_position_int_decode,在该文件的最上面也有消息的ID以及消息内部包含数据的说明
![](https://img-blog.csdnimg.cn/3efac363a08e421aa3f387d810ac3ebc.png)
解码部分代码:
![](https://img-blog.csdnimg.cn/e6abaa17d6bb4860810830139f5a2cf4.png)
![](https://img-blog.csdnimg.cn/edc1a359f49940ceb63caeb958ae92c8.png)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)