MAVLink功能开发,移植教程。

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);
          }
      }

    }

    ```

    最后实际测试移植成功。

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

原文地址:https://www.cnblogs.com/SC-Electronic/p/9379708.html

时间: 2024-10-13 09:24:42

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

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

ref: http://www.cnblogs.com/heyuquan/p/net-batch-mail-send-async.html 今天,给大家分享的是如何在.NET平台中开发"邮件发送"功能.在网上搜的到的各种资料一般都介绍的比较简单,那今天我想比较细的整理介绍下: 1)         邮件基础理论知识 2)         邮件发送相关.NET类库 3)         介绍我开发的一个发送邮件的小组件(MailHelper) 4)         MailHelper组

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

目前网上的大多数 QT 移植教程还都停留在 qt4.8 版本,或者还有更老的 Qtopia ,但是目前 Qt 已经发展到最新的 5.7 版本了,我个人也已经使用了很长一段时间的 qt5.6 for windows ,本文就来介绍一下QT在嵌入式环境的搭建. 移植以到 JZ2440 为例,使用韦老大提供的 ubuntu9.10 虚拟机作为移植环境.当然,其它虚拟机也是可以的,我同样在 ubuntu14.04 移植成功,只不过需要额外装一些库,后面我会简单提及. 此外,我尝试使用 4.3.2 版本的

网页播放器系列教程(四)--功能开发

(三)功能开发 接上文,我们现在开始编写Javascript代码,前文我们主文件已经引入了js文件,只需在js文件中编写代码. 1.播放音频: 怎样才能让页面播放音频呢?这需要"audio"标签,但是我们不是在页面总插入改标签,而是用JS实现,只需编写如下代码: var Musicaudion = document.createElement("AUDIO") Musicaudion.setAttribute('autoplay',true) document.bo

HBuilder开发App教程07-列表页

说明 接着上节的内容,本节讲首页的list页面, 如果看过上一节你就会明白"首页"是由只有头部的index页面和列表list页面组成的, 本节涉及到: 1.几种页面的打开方式 2.websql的应用 3.页面内容的加载 4.页面实现 几种页面打开方式 如果看过以前的章节你会明白,在Hbuilder,mui中需要放弃href跳转, 而专用mui自带的页面打开方式,为什么?请浏览:http://ask.dcloud.net.cn/article/122 这里大概讲一下,详细讲解请关注下一节

HBuilder开发App教程09-侧滑菜单

侧滑菜单 功能 上节讲到了列表页,这节讲一个比较常用的功能,侧滑菜单, 在本app中策划菜单用来记录已经完成的事项. 实现方式 用Hbuilder实现类似侧滑菜单这样原生app功能,一般有两种实现方式,详见:这里. 一是webview实现,二是div模拟实现, 两者的区别是div实现简答,但是偶尔效果不是很好, 而webview实现稍微复杂,页面传值也复杂,但是效果好点,一般推荐webview实现方式. index.html 代码 index.js中需要添加如下代码, var main = nu

转载:百为STM32开发板教程之十一——NOR FLASH

转载:http://bbs.21ic.com/icview-586199-1-1.html 百为STM32开发板教程之十一——NOR FLASH 参考文档:百为stm32开发板光盘\st官方参考资料\Application notes\AN2784 Using the high-density STM32F10xxx FSMC peripheral to drive external memories.pdf百为stm32开发板光盘\芯片数据手册\M29W128G.pdf百为stm32开发板光盘

微信公众平台开发入门教程

在这篇微信公众平台开发教程中,我们假定你已经有了PHP语言程序.MySQL数据库.计算机网络通讯.及HTTP/XML/CSS/JS等基础. 我们将使用微信公众账号方倍工作室作为讲解的例子,二维码见底部. 本系列教程将引导你完成如下任务: 创建新浪云计算平台应用 启用微信公众平台开发模式 基础接口消息及事件 微信公众平台PHP SDK 微信公众平台开发模式原理 开发天气预报功能 第一章 申请服务器资源 创建新浪云计算应用 申请账号 我们使用SAE新浪云计算平台作为服务器资源,并且申请PHP环境+M

微信公众号开发系列教程一(调试环境部署)

原文:微信公众号开发系列教程一(调试环境部署) 目录 C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) 微信公众号火了好一阵子了,笔者算是比较早接触微信公众号开发的了,大概做了一年半了,从最开始的到处网上找demo到现在也开发一些公众号.园子里关于微信开发的教程已经数不胜数了,我也准备来凑凑热闹.一是梳理下这段时间开发的经验,二是希望能帮到想做微信开发的小伙伴们,希望大大神们吐槽的时候悠着点,

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

  C#微信公众号开发系列教程一(调试环境部署) C#微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南)    距离上一篇博文已经半个月了,本来打算每两天更新一次的,但可怜苦逼码农无日无夜的加班.第一篇博文发表后,博文视点的编辑就找到我,问我想不想出版这个系列,我当时瞬间就想到了王大锤的独白,想想真的是有点小激动,后面按照那边的要求,提交了申请书,也提交了目录,可惜文笔不行,再加上最近太忙,样稿一直没有给他,感觉挺愧疚了.真心希望能帮一下迷茫的