资讯动态

无人机自主定点降落:mavros安装配置与飞控通信实战指南

发布时间:2026/10/13 14:08:25 来源:尧图企业网站定制
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 能不能起来 roscoreroscore能正常启动、不报错说明 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 ModemManager6.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 这一层看似只是“装个包”但它涉及的版本、依赖、权限、硬件接口问题特别多值得单独花时间把它彻底搞稳。这一层稳了后面的定点降落逻辑才有可靠的通信基础否则你永远在怀疑“到底是算法问题还是通信问题”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑