1. 项目背景与整体设计思路
1.1 为什么要在树莓派上跑 MAVROS
做过无人机二次开发的朋友应该都有体会,飞控本身能做的事情其实有限——它负责底层姿态解算、电机混控、传感器融合,但一旦涉及到视觉识别、路径规划、多机协同这类上层任务,飞控就算有心也无力。这时候就需要一个"中间人",把飞控的数据取出来交给机载电脑处理,再把处理结果翻译成飞控能听懂的指令发回去。MAVROS 扮演的就是这个中间人的角色。
MAVROS 本质上是一个 ROS 节点,它把 MAVLink 协议的消息和 ROS 的 topic、service 做了双向映射。飞控通过串口或者网络发出来的心跳包、姿态、位置、电池状态,MAVROS 收到后转成 ROS 消息发布出去;反过来,你在 ROS 里发一个设定目标点的指令,MAVROS 把它打包成 MAVLink 消息发给飞控。整个链路打通之后,你就能用 ROS 生态里那些现成的工具——比如 rviz 看三维姿态、用 Python 写个脚本控制飞行、把视觉检测的结果直接转成速度指令——这些在纯飞控环境下是很难做到的。
定点降落这个任务尤其依赖这套架构。飞机要降落到指定位置,需要视觉或者激光雷达给出相对位置偏差,这个偏差要实时转成飞控能执行的速度或者位置指令,同时飞控的状态又要实时反馈回来做闭环。没有 MAVROS 这层桥接,你就得自己手写串口通信协议解析,工作量翻好几倍不说,稳定性还很难保证。
1.2 树莓派和 Ubuntu 的安装差异
标题里提到"树莓派或 Ubuntu",这两个平台的安装流程大方向一致,但有几个关键差异点需要提前说清楚,不然照着单一教程做很容易卡住。
树莓派的处理器是 ARM 架构,官方系统基于 Debian,软件源里的包版本和 x86 的 Ubuntu 不完全一样。最典型的问题是 ROS 的安装方式——在 x86 Ubuntu 上你可以直接用 apt 装二进制包,但在树莓派上,早期很多 ROS 包没有预编译的 ARM 版本,需要从源码编译。不过现在情况好很多了,ROS Melodic 和 Noetic 都有对应的 ARM 包,但安装源要选对。
另一个差异是串口设备名。树莓派的硬件串口默认被蓝牙占用,你要用 GPIO 上的串口接飞控,得先把蓝牙关掉或者把串口映射改过来。Ubuntu 上一般不存在这个问题,USB 转串口插上去就是/dev/ttyUSB0,省心不少。
还有性能差异。树莓派的算力有限,跑 MAVROS 本身没问题,但如果你同时还要跑视觉算法,就得注意资源分配。MAVROS 默认的发布频率比较高,在树莓派上可以适当降低一些不必要话题的发布频率来省 CPU。
1.3 整体安装路线的选择
安装 MAVROS 有两条路:二进制安装和源码编译。我的建议是,只要你的系统版本和 ROS 版本匹配,优先走二进制安装,省时省力。源码编译适合以下几种情况:你需要修改 MAVROS 源码、你的系统架构没有预编译包、或者你需要特定版本而软件源里没有。
二进制安装的核心就是三件事:装 ROS、装 MAVROS 包、配置环境变量。听起来简单,但每一步都有坑。比如 ROS 的源要用对,MAVROS 的包名在不同 ROS 版本里不一样,环境变量配错了会导致找不到包。下面我会把每一步拆开讲,包括我实际踩过的坑。
提示:整个安装过程建议在稳定的网络环境下进行,apt 更新和下载包的过程中断会导致依赖关系损坏,修复起来很麻烦。
2. 环境准备与依赖梳理
2.1 系统版本与 ROS 版本的对应关系
这一步是很多新手容易忽略的,但恰恰是最关键的。ROS 和 Ubuntu 版本是强绑定的,选错了后面全是麻烦。我整理了一个对照表,你对着自己的系统版本查就行。
| 系统版本 | 对应 ROS 版本 | MAVROS 包名 | 支持状态 |
|---|---|---|---|
| Ubuntu 16.04 | ROS Kinetic | ros-kinetic-mavros | 已停止维护 |
| Ubuntu 18.04 | ROS Melodic | ros-melodic-mavros | 维护中 |
| Ubuntu 20.04 | ROS Noetic | ros-noetic-mavros | 推荐使用 |
| 树莓派官方系统(基于 Debian 10) | ROS Melodic | ros-melodic-mavros | 可用 |
| 树莓派官方系统(基于 Debian 11) | ROS Noetic | ros-noetic-mavros | 推荐使用 |
树莓派这边要注意,官方系统版本更新比较快,你要先确认自己的系统是基于哪个 Debian 版本。用lsb_release -a或者cat /etc/os-release都能看到。如果系统太新而 ROS 还没出对应的包,那就只能源码编译,或者降级系统。
我个人的建议是,如果是新项目,直接上 Ubuntu 20.04 加 ROS Noetic,这是目前最成熟稳定的组合,社区资料也最全。树莓派的话,用官方 64 位系统配合 Noetic,性能比 32 位系统好不少,尤其是你要跑视觉算法的时候。
2.2 网络与软件源配置
ROS 的软件源在国内访问速度是个大问题。官方源在国外,apt update 的时候经常卡住或者超时。解决办法是换成国内镜像源。这里我不具体推荐某个镜像站,因为各家镜像的同步状态会变,你可以搜索"ROS 镜像源"找到当前可用的。
换源的操作是修改/etc/apt/sources.list.d/ros-latest.list这个文件,把里面的地址替换成镜像地址。改完之后一定要执行sudo apt update,看看能不能正常拉取索引。如果报错说签名验证失败,还需要导入对应的 GPG 密钥。
# 添加 ROS 源(以 Noetic 为例,地址替换为可用镜像) sudo sh -c 'echo "deb http://your-mirror/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' # 导入密钥 sudo apt install curl curl -sSL 'https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc' | sudo apt-key add - # 更新索引 sudo apt update树莓派上还要注意,ARM 架构的源和 x86 是分开的,有些镜像站只同步了 x86 的包,ARM 的包可能缺失。如果 apt update 之后发现某些包找不到,换一个镜像站试试。
2.3 依赖包的预安装
在装 MAVROS 之前,有几个依赖建议先装好,不然安装过程中可能会因为依赖问题失败。这些依赖包括地理信息库、串口通信库、以及一些数学工具库。
sudo apt install -y \ geographiclib-tools \ libgeographic-dev \ python3-serial \ python3-future \ libeigen3-dev其中geographiclib-tools这个包特别重要,MAVROS 在做 GPS 坐标转换的时候会用到它。装完之后还需要下载一些地理数据集,执行下面这条命令:
sudo geographiclib-get-geoids egm96-5这个命令会下载大地水准面模型数据,大概几十兆。如果网络不好下载失败,MAVROS 在启动的时候会报错说找不到 geoid 文件。我遇到过好几次这个问题,后来发现是数据集没下载完整,重新执行一次就好了。
注意:树莓派上执行 geographiclib-get-geoids 可能会比较慢,因为要下载和解压数据。建议在网速好的时候做,或者提前把数据文件拷贝到对应目录。
3. MAVROS 安装实操全流程
3.1 二进制安装的完整步骤
假设你已经装好了 ROS 并且source /opt/ros/noetic/setup.bash能正常工作,接下来装 MAVROS 就两条命令的事。但这两条命令背后有不少细节,我拆开说。
# 安装 MAVROS 主包 sudo apt install ros-noetic-mavros # 安装扩展包(包含一些额外的插件和工具) sudo apt install ros-noetic-mavros-extras第一条命令装的是 MAVROS 的核心节点,包括mavros_node这个可执行文件,以及基础的 MAVLink 消息映射。第二条命令装的是扩展功能,比如mavros_msgs里的一些自定义消息类型、以及一些辅助脚本。很多人只装第一条,结果跑起来发现某些 topic 没有数据,就是因为缺了扩展包。
装完之后,用rospack find mavros验证一下,如果输出了路径说明装好了。再执行rosrun mavros mavros_node --help,能看到帮助信息就说明可执行文件没问题。
这里有个小细节:MAVROS 的可执行文件在/opt/ros/noetic/lib/mavros/目录下,不在标准的 bin 目录里,所以你不能直接敲mavros_node运行,要用rosrun或者roslaunch。这是 ROS 的惯例,新手容易在这里困惑。
3.2 源码编译安装的适用场景
如果你的系统架构没有预编译包,或者你需要修改 MAVROS 源码,那就得走源码编译。这个过程比二进制安装复杂得多,我建议只在必要的时候用。
源码编译的第一步是建工作空间。ROS 的工作空间有固定的目录结构,src放源码,编译产物在devel和build里。
mkdir -p ~/catkin_ws/src cd ~/catkin_ws catkin init catkin config --extend /opt/ros/noetic catkin config --cmake-args -DCMAKE_BUILD_TYPE=Release然后下载 MAVROS 源码。MAVROS 依赖 MAVLink 和 GeographicLib,这两个也要一起下载到 src 目录里。
cd ~/catkin_ws/src git clone https://github.com/mavlink/mavros.git git clone https://github.com/mavlink/mavlink.git --recursive下载完之后,用rosdep安装依赖:
rosdep install --from-paths src --ignore-src -y最后编译:
catkin build编译过程在树莓派上可能要十几分钟甚至更久,因为 ARM 的算力有限。编译完成后source devel/setup.bash就能用了。
提示:源码编译时如果报错说找不到某个依赖,先用 rosdep 检查一遍。如果 rosdep 也解决不了,可能是那个包在你的系统上没有 ARM 版本,需要手动从源码编译那个依赖。
3.3 环境变量的配置与验证
安装完成后,环境变量必须配好,否则 ROS 找不到 MAVROS 的包。二进制安装的话,source /opt/ros/noetic/setup.bash就够了,因为 MAVROS 装在 ROS 的系统目录里。源码编译的话,要 source 你自己工作空间的devel/setup.bash。
为了方便,建议把 source 命令写到~/.bashrc里,这样每次开终端自动生效:
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc # 如果是源码编译,再加上: echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc验证安装是否成功,可以跑一个简单的 launch 文件:
roslaunch mavros px4.launch如果看到一堆启动日志,最后停在[ INFO] [时间戳]: FCU: DeviceError:serial:open: No such file or directory这样的信息,别慌,这其实是正常的——它说明 MAVROS 启动了,只是没找到飞控设备。等你把飞控连上,配置好端口,这个错误就消失了。
如果报的是[FATAL]级别的错误,比如找不到某个库、或者 package 不存在,那才是真的安装有问题,需要回头检查。
4. 串口与网络连接配置
4.1 飞控串口设备的识别与权限
MAVROS 要和飞控通信,第一步是让系统能识别到飞控的串口设备。飞控一般通过 USB 转串口芯片和电脑连接,常见的芯片有 CP2102、FTDI、CH340 等。插上之后,用ls /dev/tty*看看多了哪个设备。
# 插拔前后各执行一次,对比差异 ls /dev/ttyUSB* /dev/ttyACM*通常会出现/dev/ttyUSB0或者/dev/ttyACM0。如果是树莓派用 GPIO 串口接飞控,那就是/dev/ttyAMA0或者/dev/serial0。
识别到设备之后,还有一个权限问题。普通用户默认没有串口的读写权限,直接跑 MAVROS 会报 permission denied。解决办法是把用户加到 dialout 组:
sudo usermod -a -G dialout $USER执行完要注销重新登录才生效。如果你不想重新登录,可以临时用sudo chmod 666 /dev/ttyUSB0给权限,但每次插拔都要重新执行,麻烦。
注意:树莓派上用 GPIO 串口时,默认的
/dev/ttyAMA0可能被蓝牙占用。需要在/boot/config.txt里加一行dtoverlay=disable-bt禁用蓝牙,然后把/dev/serial0指向硬件串口。具体操作是sudo raspi-config里选择 Interface Options -> Serial Port,关闭登录 shell,开启硬件串口。
4.2 MAVROS 的 launch 文件参数解析
MAVROS 启动的时候需要知道飞控在哪里、用什么波特率通信。这些参数通过 launch 文件传进去。MAVROS 自带了一些常用的 launch 文件,比如px4.launch、apm.launch,分别对应 PX4 和 ArduPilot 两种飞控固件。
以px4.launch为例,关键参数有这几个:
| 参数名 | 含义 | 常用值 |
|---|---|---|
| fcu_url | 飞控连接地址 | /dev/ttyUSB0:921600 |
| gcs_url | 地面站连接地址 | udp://@ |
| tgt_system | 目标系统 ID | 1 |
| tgt_component | 目标组件 ID | 1 |
fcu_url是最关键的,格式是设备:波特率。波特率要和飞控里设置的一致,PX4 默认是 57600,但很多玩家会改成 921600 提高通信速率。如果你不确定,先用 57600 试,通了再改。
gcs_url是给地面站留的转发通道。如果你同时想用地面站软件看状态,可以配这个参数让 MAVROS 把数据转发出去。不需要的话留空或者不配都行。
你可以直接改自带的 launch 文件,但更好的做法是复制一份出来改,避免升级的时候被覆盖。比如:
roscd mavros/launch cp px4.launch ~/my_px4.launch # 编辑 ~/my_px4.launch,修改 fcu_url4.3 网络连接方式(UDP/TCP)
除了串口,MAVROS 也支持通过网络和飞控通信。这种方式在多机协同或者飞控自带网络接口的时候很有用。网络连接的 URL 格式是udp://:14540@127.0.0.1:14557这种形式。
UDP 和 TCP 的区别在于:UDP 不保证送达,但延迟低,适合实时性要求高的场景;TCP 保证送达,但有重传机制,延迟可能不稳定。无人机控制一般用 UDP,因为偶尔丢一帧数据比延迟抖动要好处理。
配置网络连接的时候要注意端口对应关系。飞控端监听的端口和 MAVROS 端发送的端口要匹配,不然数据发过去没人收。这个在 PX4 的官方文档里有详细的端口分配表,我这里不展开,你只要记住:如果连不上,先检查两边的端口配置是否一致。
5. 常见问题排查与避坑经验
5.1 安装阶段的典型报错
安装 MAVROS 的过程中,我遇到过几种典型的报错,这里整理出来供参考。
第一种是依赖冲突。报错信息里会出现unmet dependencies或者held broken packages。这通常是因为之前装过其他版本的 ROS 或者手动装过某些库,导致依赖关系乱了。解决办法是用aptitude代替apt来装,它会给出解决方案让你选。
sudo aptitude install ros-noetic-mavros第二种是 GPG 密钥错误。报错说NO_PUBKEY后面跟一串十六进制数。这是因为 ROS 源的签名密钥没导入或者过期了。解决办法是重新导入密钥,命令在前面 2.2 节里写过。
第三种是 geographiclib 数据集下载失败。MAVROS 启动时报GeographicLib exception: File not found。这是因为geographiclib-get-geoids没执行或者执行失败。手动执行一次,确保数据下载到/usr/share/GeographicLib/geoids/目录下。
5.2 运行阶段的连接问题
安装没问题了,运行的时候连不上飞控,这是更常见的情况。排查思路是从底层往上查。
先确认设备是否存在:ls /dev/ttyUSB0,如果不存在,说明驱动或者硬件有问题。换个 USB 口试试,或者换根线。有些便宜的 USB 线只有供电没有数据线,插上去设备能识别但通信不了,这种坑我踩过。
设备存在的话,检查权限:ls -l /dev/ttyUSB0,看属主和权限。如果用户不在 dialout 组里,就会报权限错误。
权限没问题的话,检查波特率。飞控和 MAVROS 两边的波特率必须一致。你可以用stty命令查看和设置串口参数:
stty -F /dev/ttyUSB0 921600如果这些都对了还是连不上,那可能是飞控端的 MAVLink 输出没开。PX4 需要在参数里设置MAV_1_CONFIG和MAV_1_MODE,ArduPilot 要设置SERIALx_PROTOCOL。这个要连地面站改参数,不在 MAVROS 这边。
5.3 性能优化与资源占用
树莓派上跑 MAVROS,资源占用是需要关注的。MAVROS 默认会发布很多话题,有些你用不到,可以关掉来省 CPU。
在 launch 文件里可以配置plugin_blacklist参数,把不需要的插件禁掉。比如你只做定点降落,不需要相机、不需要光流,就可以把对应的插件禁掉。
<arg name="plugin_blacklist" value="*, actuator_control, cam_imu_sync, camera, distance_sensor, fake_gps, gps_rtk, hil, home_position, landing_target, mocap_pose_estimate, obstacle_distance, rangefinder, vision_pose_estimate, vision_speed_estimate" />这个列表要根据你的实际需求调整,不要照抄。禁错了插件会导致某些功能不可用。
另外,MAVROS 的消息发布频率也可以调。默认有些话题是 50Hz 甚至更高,在树莓派上可以降到 10Hz 或者 20Hz,对控制精度影响不大,但 CPU 占用能降不少。
提示:用
top或者htop看 MAVROS 进程的 CPU 占用,如果超过 50%,就要考虑优化了。树莓派 4B 跑 MAVROS 加简单视觉算法,CPU 占用一般在 30% 到 60% 之间,如果持续跑满,说明有地方需要调整。
5.4 常见问题速查表
| 现象 | 可能原因 | 排查方法 | 解决方式 |
|---|---|---|---|
| 找不到 mavros 包 | 环境变量没配 | rospack find mavros | source setup.bash |
| 串口打不开 | 权限不足 | ls -l /dev/ttyUSB0 | 加入 dialout 组 |
| 连上但没数据 | 波特率不匹配 | 检查两边配置 | 统一波特率 |
| 启动报 geoid 错误 | 数据集缺失 | 检查 geoids 目录 | 重新下载数据集 |
| CPU 占用过高 | 插件太多 | htop查看 | 禁用无用插件 |
| 数据延迟大 | 发布频率高 | rostopic hz | 降低发布频率 |
6. 安装后的验证与下一步衔接
6.1 用 rostopic 验证数据链路
MAVROS 跑起来之后,怎么确认它真的在工作?最直接的方法是看话题。开一个终端跑 MAVROS,另开一个终端执行:
rostopic list如果看到一堆/mavros/开头的话题,说明 MAVROS 正常启动了。再挑一个关键话题看数据:
rostopic echo /mavros/state这个 topic 发布的是飞控的连接状态,包括是否已连接、是否解锁、飞行模式等。如果connected字段是true,说明 MAVROS 和飞控的通信链路通了。如果是false,说明还没连上,回去检查串口配置。
再看一下心跳:
rostopic hz /mavros/state正常应该是 1Hz 左右。如果频率是 0,说明没有数据进来。
6.2 定点降落任务的前置准备
MAVROS 装好只是第一步,定点降落还需要几个前置条件。首先是定位源,你要么有 GPS,要么有视觉定位或者光流。室内定点降落一般用视觉,需要配置vision_pose_estimate插件,把视觉定位的数据喂给飞控。
其次是坐标系对齐。MAVROS 用的是 ENU 坐标系(东北天),飞控内部用的是 NED(北东地),MAVROS 会自动做转换,但你要确保视觉定位输出的坐标系和 MAVROS 的约定一致,不然飞机往反方向飞。
最后是控制接口的选择。定点降落可以用位置控制、速度控制或者直接发目标点。位置控制精度高但响应慢,速度控制响应快但需要自己写闭环。我一般用速度控制做降落,因为降落过程中需要根据高度实时调整下降速率,速度控制更灵活。
6.3 我个人的几条实操建议
第一,安装过程中每一步都验证,不要一口气全做完再测。装完 ROS 测一下,装完 MAVROS 测一下,配好串口测一下。这样出问题的时候能快速定位是哪一步的错。
第二,launch 文件一定要自己复制一份改,不要直接改系统自带的。系统升级或者重装的时候,你的修改就丢了。
第三,树莓派上建议用 64 位系统。32 位系统内存寻址受限,跑 ROS 加视觉算法容易内存不足。64 位系统虽然有些包需要额外配置,但整体体验好很多。
第四,串口线要用质量好的。我遇到过因为线材问题导致通信不稳定,飞机在空中偶尔丢包,查了好久才找到原因。换根好线,问题消失。
第五,MAVROS 的日志级别可以调。默认的 INFO 级别会输出很多信息,在树莓派上写 SD 卡频繁了会影响寿命。可以在 launch 文件里把日志级别调到 WARN,减少输出。
这套安装流程我在好几台设备上跑过,树莓派 3B、4B、以及 x86 的 Ubuntu 机器都试过,整体是稳定的。关键是要有耐心,遇到报错不要慌,按照从底层到上层的顺序排查,一般都能解决。定点降落这个任务本身涉及的东西很多,MAVROS 只是其中一环,但这一环打通了,后面的视觉、控制、调参才有基础。