博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中
阅读量:4084 次
发布时间:2019-05-25

本文共 5185 字,大约阅读时间需要 17 分钟。

说实话  恒久力行  这个我也看到很多次了

摘自:

STM32控制APM飞控(二)MAVLINK源码集成到stm32工程中

2017-11-01 15:56:23 3900

分类专栏: 文章标签:

MAVLINK协议源码集成到32工程中

一.MAVLINK代码转化为C语言源码文件

主要根据 http://www.cnblogs.com/lovechen/p/5801679.html (作者:恒久力行)的方式,我进行归纳简要说明!

1.首先进入 MAVLINK官网( http://qgroundcontrol.org/mavlink/start ),下拉到MAVLINK Code and Generator处,如下图,得到 mavlink源码有多种途径,这里选取用python生成。即点击MAVLink Generator (C/C++, Python)

2.然后进入如下界面,读懂英文解释,说的是生成的方法和步骤

 

3. 然后点击clone and downed里面的download zip 即可下载 下载好后解压,然后直接运行mavlink-master 里 mavgenerate.py(python环境自己安装,这里不讲)

然后进入如下界面

然后,

 点击第一个browse选择message_definitions文件夹里面的v1.0里面的common.xml

然后自己选择输出路径我这里选的新建文件夹

language选择C

protocol选择1.0

然后直接点generate生成

到此材料准备完毕。

 

二.MAVLINK源码移植到32工程中

1.找到正点原子带有串口例子的工程或者UCOSIII系统工程或者其他RTOS实时操作系统都可以,然后将刚才生成的文件拷贝过来,如图:

然后在KEIL软件中,将所有拷贝过来的文件和头文件目录添加好,如图:

 

2.在main函数中添加#include "mavlink.h"如下:

 

然后编译

"..\OBJ\USART.axf" - 30 Error(s), 17 Warning(s).

一个一个解决。

错误一:

..\MAVLINK\common\../mavlink_types.h(53): error:  #20: identifier "pack" is undefined

解决方法:

将mavlink_types.h中

  1. #define MAVPACKED( __Declaration__ ) __pragma( pack(push,1)) __Declaration__ __pragma( pack(pop))

改为

  1. #define MAVPACKED( __Declaration__ ) __Declaration__

这里不使用对齐字节了,直接用也是一样的。

编译后:

"..\OBJ\USART.axf" - 30 Error(s), 7 Warning(s).

 

错误二:

..\MAVLINK\common\../mavlink_types.h(54): error:  #3092: anonymous unions are only supported in --gnu mode, or when enabled with #pragma anon_unions

解决方法:

根据提示信息在mavlink_types.h的前面加入#pragma anon_unions

编译后:

"..\OBJ\USART.axf" - 30 Error(s), 8 Warning(s).

 

错误三:

..\MAVLINK\common\../checksum.h(34): warning:  #260-D: explicit type is missing ("int" assumed)

包括后面很多错误都有共同点,指向有inline的行,这里是因为mdk中无法识别inline

解决方法:

在checksum.h加入一行代码定义inline

  1. #defineinline __INLINE

 

编译后:

"..\OBJ\USART.axf" - 4 Error(s), 195 Warning(s).

 

错误四:

..\MAVLINK\common\../mavlink_conversions.h(167): error:  #268: declaration may not appear after executable statement in block

解决方法:

指向定义的变量,将变量的定义放到函数的最前端(四个错误都是这种错误)

以前mavlink_conversions.h的代码

  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  4. if(tr >0.0f){
  5. float s = sqrtf(tr +1.0f);
  6. quaternion[0]= s *0.5f;
  7. s =0.5f/ s;
  8. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  9. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  10. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  11. }else{
  12. /* Find maximum diagonal element in dcm
  13. * store index in dcm_i */
  14. int dcm_i =0;
  15. int i;
  16. for(i =1; i <3; i++){
  17. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  18. dcm_i = i;
  19. }
  20. }
  21.  
  22. int dcm_j =(dcm_i +1)%3;
  23. int dcm_k =(dcm_i +2)%3;
  24.  
  25. float s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  26. dcm[dcm_k][dcm_k])+1.0f);
  27. quaternion[dcm_i +1]= s *0.5f;
  28. s =0.5f/ s;
  29. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  30. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  31. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  32. }
  33. }

更改后 mavlink_conversions.h 的代码

  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(constfloat dcm[3][3],float quaternion[4])
  2. {
  3. int dcm_j,dcm_k;
  4. float s;
  5. float tr = dcm[0][0]+ dcm[1][1]+ dcm[2][2];
  6. if(tr >0.0f){
  7. float s = sqrtf(tr +1.0f);
  8. quaternion[0]= s *0.5f;
  9. s =0.5f/ s;
  10. quaternion[1]=(dcm[2][1]- dcm[1][2])* s;
  11. quaternion[2]=(dcm[0][2]- dcm[2][0])* s;
  12. quaternion[3]=(dcm[1][0]- dcm[0][1])* s;
  13. }else{
  14. /* Find maximum diagonal element in dcm
  15. * store index in dcm_i */
  16. int dcm_i =0;
  17. int i;
  18. for(i =1; i <3; i++){
  19. if(dcm[i][i]> dcm[dcm_i][dcm_i]){
  20. dcm_i = i;
  21. }
  22. }
  23.  
  24. dcm_j =(dcm_i +1)%3;
  25. dcm_k =(dcm_i +2)%3;
  26.  
  27. s = sqrtf((dcm[dcm_i][dcm_i]- dcm[dcm_j][dcm_j]-
  28. dcm[dcm_k][dcm_k])+1.0f);
  29. quaternion[dcm_i +1]= s *0.5f;
  30. s =0.5f/ s;
  31. quaternion[dcm_j +1]=(dcm[dcm_i][dcm_j]+ dcm[dcm_j][dcm_i])* s;
  32. quaternion[dcm_k +1]=(dcm[dcm_k][dcm_i]+ dcm[dcm_i][dcm_k])* s;
  33. quaternion[0]=(dcm[dcm_k][dcm_j]- dcm[dcm_j][dcm_k])* s;
  34. }
  35. }

 

以前mavlink_helpers.h的代码

  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  4.  
  5. uint8_t*ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  6.  
  7. ck[0]=(uint8_t)(msg->checksum &0xFF);
  8. ck[1]=(uint8_t)(msg->checksum >>8);
  9.  
  10. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  11. }

更改后 mavlink_helpers.h 的代码

  1. MAVLINK_HELPER uint16_t mavlink_msg_to_send_buffer(uint8_t*buffer,constmavlink_message_t*msg)
  2. {
  3. uint8_t*ck;
  4. memcpy(buffer,(constuint8_t*)&msg->magic, MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  5.  
  6. ck = buffer +(MAVLINK_NUM_HEADER_BYTES +(uint16_t)msg->len);
  7.  
  8. ck[0]=(uint8_t)(msg->checksum &0xFF);
  9. ck[1]=(uint8_t)(msg->checksum >>8);
  10.  
  11. return MAVLINK_NUM_NON_PAYLOAD_BYTES +(uint16_t)msg->len;
  12. }

编译后:

"..\OBJ\USART.axf" - 0 Error(s), 195 Warning(s).

 

解决所有警告的方法:

将protocol.h里面的旧代码

  1. #define _MAV_RETURN_char(msg, wire_offset)(constchar)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_int8_t(msg, wire_offset)(constint8_t)_MAV_PAYLOAD(msg)[wire_offset]
  3. #define_MAV_RETURN_uint8_t(msg, wire_offset)(constuint8_t)_MAV_PAYLOAD(msg)[wire_offset]

去掉const,改为

  1. #define _MAV_RETURN_char(msg, wire_offset)(constchar)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define_MAV_RETURN_int8_t(msg, wire_offset)(int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  3. #define_MAV_RETURN_uint8_t(msg, wire_offset)(uint8_t)_MAV_PAYLOAD(msg)[wire_offset]

编译后:

"..\OBJ\USART.axf" - 0 Error(s), 0 Warning(s).

你可能感兴趣的文章
缓存篇-Redisson的使用
查看>>
phpquery抓取网站内容简单介绍
查看>>
找工作准备的方向(4月22日写的)
查看>>
关于fwrite写入文件后打开查看是乱码的问题
查看>>
用结构体指针前必须要用malloc,不然会出现段错误
查看>>
Linux系统中的美
查看>>
一些实战项目(linux应用层编程,多线程编程,网络编程)
查看>>
我觉得专注于去学东西就好了,与世无争。
查看>>
原来k8s docker是用go语言写的,和现在所讲的go是一个东西!
查看>>
STM32CubeMX 真的不要太好用
查看>>
STM32CubeMX介绍、下载与安装
查看>>
电机和桨叶要搭配选择
查看>>
不要买铝合金机架的无人机,不耐摔,易变形弯曲。
查看>>
ACfly也是基于FreeRTOS的
查看>>
F330装GPS的位置
查看>>
我想先用三个或者五个激光测距做无人机的室内定位和避障
查看>>
pixhawk也可以用Airsim仿真
查看>>
《无人机电机与电调技术》可以看看
查看>>
我发现七月在线的GAAS课程基本都讲到了
查看>>
电机堵转
查看>>