热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:MAVLink功能开发,移植教程。

本文由编程笔记#小编为大家整理,主要介绍了MAVLink功能开发,移植教程。相关的知识,希望对你有一定的参考价值。MAVLink功能
本文由编程笔记#小编为大家整理,主要介绍了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文件。本文选择“mavlinkmessage_definitionsv1.0common.xml”

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

    技术分享图片

    技术分享图片


  • KEIL工程移植

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

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

    #include

    接着利用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);
    }
    }

    }
    ```

    最后实际测试移植成功。



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

















推荐阅读
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Python3中如何使用选择文件对话框的格式打开和保存图片的方法。通过使用tkinter库中的filedialog模块的asksaveasfilename和askopenfilename函数,可以方便地选择要打开或保存的图片文件,并进行相关操作。具体的代码示例和操作步骤也被提供。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 设计模式实现对象的复用——享元模式的概述和角色解析
    本文介绍了设计模式中的享元模式,该模式通过共享技术实现了大量细粒度对象的复用,从而提高系统性能。文章详细解析了享元模式的概述和角色,包括抽象享元类、具体享元类和非共享享元类。通过本文的阅读,读者可以了解享元模式的原理和应用场景,从而在实际开发中更好地利用该模式实现对象的复用。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了go接口相关的知识,希望对你有一定的参考价值。一、接口是什么接口提供了一种方式来 说明 对象的行为 ... [详细]
  • 1、DashAPI文档Dash是一个API文档浏览器,使用户可以使用离线功能即时搜索无数API。程序员使用Dash可访问iOS,MacOS, ... [详细]
  • 设计完成后,将所完成的作品交由老师检查。管理进程接收申请进入的信号,在消息队列中取下申请进入队列的用户进程的信息,针对当前临界区状态,写一个回馈信息 ... [详细]
  • 在IDEA中如何安装配置maven
    这篇文章主要介绍在IDEA中如何安装配置maven,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、下载maven:1、maven官网:h ... [详细]
  • 两个方案:1通过android.permission.READ_PHONE_STATE读取2通过短信过滤,读取手机号。按照第1个方案,AndroidManifest.xml需要添加< ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了使用Python根据字典中的值进行排序的方法,并给出了实验结果。通过将字典转化为记录项,可以按照字典中的值进行排序操作。实验结果显示,按照值进行排序后的记录项为[('b', 2), ('a', 3)]。 ... [详细]
  • Python如何调用类里面的方法
    本文介绍了在Python中调用同一个类中的方法需要加上self参数,并且规范写法要求每个函数的第一个参数都为self。同时还介绍了如何调用另一个类中的方法。详细内容请阅读剩余部分。 ... [详细]
  • Python语法上的区别及注意事项
    本文介绍了Python2x和Python3x在语法上的区别,包括print语句的变化、除法运算结果的不同、raw_input函数的替代、class写法的变化等。同时还介绍了Python脚本的解释程序的指定方法,以及在不同版本的Python中如何执行脚本。对于想要学习Python的人来说,本文提供了一些注意事项和技巧。 ... [详细]
author-avatar
男人着责任
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有