一文搞懂 MAVROS 和 MAVLink 的关系:初学者快速入门
目录一、前言二、为什么初学者总会混淆 MAVROS 和 MAVLink三、MAVLink 到底是什么四、MAVLink 主要传什么内容1. 状态信息2. 控制指令3. 参数与任务信息五、MAVROS 又是什么六、MAVROS 到底做了什么1. 把飞控发来的 MAVLink 消息转换成 ROS 接口2. 把 ROS 节点发出的指令转换成 MAVLink 消息再发给飞控七、MAVLink 和 MAVROS 的关系到底是什么八、直观比喻理解九、典型系统中的数据链路十、一个具体例子发送速度指令时发生了什么十一、MAVROS 能替代飞控吗十二、MAVROS 和 QGroundControl 有什么区别1. QGroundControl2. MAVROS十三、初学者应该如何理解这几种概念第一层飞控第二层通信协议第三层桥接接口第四层上层算法十四、总结一、前言在学习 PX4、ArduPilot、ROS、无人机或水下机器人开发时很多人都会同时看到两个词MAVLink和MAVROS。初学者最容易困惑的地方就在于这两个名字看起来很像但它们到底是不是同一个东西谁负责通信谁负责控制它们和飞控之间又是什么关系本文就从最基础的角度出发尽量用通俗的方式把MAVLink 是什么、MAVROS 是什么、两者之间的关系是什么讲清楚让初学者能够快速建立整体认识。二、为什么初学者总会混淆 MAVROS 和 MAVLink对于刚开始接触机器人系统开发的人来说常见的系统里往往会同时出现这些名词PX4ArduPilotQGroundControlROSMAVLinkMAVROS这些组件经常一起出现于是很多人会产生几种典型误解第一种误解是认为MAVROS 就是一种通信协议。第二种误解是认为MAVLink 就是 ROS 里的某个功能包。第三种误解是觉得两者差不多只是名字不同。实际上它们根本不是同一层面的东西。MAVLink 是通信协议MAVROS 是 ROS 环境下对 MAVLink 的桥接与封装工具。只要先抓住这句话后面的理解就会顺很多。三、MAVLink 到底是什么MAVLink 的全称是Micro Air Vehicle Link。它本质上是一种专门面向无人系统的轻量级通信协议主要用于飞控、地面站、上位机之间的数据交换。简单来说MAVLink 的作用就是规定某条消息该叫什么名字消息里有哪些字段每个字段代表什么意思这些数据如何打包传输接收方如何解析这些内容也就是说MAVLink 并不直接负责“控制算法”它负责的是通信规则。你可以把它理解成一种“约定好的说话方式”。只要双方都遵循 MAVLink 协议那么飞控、地面站、上位机之间就可以互相理解对方发来的信息。四、MAVLink 主要传什么内容MAVLink 能传输的内容很多常见的包括以下几类。1. 状态信息例如飞行器姿态位置和速度GPS 信息电池电压飞控模式心跳包这些信息通常由飞控周期性发出供地面站或上位机读取。2. 控制指令例如解锁与上锁模式切换速度控制命令位置控制命令航点任务上传起飞、降落、返航等指令这些信息通常由地面站或上位机发送给飞控。3. 参数与任务信息例如飞控参数读写航线任务点系统状态反馈校准相关命令因此从本质上说MAVLink 是一种消息传输标准。它像是一套字典和语法规则规定了飞控系统和外部系统之间如何交换数据。五、MAVROS 又是什么MAVROS 是 ROS 生态中的一个功能包它的主要作用是在 ROS 和 MAVLink 飞控之间搭建桥梁。如果说MAVLink 是一种语言那么 MAVROS 就是一个“翻译层”。因为飞控通常通过 MAVLink 协议通信而 ROS 系统内部更习惯使用topicserviceparametermessage这两套体系并不一样。飞控不会天然理解ROS 的 topicROS 节点也不会天然理解MAVLink 消息。于是就需要一个中间层把两边连接起来这个中间层就是MAVROS。六、MAVROS 到底做了什么MAVROS 的核心工作可以概括为两部分1. 把飞控发来的 MAVLink 消息转换成 ROS 接口例如飞控通过 MAVLink 发来位置、姿态、速度、电池状态等数据MAVROS 会把它们转换成 ROS 中可订阅的话题。比如常见的内容会被转成类似这样的 ROS 接口/mavros/state/mavros/local_position/pose/mavros/imu/data/mavros/global_position/global这样一来ROS 中的其他节点就可以像处理普通 ROS 数据一样处理飞控信息。2. 把 ROS 节点发出的指令转换成 MAVLink 消息再发给飞控例如你在 ROS 里写了一个控制节点希望给飞控发送速度指令或者位置设定值那么 MAVROS 会负责把这些 ROS 消息转换成飞控能够识别的 MAVLink 消息并通过串口或网络发过去。所以MAVROS 并不是控制器本身也不是通信协议本身而是一个协议适配与系统接口层。七、MAVLink 和 MAVROS 的关系到底是什么这一点是全文最核心的内容。它们之间的关系可以概括成一句话MAVROS 是基于 MAVLink 工作的MAVROS 通过 MAVLink 与飞控通信。也就是说MAVLink 是底层通信协议MAVROS 是 ROS 侧对这个协议的桥接实现两者的关系不是并列的“同类概念”而是“下层协议”和“上层接口封装”的关系。如果没有 MAVLinkMAVROS 就失去了和飞控对话的基础。如果没有 MAVROSROS 节点虽然仍然可以理论上自己去解析 MAVLink但开发会非常麻烦。因此对初学者来说最容易记住的方式就是MAVLink 负责定义怎么说MAVROS 负责帮 ROS 去说。八、直观比喻理解可以把这几个概念类比成下面这样飞控一个只会说“专业术语语言”的设备MAVLink这套专业术语语言本身ROS你自己的算法世界使用的是另一套表达方式MAVROS在两者之间做翻译和转接的人飞控不会直接听懂 ROS 话题。ROS 节点也不会天然理解飞控发来的MAVLink 二进制消息。MAVROS 的存在就是把这两套体系打通。这个比喻虽然不完全严格但对初学者建立第一印象非常有效。九、典型系统中的数据链路在很多无人机或水下机器人系统中常见的链路可以写成飞控 ↔ MAVLink ↔ MAVROS ↔ ROS 节点如果再把地面站也加进来系统通常会更完整一些QGroundControl ↔ MAVLink ↔ 飞控 ↔ MAVLink ↔ MAVROS ↔ ROS算法节点这里每个部分分工不同。十、一个具体例子发送速度指令时发生了什么假设你在 ROS 中写了一个自主控制节点希望让飞行器向前飞。从系统角度看这个过程大致如下第一步ROS 控制节点产生一个速度设定值。第二步这个设定值发布到 MAVROS 提供的话题。第三步MAVROS 将这个 ROS 消息转换为对应的 MAVLink 控制消息。第四步消息通过串口、UDP 或其他链路发送给飞控。第五步飞控解析这条 MAVLink 指令并进入对应控制逻辑。第六步飞控再根据内部控制器和混控模块输出电机命令。与此同时飞控还会把自己的状态信息继续通过 MAVLink 回传给 MAVROS。MAVROS 再把这些状态变成 ROS 话题供你的算法节点继续订阅。这个过程本质上就是一个闭环ROS 算法节点发命令飞控执行并反馈状态MAVROS 在中间完成协议转换。十一、MAVROS 能替代飞控吗不能这一点也非常重要。很多初学者会误以为有了 MAVROS就能直接完成飞控的所有工作。实际上并不是这样。MAVROS 的定位是桥接层而不是控制核心。真正负责姿态控制、角速度控制、电机混控、解锁逻辑、安全保护等底层实时任务的仍然是飞控软件比如PX4 或 ArduPilot。MAVROS 只是帮助上层 ROS 系统和飞控交互。它不直接代替飞控的核心控制回路。所以不能把 MAVROS 理解成“另一个飞控”更不能把它理解成“控制算法全集”。十二、MAVROS 和 QGroundControl 有什么区别这也是很多初学者容易混淆的一点。虽然 MAVROS 和 QGroundControl 都可能通过 MAVLink 与飞控通信但它们的用途完全不同。1. QGroundControlQGroundControl 是地面站软件主要面向人工操作与配置管理。它更像一个用户界面工具用来查看状态调参数切模式上传任务手动控制2. MAVROSMAVROS 是 ROS 接口桥更偏向程序和算法开发。它更像是给开发者使用的中间件让 ROS 节点能够接入飞控系统。简单来说QGroundControl 面向“人”MAVROS 面向“ROS程序”两者都可能使用 MAVLink但扮演的角色不同。十三、初学者应该如何理解这几种概念建议直接按层次来记。第一层飞控例如 PX4、ArduPilot。负责底层控制和执行。第二层通信协议即 MAVLink。负责飞控和外部系统的消息交换规则。第三层桥接接口即 MAVROS。负责把 ROS 和 MAVLink 飞控系统连接起来。第四层上层算法即你自己写的 ROS 节点。负责感知、规划、决策和高层控制。十四、总结MAVLink 和 MAVROS 虽然名字相近但本质上不是一类东西。MAVLink 是一种轻量级通信协议用于规定飞控、地面站和上位机之间如何交换消息MAVROS则是 ROS 生态中的桥接工具用来把ROS 系统和基于 MAVLink 的飞控连接起来。在实际系统中飞控 负责底层控制MAVLink 负责消息规范MAVROS 负责协议转换与接口封装ROS 节点 负责高层感知、规划与决策后续再去学习 PX4、ArduPilot、QGroundControl 或 ROS 联合开发时整体架构就会清晰很多。对于刚入门的学习者来说不需要一开始就深入理解所有消息类型和底层细节只要先建立起如下认知即可飞控通过 MAVLink 对外通信ROS 通过 MAVROS 接入飞控。