news 2026/10/13 1:32:39

树莓派与Ubuntu上MAVROS安装全攻略:从环境配置到定点降落实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
树莓派与Ubuntu上MAVROS安装全攻略:从环境配置到定点降落实战

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.04ROS Kineticros-kinetic-mavros已停止维护
Ubuntu 18.04ROS Melodicros-melodic-mavros维护中
Ubuntu 20.04ROS Noeticros-noetic-mavros推荐使用
树莓派官方系统(基于 Debian 10)ROS Melodicros-melodic-mavros可用
树莓派官方系统(基于 Debian 11)ROS Noeticros-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目标系统 ID1
tgt_component目标组件 ID1

fcu_url是最关键的,格式是设备:波特率。波特率要和飞控里设置的一致,PX4 默认是 57600,但很多玩家会改成 921600 提高通信速率。如果你不确定,先用 57600 试,通了再改。

gcs_url是给地面站留的转发通道。如果你同时想用地面站软件看状态,可以配这个参数让 MAVROS 把数据转发出去。不需要的话留空或者不配都行。

你可以直接改自带的 launch 文件,但更好的做法是复制一份出来改,避免升级的时候被覆盖。比如:

roscd mavros/launch cp px4.launch ~/my_px4.launch # 编辑 ~/my_px4.launch,修改 fcu_url

4.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 mavrossource 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 只是其中一环,但这一环打通了,后面的视觉、控制、调参才有基础。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 1:31:46

冒泡排序深度优化:面向嵌入式与实时系统的可控性重构

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:30:42

MinGW-w64离线安装包部署全攻略:从选型到环境变量与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:30:37

XGBoost时序预测实战:从滞后特征到多步预测与分类

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/13 1:30:21

GDAL 3.8.0 源码编译实战:从依赖锁定到Python绑定全链路构建

简介&#xff1a;gdal-3.8.0.tar.gz 是 GDAL 3.8.0 版本的官方源码发布包&#xff0c;面向 Linux 平台下从事地理信息系统开发、遥感数据处理或空间数据分析的中高级开发者与科研人员&#xff0c;用于编译安装最新稳定版 GDAL/OGR 库&#xff0c;解决栅格与矢量空间数据格式解析…

作者头像 李华