☰
无人机自主定点降落:mavros安装配置与飞控通信实战指南
2026/10/13 14:08:21 网站建设 项目流程

1. 从“能飞”到“能自己降落”:mavros 在定点降落链路中的真实角色

很多人第一次接触无人机自主降落,脑子里想的都是“识别标志、算偏差、发指令”这三步,觉得只要视觉算法跑通了,飞机自然就能稳稳落下来。我一开始也是这么想的,直到真正把树莓派挂到飞机上才发现,视觉算法算出来的偏差值,根本没办法直接塞给飞控——中间缺了一层“翻译官”。这层翻译官就是mavros。

mavros 是 MAVLink 协议在 ROS 里的桥接包。MAVLink 是飞控和外部设备通信的通用语言,而 ROS 是机器人领域常用的软件框架。mavros 干的事情,就是把飞控发出来的 MAVLink 消息翻译成 ROS 的 topic 和 service,同时把 ROS 这边想发的指令翻译回 MAVLink 塞给飞控。没有它,你的树莓派和飞控就是两个说不同语言的人,各说各话。

在“定点降落”这个场景里,整条链路大致是这样的:机载摄像头采集图像,视觉节点算出飞机相对降落标志的横向、纵向偏差,这个偏差通过 mavros 提供的接口,以位置设定值或者速度指令的形式发给飞控,飞控再结合自身的高度、姿态信息去执行降落。所以 mavros 不是可有可无的中间件,它是整条自主降落链路里承上启下的关键一环。这一篇就专门把“在树莓派或 Ubuntu 上把 mavros 装好、配好、跑通”这件事讲透,因为这一步没搞利索,后面所有降落逻辑都是空中楼阁。

需要提前说明的是,mavros 的安装在不同系统版本、不同 ROS 发行版下差异很大,网上很多教程是几年前的,直接照抄大概率报错。下面我会把版本对应关系、安装方式选择、常见报错都拆开讲,尽量让你少走弯路。

2. 装之前必须想清楚的三件事:版本、系统、安装方式

2.1 ROS 发行版和 Ubuntu 版本的对应关系不能乱

mavros 是 ROS 的包,所以它必须依附于某个 ROS 发行版,而每个 ROS 发行版又只支持特定的 Ubuntu 版本。这是最容易被忽略、也最容易导致后面一堆依赖错误的地方。我见过有人拿着 Ubuntu 22.04 去装 ROS Melodic,折腾一整天都装不上,最后发现版本根本不匹配。

下面这张表是我实际用过的对应关系,建议装之前先对号入座:

Ubuntu 版本推荐 ROS 发行版mavros 安装方式适用场景
18.04Melodicapt 二进制安装老设备、老镜像
20.04Noeticapt 二进制安装目前最稳的组合
22.04Humbleapt 二进制安装新设备首选
树莓派 OS(基于 Debian)视 ROS 版本而定源码编译或 apt资源受限场景

树莓派上要特别注意:官方的 Raspberry Pi OS 是基于 Debian 的,和标准 Ubuntu 有差异。如果你刷的是 Ubuntu Server for Raspberry Pi,那按上表走没问题;如果刷的是 Raspberry Pi OS,装 ROS 会麻烦一些,很多时候只能走源码编译。我的建议是,除非你有特殊理由,树莓派上直接刷 Ubuntu Server 对应版本,能省掉大量兼容性问题。

2.2 apt 安装和源码编译到底选哪个

这是新手最纠结的问题。我的结论很直接:能用 apt 就用 apt,除非你有明确的定制需求。

apt 安装的好处是依赖自动解决、版本经过测试、升级方便。一条命令下去,mavros 和它依赖的 MAVLink、地理库全都给你装好。源码编译的好处是能改代码、能用最新特性、能针对特定平台优化,但代价是依赖要自己一个个解决,编译时间长,出错概率高。

什么情况下必须源码编译?一是你的 ROS 版本对应的 apt 源里没有 mavros 包;二是你需要修改 mavros 源码里的某些行为;三是你在一个 apt 源不完整的平台上(比如某些精简版系统)。除此之外,老老实实用 apt。

2.3 树莓派的算力现实:别指望它跑重型任务

树莓派的 CPU 性能有限,尤其是早期型号。mavros 本身不算重,但如果你的定点降落方案里还叠加了视觉推理、SLAM 之类的任务,树莓派可能会吃不消。装 mavros 之前先评估一下整机负载,别到时候降落逻辑跑起来了,飞机却因为 CPU 占满导致控制指令延迟,那就危险了。

一个实用的判断方法:装完 mavros 后,用top看一下空闲状态下的 CPU 占用。如果 mavros 单独就吃掉超过 20% 的 CPU,那你的视觉节点基本没多少余量了,得考虑把视觉任务放到地面站或者换更强的机载计算机。

3. Ubuntu 上用 apt 装 mavros:完整流程与每一步的意图

3.1 先确认 ROS 环境本身是好的

在装 mavros 之前,先确认 ROS 已经装好并且能正常 source。这一步很多人跳过,结果后面报错都不知道是 ROS 的问题还是 mavros 的问题。

# 查看 ROS 版本环境变量,应该输出类似 /opt/ros/noetic/setup.bash echo $ROS_DISTRO # 如果为空,说明还没 source,手动 source 一下 source /opt/ros/noetic/setup.bash # 验证 roscore 能不能起来 roscore

roscore能正常启动、不报错,说明 ROS 基础环境没问题。如果这一步就挂了,先回去把 ROS 装好,别往下走。

3.2 安装 mavros 及其扩展包

mavros 分两个包:ros-<distro>-mavros是核心包,ros-<distro>-mavros-extras是扩展包,包含了很多额外插件和工具。定点降落场景里,扩展包里的某些插件会用到,建议一起装。

# 以 Noetic 为例,其他版本把 noetic 换成对应发行版名 sudo apt update sudo apt install ros-noetic-mavros ros-noetic-mavros-extras

这里解释一下为什么建议装 extras:核心包只包含基础的 MAVLink 消息桥接,而 extras 里有一些针对特定飞控、特定消息类型的扩展。虽然定点降落主要用的是位置和速度指令,属于基础功能,但 extras 里还带了mavros的一些辅助脚本,后面配置地理围栏数据时会用到。多装一个包,省得后面缺东西再回来补。

3.3 安装 GeographicLib 数据集:这一步最容易被漏掉

这是 apt 安装 mavros 时最经典的坑。mavros 在处理 GPS 坐标转换时依赖 GeographicLib 的地理数据集,这个数据集不会随 apt 包自动安装,必须手动跑一个脚本去下载。

# 这个脚本在 mavros-extras 包里 sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh

这个脚本会从网上下载几个数据文件,放到系统目录里。如果网络不好,这一步可能会卡住或者失败。失败的表现是后面启动 mavros 时报错,提示找不到某个 geoid 或 magnetic 数据文件。

注意:这个脚本需要联网下载,如果下载失败,可以多试几次,或者手动去 GeographicLib 官网下载对应的数据集压缩包,解压到/usr/share/GeographicLib目录下。数据集不大,但缺了它 mavros 的某些功能会直接罢工。

3.4 验证安装是否成功

装完之后别急着接飞控,先在本地验证一下 mavros 能不能正常启动。

# 启动 mavros 节点,先不连飞控,用默认的 FCU URL roslaunch mavros apm.launch

如果 mavros 能启动,终端里会打印一堆信息,包括它尝试连接的飞控地址、加载的插件列表等。这时候它连不上飞控是正常的,因为我们还没接硬件。关键是看有没有报错,比如缺数据集、缺依赖库之类的。如果只是提示连接超时,那说明安装本身是成功的。

4. 树莓派上的安装差异:资源、源、编译三个坎

4.1 树莓派刷 Ubuntu Server 后的 ROS 安装

树莓派上装 ROS 和普通 Ubuntu 大同小异,但有几个点要注意。首先是架构,树莓派是 ARM 架构,apt 源要用 ARM 对应的。其次是性能,树莓派上跑apt update和安装过程会比普通电脑慢不少,耐心等。

# 树莓派上先确认架构 uname -m # 应该输出 aarch64 或 armv7l # 添加 ROS 源时要用对应架构的源 # 具体命令参考 ROS 官方针对 ARM 的安装说明

树莓派上装 ROS 最大的坑是内存。某些型号内存只有 1GB 或 2GB,编译或者安装大型包时容易因为内存不足而失败。如果遇到这种情况,可以临时增加 swap 空间。

# 临时增加 2GB swap sudo fallocate -l 2G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile

这个操作在安装完成后可以撤销,但在安装期间能救命。

4.2 树莓派上 apt 装不了 mavros 怎么办

有些树莓派系统版本对应的 ROS 源里确实没有预编译的 mavros 包,这时候只能源码编译。源码编译 mavros 的流程大致是:先建工作空间,然后把 mavros 源码 clone 下来,用catkin_make或catkin build编译。

# 建工作空间 mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin_make # 下载 mavros 源码 cd src git clone https://github.com/mavlink/mavros.git # 注意:实际使用时请确认仓库地址的可用性 # 安装依赖 cd .. rosdep install --from-paths src --ignore-src -y # 编译 catkin_make

源码编译在树莓派上可能要跑半小时到一小时,取决于型号。编译过程中如果报依赖缺失,用rosdep补。如果报内存不足,参考上面加 swap 的方法。

4.3 树莓派上的串口权限问题

树莓派通过串口和飞控通信时,默认情况下普通用户没有串口访问权限,需要把用户加到dialout组。

sudo usermod -a -G dialout $USER # 执行完需要重新登录才生效

这个坑很隐蔽,因为不加组的话,mavros 启动时不会报权限错误,而是提示连接超时,让你以为是接线或者波特率的问题,实际上就是权限不够。我第一次遇到时排查了很久,最后才发现是组权限。

5. 让 mavros 真正连上飞控:配置与联调

5.1 确认飞控的串口设备和波特率

树莓派和飞控连接后,飞控会以串口设备的形式出现,通常是/dev/ttyACM0或/dev/ttyUSB0。先用命令确认设备存在。

ls /dev/ttyACM* /dev/ttyUSB*

如果设备不存在,检查接线和飞控供电。设备存在但连不上,多半是波特率不对。常见飞控的波特率有 57600 和 115200 两种,具体看飞控固件的设置。

5.2 启动 mavros 并指定正确的连接参数

mavros 的启动文件里可以指定fcu_url参数,格式是设备:波特率。

# 通过命令行参数指定 roslaunch mavros apm.launch fcu_url:=/dev/ttyACM0:115200

启动后,如果连接成功,终端会打印心跳信息,包括飞控的固件类型、版本、当前模式等。这时候可以用rostopic list看看 mavros 发布了哪些话题。

rostopic list | grep mavros

正常的话会看到一大堆话题,比如/mavros/state、/mavros/battery、/mavros/local_position/pose等。/mavros/state是最重要的,它反映了飞控的连接状态和当前飞行模式。

rostopic echo /mavros/state

如果connected字段是true,说明 mavros 和飞控已经正常通信了。这一步跑通,定点降落的通信基础就打好了。

5.3 定点降落会用到的几个关键话题

mavros 连上之后,下面这几个话题在定点降落里会频繁用到,提前熟悉一下:

话题/服务方向用途
/mavros/state订阅查看连接状态、飞行模式、解锁状态
/mavros/local_position/pose订阅获取飞机本地位置和姿态
/mavros/setpoint_position/local发布发送位置设定值
/mavros/setpoint_velocity/cmd_vel发布发送速度指令
/mavros/cmd/arming服务解锁/上锁
/mavros/set_mode服务切换飞行模式

定点降落的典型做法是:视觉节点算出偏差后,通过/mavros/setpoint_position/local发布修正后的位置设定值,或者通过/mavros/setpoint_velocity/cmd_vel发布速度指令让飞机往标志中心移动。具体用哪种,取决于你的控制策略和飞控固件支持的模式。

6. 踩过的坑与排查思路:从报错到跑通的完整链路

6.1 数据集缺失导致的启动失败

前面提过 GeographicLib 数据集的问题,这里展开说排查过程。症状是 mavros 启动时报错,提示类似GeographicLib exception: File not found或者Geoid file not found。这时候先确认数据集目录是否存在。

ls /usr/share/GeographicLib/

如果目录为空或者缺文件,重新跑安装脚本。如果脚本下载失败,手动下载数据集压缩包,解压后把geoids、gravity、magnetic等目录放到/usr/share/GeographicLib/下。

6.2 串口权限和占用问题

权限问题前面说了,加dialout组。还有一个容易忽略的是串口被占用。如果你之前开了一个mavros没关干净,或者用了其他串口工具,串口会被占用,新的 mavros 就连不上。排查方法是看有没有残留进程。

ps aux | grep mavros # 有残留就 kill 掉

另外,某些情况下 ModemManager 会去抢串口设备,导致 mavros 连不上。可以临时禁用或者屏蔽它。

# 查看 ModemManager 状态 systemctl status ModemManager # 如果它在干扰,可以临时停掉 sudo systemctl stop ModemManager

6.3 波特率不匹配的隐蔽表现

波特率不对的时候,mavros 不会直接报“波特率错误”,而是表现为连接超时、心跳收不到。这时候rostopic echo /mavros/state里的connected一直是false。解决办法是查飞控固件的串口配置,确认波特率,然后在fcu_url里改对。如果实在不确定,可以两个常见波特率都试一遍。

6.4 树莓派上时间同步引发的诡异问题

这个坑比较隐蔽。树莓派如果没有 RTC(实时时钟)模块,断电后时间会丢失,开机后时间可能是错的。mavros 和飞控通信时,某些消息带时间戳,如果两边时间差太大,可能会出现数据异常或者同步问题。解决办法是让树莓派开机自动同步网络时间。

# 确认时间同步服务在运行 timedatectl status # 如果时间不对,启用 NTP 同步 sudo timedatectl set-ntp true

如果树莓派在飞行现场没有网络,那就得考虑加一个 RTC 模块,或者起飞前手动校准时间。

7. 装好之后:为定点降落做的下一步准备

mavros 跑通、/mavros/state显示connected: true,这只是通信层打通了。接下来要做的,是确认飞控支持哪些控制模式,以及你的定点降落方案打算用哪种控制接口。

一个务实的做法是,先用 mavros 手动发几条位置设定值,看看飞机在悬停状态下能不能响应。这一步在室内、拆桨或者固定机身的情况下做,确保指令链路是通的,再去接视觉节点。很多人急着把视觉和降落逻辑全串起来,结果一出问题不知道是视觉算错了、mavros 发错了、还是飞控没执行,排查起来非常痛苦。分层验证,是这类项目里最省时间的做法。

另外提醒一句,mavros 的版本和飞控固件版本之间也可能存在兼容性问题。某些新固件的消息格式变了,老版本 mavros 可能解析不了。如果遇到莫名其妙的消息解析错误,先查一下 mavros 版本和固件版本的兼容性说明,别一头扎进代码里找 bug。

我在实际项目里的体会是,mavros 这一层看似只是“装个包”,但它涉及的版本、依赖、权限、硬件接口问题特别多,值得单独花时间把它彻底搞稳。这一层稳了,后面的定点降落逻辑才有可靠的通信基础,否则你永远在怀疑“到底是算法问题还是通信问题”。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询