移植mavlink协议到STM32详细教程

1准备材料,

首先准备一个带串口的stm32程序(这里选用整点原子的官方串口例程这里自己去找不讲),然后去mavlink官网下载mavlink源码,这里重点讲解这里

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

b.然后进入如下界面,点击网址,下面是生成的方法和步骤都写有

c.然后点击clone and downed里面的download zip 即可下载

下载好后解压,然后直接运行mavlink-master里面的mavgenerate.py(python环境自己安装,这里不讲)

然后进入如下界面



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

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

language选择C

protocol选择1.0

然后直接点generate生成

到此材料准备完毕。


2开始真正的移植工作

a.在串口实验里新建一个MAVLINK文件夹,并将刚才生成的文件拷贝过来,如图

打开工程新建分组,将所有拷贝过来的文件和头文件目录添加好,具体这里就不讲了,添加好后如图

b.在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. #define inline __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(const float 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. int dcm_j = (dcm_i + 1) % 3;
  22. int dcm_k = (dcm_i + 2) % 3;
  23. float s = sqrtf((dcm[dcm_i][dcm_i] - dcm[dcm_j][dcm_j] -
  24. dcm[dcm_k][dcm_k]) + 1.0f);
  25. quaternion[dcm_i + 1] = s * 0.5f;
  26. s = 0.5f / s;
  27. quaternion[dcm_j + 1] = (dcm[dcm_i][dcm_j] + dcm[dcm_j][dcm_i]) * s;
  28. quaternion[dcm_k + 1] = (dcm[dcm_k][dcm_i] + dcm[dcm_i][dcm_k]) * s;
  29. quaternion[0] = (dcm[dcm_k][dcm_j] - dcm[dcm_j][dcm_k]) * s;
  30. }
  31. }

更改后mavlink_conversions.h的代码

  1. MAVLINK_HELPER void mavlink_dcm_to_quaternion(const float 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. dcm_j = (dcm_i + 1) % 3;
  24. dcm_k = (dcm_i + 2) % 3;
  25. 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_helpers.h的代码

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

更改后mavlink_helpers.h的代码

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

编译后:

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


解决所有警告的方法:

将protocol.h里面的旧代码

  1. #define _MAV_RETURN_char(msg, wire_offset) (const char)_MAV_PAYLOAD(msg)[wire_offset]
  2. #define _MAV_RETURN_int8_t(msg, wire_offset) (const int8_t)_MAV_PAYLOAD(msg)[wire_offset]
  3. #define _MAV_RETURN_uint8_t(msg, wire_offset) (const uint8_t)_MAV_PAYLOAD(msg)[wire_offset]

去掉const,改为

  1. #define _MAV_RETURN_char(msg, wire_offset) (const char)_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).

3开始更改底层串口代码

待续。。。


来自为知笔记(Wiz)

时间: 08-21

移植mavlink协议到STM32详细教程的相关文章

IOS 公司开发者账号申请详细教程

谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,申请流程相对比较麻烦一下,$99. 企业账号:一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上.$299. 介于这几天忙于公司账号的申请,我把详细的申请过程经历,包括容易放的错误,

Nginx反代超详细教程:加速网站Google、Gravatar和Hostloc

VPS教程 » Nginx反代超详细教程:加速网站Google.Gravatar和Hostloc Nginx反代超详细教程:加速网站Google.Gravatar和Hostloc December 31st , 2015•Edit•访问: 672 次 nginx 这个轻量级.高性能的 web server 主要可以干两件事情: 1.直接作为http server(需要Fastcgi配合): 2.作为反代服务器(进一步可以实现均衡负载). 这里主要利用一下反功能来方便一下日常生活.选择Gravat

【原创】车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程

[原创]车载实时路况信息接收终端移植于Smart210开发板 --- 综合教程 所用工具: windows电脑 Ubuntu12.04 Smart210开发板 4g以上SD卡 U盘 步骤: 1.      用SD卡烧写Linux系统到smart210开发板,开机測试烧写过的Linux,确保能够正常执行.(能够參考开发板光盘中带的资料) 2.      在windows系统下安装QT并配置,建立一个简单的QTproject演示样例測试QT.把路况信息接收端源代码拷贝到一个不包括中文字符的路径下,进

XAMPP和Bugfree详细教程

一.XAMPP安装配置 xampp是一款跨平台的集成 apache + mysql + php环境,是的配置AMP服务器变得简单轻松,支持windows,solaris, 下载地址:http://sourceforge.net/projects/xampp/files/ 启动apache和mysql服务,如果apache不能成功启动,最大原因是80端口被占用(),把占用端口的进程关掉即可. xampp默认安装路径为:C:\xampp   解决方案:运行在cmd中运行 (安装目录)apache/b

【转载】GitHub详细教程

1 Git详细教程 1.1 Git简介 1.1.1 Git是何方神圣? Git是用C语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容.举个例子,你可以将文件集合转换到两天之前的状态,或者你可以在生产代码和实验性质的代码之间进行切换.文件集合往往被称作是“源代码”.在一个分布版本控制系统中,每个人都有一份完整的源代码(包括源代码所有的历史记录信息),而且可以对这个本地的数据进行操

IOS 公司开发者账号申请详细教程---【转载】

IOS 公司开发者账号申请详细教程 谈到苹果开发者账号,我们需要区分一下个人账号.公司账号和企业账号这三种,还有一种是教育账号,这个就不多说了. 个人账号:个人申请用于开发苹果app所使用的账号,仅限于个人使用,申请比较容易,$99. 公司账号:以公司的名义申请的开发者账号,用于公司内部的开发者共用,申请流程相对比较麻烦一下,$99. 企业账号:一般是公司规模在500人以上的企业,用于内部测试发布的账号,该账号发布的应用不发布在appstore上.$299. 介于这几天忙于公司账号的申请,我把详

Apple Pay接入详细教程

Apple Pay接入详细教程 来源:Yasin的简书 链接:http://www.jianshu.com/p/738aee78ba52# Apple Pay运行环境:iPhone6以上设备,操作系统最低iOS9.0以上,部分信息设置需要iOS9.2以上.目前还不支持企业证书添加. 环境搭建好后可以在模拟器上面运行,xcode7.2.1+iPhone6SP9.2系统下,系统会绑定几种虚拟的银行卡,和几个联系人,方便调试,支付也不会发生真实的付款,真的很方便. [TCO] 准备工作 在接入Appl

SQLServer2005数据导入到Mysql详细教程

SQL SERVER数据导入MYSQL 工具: navicat for mysql 百度搜一个安装就可以,前提是你已经安装了mysql 1,创建目标数据库 点击创建好的目标数据库website点的表一项,在右边会出现导入向导 选择"导入向导"中ODBC,点击下一步 3.创建正确的SQL SERVER数据库ODBC 下一步,数据链接属性-SQL SERVER ODBC 下一步 创建访问SQL SERVER ODBC 并且测试成功连接属性 4.通过Navicat软件导入工具实现导入 下一步,回到导入

Mavlink协议理解

来源:blog.csdn.net/super_mice/article/details/44836585 之前看了mavlink协议,网上关于mavlink的资料不多.本文大概总结了下对mavlink协议的理解.以下如不说明都是说mavlink v1.0版本. 首先附上mavlink的各个消息的简介https://pixhawk.ethz.ch/mavlink/(这里的内容很多,建议大概了解mavlink后再去浏览), mavlink协议介绍http://qgroundcontrol.org/m