MAVLink功能开发


-----------------本文由“智御电子”提供,同时提供视频移植教程,以便电子爱好者交流学习。----------------


1.MAVLink简介##

MAVLink是一种针对微型飞行器,推出的轻量化,仅由头文件信息编码而成的软件通信协议库。

MAVLink遵循一种混合发布和点对点设计模式:主要的信息可以作为主数据流向多个目标目标进行发送,而一些子协议如(mission protocol或者parameter protocol)可以采用点对点通信模式,利用重传机制进行可靠的数据传输。

MAVLink的信息包(各种数据包类型的组合如姿态信息包、GPS信息包)都是定义在XML格式的原始文件中。利用这个XML文件可以生成如下支持语言的MAVLink源代码。针对不同的的应用场合,XML文件也被定义了多种。比如针对绝大多数的地面站系统和自动驾驶系统,这样一些系统所需要的信息包类型就被定义一种取名为“common.xml”文件中。

MAVLink最早是在2009年由Lorenz Meier发布的第一版本,并且有有一群贡献者参与其中。

因为MAVLink不需要额外的设计框架要求,所以它非常适合在一些通信带宽有限的程序中使用。比如用XML文件生产的C语言源代码非常适合用在RAM或者flash受限制的嵌入式系统中。目前MAVLink已经在许多的产品中被用来作为不同设备制造商之间通信的接口而得到应用和验证。

支持生成的语言

MAVLink2 可以生成如下语言

  • C
  • C++11
  • Python

MAVLink1可以生成如下语言

  • C
  • C#
  • Objective C
  • Java
  • JavaScript
  • Lua
  • Swift
  • Python

XML文件种类:

  • common.xml
  • ardupilotmega.xml
  • ASLUAV.xml
  • autoquad.xml
  • icarous.xml
  • matrixpilot.xml
  • minimal.xml
  • paparazzi.xml
  • python_array_test.xml
  • slugs.xml
  • standard.xml
  • test.xml
  • ualberta.xml
  • uAvionix.xml

2.开发流程

本文依据官方开发文档,一步步完成MAVLink的开发。从获取文档、生产源代码到最后的代码工程实例(STM32 KEIL C工程)。

2.1 安装MAVLink工具链

首先需要安装MAVLink相关的工具链:包括XML信息文件、GUI/命令行工具。利用这些工具来获取到MAVLink的源代码。

使用到的工具链如下:

  • Python 2.7+ or Python 3.3+
  • Python future module
  • (Optional) Python TkInter module (required to use the GUI tool).
  • PYTHONPATH environment variable must be set to the directory path containing the mavlink repository.

安装步骤:

  • 安装windows版本Python 2.7+ or 3.3+ (Python for Windows

    根据自己的电脑版本下载版本,本文下载Python3.6.5、64bit、version号为“Windows x86-64 executable installer”安装文件进行安装。如下图所示

    到安装程序的页面时,勾选上“Add Python 3.6 to PATH”,将path的路径添加到系统的环境变量中。后面直接就直接下一步即可。

  • 安装future模块

    键盘输入“win+R”调出“运行”界面,输入“CMD”调出命令行界面。

    接着输入“pip install future”命令。会发现开始安装这个模块,一般安装完即可。如下图所示

    如果出现如下图所示的提示,按照其推荐的命令“python -m pip install --upgrade pip”输入即可。

  • 安装Git

    Git是目前世界上最先进的分布式控制版本系统,主要是代码管理。我们这边主要是利用这个Git工具将MAVLink的代码及生成器下载下来。Git官方点击下载

    选择自己合适的电脑版本,进行一路安装,注册账户即可。新建一个文件夹,在文件夹中右击鼠标出现如下图标。点击Git GUI Here.

    在出现的命令行中输入“git clone https://github.com/mavlink/mavlink.git --recursive”。此时git从远程代码仓库中下载代码。如下图所示

    最终得到如下的源代码。

  • 添加MAVLink文件夹路径

    将下载好的源代码所在的文件夹路径添加到python环境变量中。 打开windows命令行,输入如下命令。

    set PYTHONPATH=C:\your_path_to_mavlink_clone

  • 生成需要的语言代码

    在下载好的GIT源代码中,可以发现MAVLink生成器“mavgenerate.py”,它是一个GUI图形界面。我们可以操作这个图像界面获取到想到的语言代码。

    在windows命令行中继续输入如下命令,用来执行“mavgenerate.py”脚本。出现如下的GUI。

    python -m mavgenerate

    根据自己的目标应用场景选择目标XML文件。本文选择“mavlink\message_definitions\v1.0\common.xml”

    设置out保存路径;选择C语言,协议2.0。点击生成即可。到相应的out目录就会发现生成好的C语言代码。

  • KEIL工程移植

    本文利用STM32F4的控制板的PX4控制板,并且利用cubeMX进行工程配置来实现MAVLink的移植。最终实现PX4控制板与QGC上位机的通信,以此来验证MAVLink是否成功移植。

    1.因为转换的C语言代码都是以.h的文件夹实现的,所以把上图的文件包含到工程路径中,并且包含如下的头文件即可包含全部实现的

    #include <mavlink/mavlink.h>

    接着利用cubeMx进行串口的配置,我们使用中断DMA接收与普通轮询模式发送。不是本文重点,不做描述,可百度,亦可有兴趣观看视频。

    接着我们可以在keil工程里面全局编译一下,会发现好多的错误。这个错误跟编译器有关。一种方式是直接修改每一个错误,可以自行百度“mavlink移植 ”;当然还有一种方法,是在工程配置中加入如下配置:

    --no_strict --gnu

    目的是想让MAVLink这段代码采用gun的格式进行编译,但是要注意其他的代码需要保证是使用的keil的默认编译器__CC_ARM进行编译。再次编译会发现没有错误。

    2.接着就是实现发送、接收数据的底层函数。

    C MAVLink库的实现的多通道的数据流,同样的程序可以在不同的独立通道流上进行传输。如果只存在一个MAVLink数据流,channel 0默认被用来进行数据传输(MAVLINK_COMM_0)

    接收数据的处理函数是在MAVLink的 mavlink_helpers.h:mavlink_parse_char()函数里面实现的。这个函数实际上需要在每次接收到一个字节数据的时候调用它来解析的信息,直到一个完整的数据包被解析完成。

    发送数据可以用mavlink_msg_*_pack()这些函数,然后调用mavlink_helpers.h:mavlink_msg_to_send_buffer()进行序列化。同时,为了方便,MAVLink为每一种类型的传输数据都定义了一个函数,例如mavlink_msg_raw_imu_send。想要发送IMU数据调用这个函数即可。

    那我们移植需要关系的是这些函数最后是调用什么的底层硬件接口进行真正的数据传送的。其实最后是调用的_mavlink_send_uart(mavlink_channel_t chan, const char *buf, uint16_t len)这个函数。在这个函数里面有2种底层方式进行数据传送:多字节和单字节。我们来实现多字节。

    首先,定义宏

    #define MAVLINK_USE_CONVENIENCE_FUNCTIONS // 移植必须要设定这个宏,详见代码

    #define MAVLINK_SEND_UART_BYTES mavlink_send_uart_bytes //mavlink_send_uart_bytes是我们用户自己需要实现的底层代码。

     void mavlink_send_uart_bytes(mavlink_channel_t chan, const uint8_t *ch, int  length)
    {
    HAL_UART_Transmit(&huart8, (uint8_t *)ch, length, 2000);
    }

    3.到这边基本移植都差不多了。本文在main中做了一个mavlink_test()测试函数用于发数据给上位机,

    void mavlink_test(void)
    {
    static uint16_t test_count=0;
    mavlink_message_t lastmsg;
    test_count++;
    //5hz
    if((test_count%100)==0)
    {
    mavlink_test_heartbeat2(1,1,&lastmsg);
    }
    if((test_count%50)==0)
    {
    mavlink_test_raw_imu2(1,1,&lastmsg);
    }
    }

    同时利用ringbuffer接收数据,然后在main中实时解析Loop_Mavlink_Parse()上位机发送过来的数据。

    void Loop_Mavlink_Parse(void)
    {
    if(Mavlink_RB_IsOverFlow())
    {
    Mavlink_RB_Clear();
    }
    while(Mavlink_RB_HasNew())
    {
    uint8_t read = Mavlink_RB_Pop();
    if(mavlink_parse_char(MAVLINK_COMM_0, read, &msg, &status))
    {
    //信号处理函数
    Mavlink_Msg_Handle(msg);
    //printf("Received message with ID %d, sequence: %d from component %d of system %d", msg.msgid, msg.seq, msg.compid, msg.sysid);
    }
    }
    }

    最后实际测试移植成功。

更多细致的移植教程可以查看发布的视频。请点击

MAVLink功能开发,移植教程。的更多相关文章

  1. Java支付宝PC网站支付功能开发(详细教程)

    一.前言 本案例使用的是Java实现的.使用支付宝的沙盒环境示例.发布需要换成正式环境.这里就不作详细说明了 本代码适合用来做参考,不要直接复制去使用. 没有账号的需要去平台注册一个: 登录支付宝开发 ...

  2. .NET开发邮件发送功能的全面教程(含邮件组件源码)

    今天,给大家分享的是如何在.NET平台中开发“邮件发送”功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         ...

  3. 移植QT5.6到嵌入式开发板(史上最详细的QT移植教程)

    目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtopia ,但是目前 Qt 已经发展到最新的 5.7 版本了,我个人也已经使用了很长一段时间的 qt5.6 for w ...

  4. go语言实战教程之 后台管理页面统计功能开发(2)

    上节内容介绍了后台管理页面统计功能开发(1),从功能介绍,到接口请求分析和归类,最后是代码设计.经过上节内容的介绍,已经将业务逻辑和开发逻辑解释清楚,本节内容侧重于编程代码实现具体的功能. 当日增长数 ...

  5. go语言实战教程之 后台管理页面统计功能开发(1)

    本节内容我们将学习开发实现后台管理平台页面统计功能开发的功能接口,本章节内容将涉及到多种请求路由的方式. 功能介绍 后台管理平台不仅是功能管理平台,同时还是数据管理平台.从数据管理平台角度来说,在管理 ...

  6. Go语言学习教程:管理员登录功能开发

    学习完了数据库操作的知识以后.本节内容,我们将实现管理员登陆功能,涉及到多个模块的代码实现和逻辑处理,以及数据库表的操作,都将在本节内容中进行实现. 管理员结构体定义 首先我们要定义管理员这个实体的结 ...

  7. C#微信公众号开发系列教程三(消息体签名及加解密)

    http://www.cnblogs.com/zskbll/p/4139039.html C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C ...

  8. Mac下搭建php开发环境教程

    方案一:原生安装 这篇文章主要介绍了Mac下搭建php开发环境教程,Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例,需要的朋友可以参考 ...

  9. C#微信公众号开发系列教程五(接收事件推送与消息排重)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

随机推荐

  1. cookie的初识和运用(js和jq)

    cookie是什么 cookie是浏览器提供的一种机制,它将document 对象的cookie属性提供给JavaScript.可以由JavaScript对其进行控制,而并不是JavaScript本身 ...

  2. percona toolkit之slave工具

    1:pt-slave-find ,主要是查找MySQL的层级,其实我感觉这个用处不是很大,因为层级比较多架构本身就很少,查看从库的话一般情况我们可以通过show slave hosts查看(不过不能显 ...

  3. viirtualBox显示不了Ip并且无法上网的解决方式

      首先描述下我自己遇到的问题:就是在virtualBox下的ubuntu系统下,输入ifconfig,没有显示出ip,显示出了eth3,lo的相关信息.在网上也找了相关信息还是无法解决,终于在老大的 ...

  4. Oracle物化视图详解

    现实工作中会有多个数据源同步到一个数据库完成数据分析的场景,这些数据可以不是实时同步的,我们一般通过定时任务抽取数据到统计分析库给应用使用. 一般的同步方式可以通过时间戳做全量和增量数据同步(存在原数 ...

  5. Access 64-bit HKLM\Software Registry by 32-bit C#.NET Application

    http://www.codeproject.com/Articles/1003177/Access-bit-HKLM-Software-Registry-by-bit-Csharp-NE While ...

  6. .net 面向对象程序设计深入](2)UML

    1.用例图简介 定义:用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 类型:动态图 应用:需求分析阶段 2.用例图元素 2.1 参与者(Ac ...

  7. jsp 页面显示格式化的日期

    在页面引入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 使用 ...

  8. (五)多点触控之兼容ViewPager

    在上一篇文章中,自定义的ZoomImageView已经实现了自由缩放,自由移动以及双击放大与缩小的功能.已经可以投入使用这个控件了.下面我们就在ViewPager中使用这个控件.如果你还没读过上一篇文 ...

  9. Struts2注解 及 约定优于配置

    Struts2注解 1 Struts2注解的作用 使用注解可以用来替换struts.xml配置文件!!! 2 导包 必须导入struts2-convention-plugin-2.3.15.jar包, ...

  10. 【[SHOI2015]脑洞治疗仪】

    我太sb啦 合并的时候又漏了,又漏了,又漏了 我个sb 这是个板子题,并不知道为什么SHOI2015会考这么板子的题,但是我又sb了,又sb了,又sb了,又没有1A 显然我是凉了 这道题有三个操作 区 ...