开源飞控初探(五):MAVLink协议和Java库

这篇具有很好参考价值的文章主要介绍了开源飞控初探(五):MAVLink协议和Java库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概述

MAVLink协议是一种(应用层)数据协议,不依赖传输协议。传输层可以是TCP、UDP、RS232串口,甚至基于WebSocket。在定义数据的基础上,补充描述了几种子协议(microservice,直译是微服务)的现有实现。协议不保证送达,客户端需要经常检查机器状态确认命令被执行。

具体的数据定义包括:

  1. 数据帧格式,包括协议头和载荷(Payload),协议头包括协议版本、载荷长度、兼容标识、次序号、发送者系统号、发送者组件号、消息号、CRC检验和可选的签名。

  1. 消息号枚举和意义,不同的消息号其载荷的长度和意义。

  1. 命令子协议(一种特殊的消息),命令枚举和意义

官方提供了数据帧的装帧和解析基础库,支持12种语言,还有非官方的库额外多支持3种语言。官方的基础库是通过脚本解析多个XML生成的,XML原始地描述了所有的消息、命令、枚举。这些XML是包含的关系,按消息数量多少排序是:厂商定制消息集(例如ardupilotmega.xml) > common.xml(常用消息集,有161种消息)> minimal.xml(最小消息集,有2种消息)。生成基础库时可传参给脚本指定消息集。

MAVLink的Java库

生成目标为APM板子。源码都在com.MAVLink包中,目录文件结构:

  • uAvionix/CRC.java。CRC算法,算法的约定整数序列全是0。

  • enums/

  • 97个java文件,按协议规范定义了各种枚举值。

  • Messages/

  • MAVLinkMessage.java。各种消息的抽象基类。每种MAVLink消息都有一个子类。

  • MAVLinkPayload.java。表示协议载荷,直接操作ByteBuffer。

  • MAVLinkStats.java。统计收发帧的数量和错误数。主要实现协议中的seq消息次序号。

  • ardupilotmega/

  • CRC.java。CRC算法,算法的约定整数序列已设为MAVLink自定义的值。

  • msg_*.java。63个消息类,APM特有的,都继承MAVLinkMessage。

  • common/

  • CRC.java。和ardupilot/CRC.java是一样的。

  • msg_*.java。136个消息类,都继承MAVLinkMessage。

  • MAVLinkPacket.java。对一帧数据的封装,有装帧和解析(生成一个具体的消息类)操作。

  • Parser.java。解析过程的实现类,逐字节传入数据。

数据接收流程:

  1. 将底层连接接收的字节流逐个字节传入Parser.mavlink_parse_char(int c)函数,至一帧接收完毕时会返回一个MAVLinkPacket实例,否则返回null。

  1. 调用MAVLinkPacket.unpack()函数,即得到一个MAVLinkMessage实例

  1. 根据msgid成员变量判断,强制转换成对应子类。

发送流程:

  1. new一个具体的消息,对成员变量赋(业务)值

  1. 调用MAVLinkMessage.pack()函数得到一个MAVLinkPacket实例

  1. 调用MAVLinkPacket.encodePacket()函数得到byte[]传给底层连接。

重要的协议流程

系统号和组件号

协议中各用一个字节(0~255)分别表示消息发送者的系统号(system ID)和组件号(component ID)。系统就两种,飞控和地面站(飞控客户端都叫地面站)。可以同时有多架飞机和多个地面站连接,所以系统号必须唯一。组件可以是飞控(固件)、无线电台、相机、电机、万向节、电池、显示设备、降落伞,地面站控制模块、惯性导航、GPS等,有固定枚举值来表示这些组件。

部分消息的载荷里,有targetSystemID和targetComponentID参数来表示期望执行命令的系统组件。

多架飞机的SystemID从1开始递增。多个地面站的SystemID从255开始递减。

心跳

各组件都发出HEARTBEAT ( #0 )消息,被其它系统组件用来判断是否在线。各组件必须有规律地发出心跳消息,即使不发控制命令的也要。通常频率为1Hz,如果连续4或5次没收到消息就认为那个系统掉线了。

参数type

  • 地面站应为6,MAV_TYPE_GCS

  • 飞控是按类型有不同取值,例如14,MAV_TYPE_OCTOROTOR,是4轴8桨飞行器。

参数(组件能力与状态)

飞控客户端可以请求想要的数据以及设置响应频率,这些数据都来自上文的组件。完整的可请求的数据列表在这:https://ardupilot.org/dev/docs/mavlink-requesting-data.html。

涉及4种消息。

获取

PARAM_REQUEST_LIST,获取所有参数。地面站发出这个命令,飞控用PARAM_VALUE消息逐个参数回复。PARAM_VALUE消息有param_count参数表示总共有多少个参数以及param_index表示这是第几个。

PARAM_REQUEST_READ,获取单个参数,飞控用PARAM_VALUE消息回复。

设置

PARAM_SET,设置单个参数。地面站发出这个命令,飞控用PARAM_VALUE消息再广播一次表示收到。

航线

涉及10种消息

上传

  1. 地面站发出MISSION_COUNT,表示有多少个item

  1. 飞控发来MISSION_REQUEST_INT,参数seq表示第几个。

  1. 地面站回复MISSION_ITEM_INT,按seq第几个来上传

  1. 飞控发来MISSION_ACK表示已接受所有item。

查询

  1. 地面站发出MISSION_REQUEST_LIST

  1. 然后是上传过程调换角色,即地面站发MISSION_REQUEST_INT,飞控发MISSION_ITEM_INT,最后地面站发MISSION_ACK

流程图如下:

报告

飞控发出MISSION_CURRENT消息,当前执行的item:飞控会报告当前执行的mission item seq号

飞控发出MISSION_ITEM_REACHED消息,飞控每到达一个mission item的地点就会报告一次,参数为seq

设置当前item

地面站发出MISSION_SET_CURRENT消息。我们不会用。

清除

地面站发出MISSION_CLEAR_ALL消息,清除所有任务item

重要的命令

  • MAV_CMD_NAV_WAYPOINT (16 ),航点信息,会直线飞过去。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_RETURN_TO_LAUNCH (20 ),返航命令。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_LAND (21 ),着陆命令。用在MISSION_ITEM_INT消息中

  • MAV_CMD_NAV_TAKEOFF (22 ),起飞命令。用在COMMAND_LOG消息中

  • MAV_CMD_NAV_SPLINE_WAYPOINT (82 ),航点信息,会延曲线路径飞过去。用在MISSION_ITEM_INT消息中

  • MAV_CMD_MISSION_START (300 ),开始执行任务。用在COMMAND_LOG消息中

  • MAV_CMD_COMPONENT_ARM_DISARM (400 ),锁定或解锁。用在COMMAND_LOG消息中

  • MAV_CMD_SET_MESSAGE_INTERVAL (511 ),设置消息的发送间隔。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_MESSAGE (512 ),511命令的一次性版。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_PROTOCOL_VERSION (519 ),请求对方的MAVLink版本兼容性。对方应该ACK并发回一个PROTOCOL_VERSION消息。用在COMMAND_LOG消息中

  • MAV_CMD_REQUEST_AUTOPILOT_CAPABILITIES (520 ),获取自动驾驶的能力。用在COMMAND_LOG消息中。

参考资料

  • 设计原则。https://docs.google.com/document/d/1XtbD0ORNkhZ8eKrsbSIZNLyg9sFRXMXbsR2mp37KbIg/edit

  • 基础知识。MAVLink Basics ‒ Dev documentation文章来源地址https://www.toymoban.com/news/detail-662229.html

到了这里,关于开源飞控初探(五):MAVLink协议和Java库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 开源飞控初探(四)ArduPilot::Copter固件源码分析

    2022.5.7,基于v4.0.5的分析。官网文档没及时更新,本文对当前版本源码的描述可能和官网不一样。 上图中的Flight Code层,分为5个部分: 车机层 。一份代码通过编译配置,可以支持Rover(小车/船)、Copter(直升机,包括多旋翼)、Plane(固定翼飞机)、Sub(潜水器)、AntennaT

    2024年02月07日
    浏览(60)
  • Tello无人机飞控(Python)程序设计

    tello的几个不同的飞控库有什么区别吗,用哪个好些? Tello的几个不同飞控库主要是针对Python开发者提供的控制无人机的工具包,它们各有特点和使用方式。以下是对一些常见Tello飞控库的区别和推荐的概述: 1)tellopy:tellopy是一个功能齐全的库,提供了对Tello无人机的全面控

    2024年02月16日
    浏览(47)
  • 无人机/飞控--ArduPilot、PX4学习记录(5)

    这几天看dronekit,做无人机失控保护。 PX4官网上的经典案例,我做了很多注解,把代码过了一遍。 无人机具体执行了:  先起飞,飞至正上空10m-向北移动10m-向东移动10m-向南移动10m-向西移动10m-回到初始起飞点(即home点),降落。 具体执行之前,要打开JMAVSim,接下来会在JMAV

    2024年04月15日
    浏览(58)
  • 无人机/飞控--ArduPilot、PX4学习记录(2)

    这是一篇碎碎念,零零碎碎的记录了环境配置过程, 仅供本人记录学习历程和参考。 (记录的挺乱的,但是文章链接里的博客写的是真好) 本章主要完成的目标 : 安装PX4 并 成功运行出3D无人机界面。 参考文章: 搭建PX4环境: PX4/Pixhawk - 编译环境搭建_pix4 yu pixhawk-CSDN博客 使

    2024年03月21日
    浏览(60)
  • 获取大疆无人机的飞控记录数据并绘制曲线

    机型M350RTK,其飞行记录文件为加密的,我的完善代码如下 git@github.com:huashu996/DJFlightRecordParsing2TXT.git 飞行记录文件在打开【我的电脑】,进入遥控器内存, 文件路径:此电脑 pm430 内部共享存储空间 DJI com.dji.industry.pilot FlightRecord  网址如下DJI Developer 注册完之后新建APP获得密

    2024年02月16日
    浏览(52)
  • 无人机仿真环境配置初探(Unreal Engine + AirSim Plugin)

    AirSim插件配合Unreal Engine游戏引擎的3D渲染能力,可以实现比较逼真的环境渲染效果,具备Camera、Lidar和GNSS三种导航数据供供导航程序使用,其代码架构如下(参考自知乎文章) 注 : AirSim仅支持UE4,对于UE5,需要下载https://github.com/CodexLabsLLC/Colosseum对应的UE版本的Colosseum(AirSim的

    2024年04月10日
    浏览(43)
  • ArduPilot开源飞控系统之简单介绍

    ArduPilot是一个可信赖的自动驾驶系统,为人们带来便利。为此,提供了一套全面的工具,几乎适用于任何车辆、无人机、潜艇、气球等设备。 作为一个开源项目,在用户社区的快速反馈的基础上不断发展。相应的开发团队与社区和商业合作伙伴合作,为ArduPilot添加惠及所有人

    2024年02月12日
    浏览(45)
  • Ardupilot开源飞控之Wiki修改操作

    最近为了为了增加一些Ardupilot Wiki内容,对Wiki的编辑提交步骤整理一下,以便后续工作的展开。 修改过程大致可以分为两大类: 页面编辑修改 增删页面修改 原文链接详见:Wiki Editing - Quick Edits Create a Github account if you do not have one already 没有Github账号的同学,需要首先申请G

    2024年02月05日
    浏览(56)
  • 详解HTTP协议和HTTPS协议

    目录 一.HTTP协议 1.什么是HTTP  2.HTTP发展历史 3.HTTP请求和响应 4. 抓包的方式和工具Fiddler 1.开发者工具  2.Fiddler  二.请求和响应 1.请求和响应报文  2.URL结构  3.常见的方法 1.GET方法 2.POST方法  3.其他方法  三.请求报头(header) 1.Host 2.Content-Length 3.Content-Type 4.User-Agent(UA)  5.Refer

    2024年02月09日
    浏览(41)
  • raft 协议和 zab 协议区别

    采用 quorum 来确定整个系统的一致性,这个 quorum 一般实现是集群中半数以上的服务器。 zookeeper 里还提供了带权重的 quorum 实现。 都由 leader 来发起写操作。 都采用心跳检测存活性。 leader election 都采用先到先得的投票方式。 zab 用的是 epoch 和 count 的组合来唯一表示一个值, 而

    2024年02月04日
    浏览(57)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包