打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
「原创连载」EEDrone开源四旋翼从零开始(11)--Mavlink例程
上期回顾:EEDrone开源四旋翼从零开始(10)--四旋翼控制分析
MavLink是一个专门用于飞行器的通讯协议,其主要作用就是将数据拆分成字节,然后在另一端将其还原成数据,之前的小车我也使用了一套自己的通讯协议,但是MavLink形成了一种标准,很多的飞行器地面站都遵循这个协议。
MavLink简介:
MavLink的介绍网上很多,这里还是推荐官网的,请点击这里,MavLink现在主要分为V1.0版本和V2.0版本,V2.0支持的功能更多,但是数据包也更大,而且V1.0不再更新了,官网介绍请点击这里,V2.0是可以支持V1.0的,但是目前MissionPlanner地面站两个版本都支持的,接下来就以V1.0来进行实验。
MavLink移植:
MavLink不是直接用C/C++语音写成的,但是却提供了转化后的代码,V1.0版本的官方C代码请点击这里,全都是.h头文件,这给移植带来了方便,下载后库文件如下图所示:
多个文件夹,适用于不同的飞行器种类,比如第一个就是APM,这里使用通用的库,也就是复制“common”文件夹和下面的头文件到工程,然后在IAR中添加包含路径。
在IAR下新建一个例程的文件夹如下:
相关的方法在前面介绍过了,这里将整个工程简洁化了,整个工程基于FreeRTOS_Test,在此基础上添加一个mavlink.c和.h文件,首先在mavlink.c上添加
[C] 纯文本查看 复制代码
?
1
2
#include "mavlink.h"
mavlink_system_t mavlink_system;
然后编译出现错误,error:  #20: identifier"pack" is undefined,这个主要是文件中广泛使用了MAVPACKED这个宏定义,直接将其定义为空就好,在mavlink_types.h中注释下面的代码:
[C] 纯文本查看 复制代码
?
1
2
3
4
5
6
// Macro to define packed structures
//#ifdef __GNUC__
// #define MAVPACKED( __Declaration__ ) __Declaration__ __attribute__((packed))
//#else
// #define MAVPACKED( __Declaration__ ) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
//#endif
然后添加
[C] 纯文本查看 复制代码
?
1
#define MAVPACKED( __Declaration__ ) __Declaration__
再次编译出现警告,warning:  #191-D: typequalifier is meaningless on cast type,这个可以不管,或者更改protocol.h中的代码为:(就是去掉了const)
[C] 纯文本查看 复制代码
?
1
2
#define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
#define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]
修改后编译可以全部通过了。
MavLink实验:
MavLink的官网并没有详细的介绍用法,不过用法却是相当的简单,核心的代码如下:
[C] 纯文本查看 复制代码
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
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的发送函数了,将数据通过串口发送。这样之后就可以使用APM来测试了,打开APM,然后连接串口,会出现如下的界面,首先是连接成功,会显示连接信号,然后获取参数,直接点取消即可。
IAR可以直接修改变量的值,在LiveWatch中将欧拉角的变量添加进去,然后直接双击需要修改的数值即可修改参数,如下图所示:
修改参数后会在Mission Planner中反应出来,其中数值是用弧度来表示的,1.57代表90度。
源码:https://github.com/EEDrone/Firmware/tree/V0.05_Mavlink
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
QGC添加自定义组件和发送自定义MAVLINK消息-CSDN博客
S7-200与变频器的MODBUS RTU通讯
Delphi 12 & C++ Builder 12、RAD Studio 12发布
rad600
使用Matlab的工具箱,学习“相控阵雷达技术”
采用S7-200smart Modbus RTU 通信如何配置,一文全明白
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服