请选择 进入手机版 | 继续访问电脑版

发现者模型阵地

 找回密码
 立即注册
查看: 98372|回复: 0
收起左侧

关于Mavlink

[复制链接]

20

主题

22

帖子

88

积分

注册会员

Rank: 2

积分
88
发表于 2019-3-20 09:32:41 | 显示全部楼层 |阅读模式
在很多地方看到Mavlink,一直不清楚是什么。后面小小学习了一下,把学习心得与大家交流探讨。
首先,Mavlink是一种协议。所谓协议,就是双方或多方约定好的一种沟通或者共同作业(协作)的规则。比如,我们平时说话,可以认为是一种协议。
那么Mavlink也是,也是一种约定。而且是一种数据包的约定。
学习过计算机编程的都知道,数据包一般会分为多少位(即数据包的大小),这些位有编号,然后指定各个位(或者某几位)上的0或者1代表什么意思。
MavLink是一个专门用于飞行器的通讯协议,其主要作用就是将数据拆分成字节,然后在另一端将其还原成数据,但是MavLink形成了一种标准,很多的飞行器地面站都遵循这个协议。

MavLink的介绍网上很多,这里还是推荐官网的,MavLink现在主要分为V1.0版本和V2.0版本,V2.0支持的功能更多,但是数据包也更大,而且V1.0不再更新了,V2.0是可以支持V1.0的,但是目前(2017年7月)MissionPlanner地面站两个版本都支持的。
MavLink不是直接用C/C++语音写成的,但是却提供了转化后的代码,V1.0版本的官方C代码请点击这里,全都是.h头文件,这给移植带来了方便。
MavLink的官网并没有详细的介绍用法,不过用法却是相当的简单,核心的代码如下:

for (;;){

vTaskDelay(10);

//send heart beat

mavlink_system.compid = MAV_COMP_ID_ALL;

mavlink_msg_heartbeat_pack(mavlink_system.sysid, mavlink_system.compid, &msg, system_type,autopilot_type, system_mode, custom_mode, system_state);

len = mavlink_msg_to_send_buffer(tx_buf, &msg);

vSerialPutString(0, ( signed char * )tx_buf,len);

//send IMU

mavlink_msg_attitude_pack(mavlink_system.sysid,mavlink_system.compid, &msg, HAL_GetTick(),

Euler_Value_Rad.Roll, Euler_Value_Rad.Pitch, Euler_Value_Rad.Yaw,

GYR_Value_Rad.Roll,GYR_Value_Rad.Pitch, GYR_Value_Rad.Yaw);

len = mavlink_msg_to_send_buffer(tx_buf, &msg);

vSerialPutString(0, ( signed char * )tx_buf,len);

}


代码内容,就是不断发送脉冲函数和IMU角度数据,任务10ms运行一次,mavlink_msg_attitude_pack这类函数就是将相关的数据打包放到msg里面,mavlink_msg_to_send_buffer这个函数是将msg的数据放到发送数组里面,同时计算出需要发送的数据量,vSerialPutString这个函数就是FreeRTOS的发送函数了,将数据通过串口发送。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|静修| 发现者模型 ( 粤ICP备2021018702号 备案查询:https://beian.miit.gov.cn )

GMT+8, 2022-12-5 16:52 , Processed in 0.044825 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表