1. 环境准备你的第一台“地面站”电脑大家好我是老张在无人机和机器人圈子里折腾了十几年从早期的APM飞控一路玩到现在的PX4。今天咱们不聊那些高深的理论就实实在在地手把手带你从零开始把PX4飞控和MAVROS通信给配通让你写的代码能真正指挥无人机飞起来。很多新手朋友卡在第一步不是环境装不上就是依赖库下不动看着命令行报错干着急。别担心这篇文章就是为你准备的我会把每一步的操作、每一个可能遇到的“坑”都掰开揉碎了讲清楚。首先你得有一台运行Ubuntu的电脑。这可以是你的主力开发机也可以是一台树莓派这样的微型电脑把它装在无人机上作为机载计算机。我强烈推荐新手从Ubuntu 20.04和ROS Noetic这个组合开始这是目前最稳定、资料最全的“黄金搭档”。我自己的测试环境就是一台树莓派4B刷了Ubuntu 20.04 Server。为什么不用带桌面的版本对于机载计算机来说系统越轻量越好把宝贵的算力和内存留给你的导航、视觉算法才是正事。如果你手头没有树莓派用虚拟机或者一台闲置的旧笔记本装Ubuntu双系统也完全没问题原理都是一样的。在开始安装任何东西之前有个好习惯能帮你省去后面90%的麻烦换源。由于网络环境的原因直接从国外的官方服务器下载软件包速度可能非常慢甚至完全失败。我们需要把软件源换成国内的镜像站。打开终端输入sudo gedit /etc/apt/sources.list如果你用的是带桌面的Ubuntu或者用sudo nano /etc/apt/sources.list。把文件里的archive.ubuntu.com和security.ubuntu.com等网址统统替换成mirrors.aliyun.com或者mirrors.tuna.tsinghua.edu.cn。保存退出后执行sudo apt update更新软件列表。看到一大串索引飞速下载速度杠杠的这说明换源成功了。这个步骤是后续一切顺利的基础千万别跳过。接下来是安装ROS。网上教程很多但最容易出错的就是版本匹配和依赖缺失。我这里推荐一个“懒人神器”——鱼香ROS的一键安装脚本。这是国内ROS爱好者“鱼香ROS”维护的针对国内网络优化过能自动处理很多依赖问题。你只需要在终端里输入下面这行命令然后按照提示选择你的Ubuntu版本和要安装的ROS版本比如Noetic就行了wget http://fishros.com/install -O fishros bash fishros脚本运行过程中它会问你一些问题比如是否换ROS的源一定要选“是”是否安装桌面完整版对于开发建议安装。整个过程基本是全自动的泡杯茶的功夫ROS就装好了。装完后别忘了在终端里执行source /opt/ros/noetic/setup.bash或者把这行命令加到你的~/.bashrc文件末尾这样每次打开新终端ROS环境就自动准备好了。你可以用roscore命令测试一下如果能看到一个ROS Master启动的信息没有报错那么恭喜你ROS环境搭建成功2. 安装MAVROS连接飞控与ROS的桥梁ROS装好了相当于我们有了一个强大且易用的大脑决策与运算中心。而PX4飞控则是无人机的小脑和脑干负责最底层的姿态控制、传感器融合。要让大脑指挥小脑我们需要一座可靠的桥梁这就是MAVROS。MAVROS是一个ROS功能包Package它的核心作用是把PX4飞控使用的MAVLink协议消息“翻译”成ROS里的Topic话题、Service服务和Action动作这样我们就能用熟悉的ROS工具和代码来方便地获取无人机状态比如位置、电量、发送控制指令比如起飞、降落。安装MAVROS本身并不复杂它和安装其他ROS包一样主要有两种方式二进制安装和源码编译安装。对于绝大多数新手和快速上手的场景我强烈推荐二进制安装。它的优点是简单、快速、不容易出错缺点是你看不到它的源代码不过初期我们也不需要修改它。而源码安装更适合那些需要深度定制MAVROS功能或者为其贡献代码的开发者。咱们今天就用二进制安装求稳不求快。打开终端确保你的ROS环境已经激活就是前面说的source了setup.bash。然后输入以下命令sudo apt-get update sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-mavros-msgs注意这里的noetic要替换成你安装的ROS版本名称。如果你是Ubuntu 18.04可能就是melodic。这条命令会从ROS的软件仓库里下载并安装MAVROS核心包、扩展包以及消息定义包。安装过程可能会需要你确认磁盘空间输入y回车即可。如果一切顺利几分钟就装完了。但是这里90%的人会遇到第一个大坑安装过程卡住提示某个叫GeographicLib的依赖数据集下载失败。这个错误信息可能很长但核心就是连接不上sourceforge.net这个网站。GeographicLib是MAVROS进行地理坐标系转换比如把GPS的WGS84坐标转换成局部坐标所必须的数据库没有它MAVROS的很多导航功能无法正常工作。由于网络原因安装脚本自动下载这几个上百兆的数据集几乎不可能成功。别慌这正是我们这篇文章要解决的核心疑难杂症之一。3. 攻克最大难关无“魔法”安装GeographicLib数据集当安装命令卡在下载egm96-5.tar.bz2或类似文件时你可以按CtrlC终止安装。网上很多教程会告诉你运行MAVROS官方提供的安装脚本install_geographiclib_datasets.sh但实话告诉你在国内网络环境下这个脚本同样会失败因为它也是从sourceforge下载。我们必须手动解决。方法一手动下载并放置最可靠这是我最推荐的方法虽然步骤多一点但一劳永逸。你需要下载三个压缩包大地水准面数据egm96-5.tar.bz2重力场数据egm96.zip地磁场数据emm2015.zip由于直接从sourceforge下载可能很慢我建议你用一台能顺畅访问外网的电脑比如你的Windows主力机通过浏览器访问下面的链接进行下载。这是完全合规的软件资源获取方式https://sourceforge.net/projects/geographiclib/files/geoids-distrib/egm96-5.tar.bz2/downloadhttps://sourceforge.net/projects/geographiclib/files/gravity-distrib/egm96.zip/downloadhttps://sourceforge.net/projects/geographiclib/files/magnetic-distrib/emm2015.zip/download下载完成后你会得到三个压缩包。把它们通过U盘、SCP命令或者任何你喜欢的方式拷贝到你的Ubuntu电脑的某个目录下比如~/Downloads。然后打开终端进入这个目录依次解压tar -xjf egm96-5.tar.bz2 unzip egm96.zip unzip emm2015.zip解压后你会得到三个文件夹通常名字是geoids、gravity、magnetic。现在我们需要创建一个名为GeographicLib的文件夹注意大小写和拼写必须完全一致并把这三个文件夹放进去。你可以用命令来完成mkdir GeographicLib mv geoids GeographicLib/ mv gravity GeographicLib/ mv magnetic GeographicLib/最后也是最关键的一步把这个GeographicLib文件夹放到系统指定的路径下sudo cp -r GeographicLib /usr/share/执行这条命令需要管理员权限它会将整个文件夹复制到/usr/share/目录下。完成后GeographicLib数据集就安装好了。你可以通过ls /usr/share/GeographicLib检查一下应该能看到geoids、gravity、magnetic这三个子目录。方法二使用国内镜像源如果可用有些时候国内的软件源也会缓存这些数据集。你可以尝试在换好国内ROS源如清华源、中科大源后再次运行sudo apt-get install ros-noetic-mavros*。如果运气好可能会从镜像站成功下载。但据我的经验这个成功率不是100%所以手动下载始终是最保险的后盾。搞定这个最头疼的依赖后你可以重新运行MAVROS的安装命令这次应该会飞快地完成因为系统检测到GeographicLib已经存在就不会再尝试下载了。4. 连接飞控权限与端口的那些“坑”软件环境齐备了现在让我们把电脑和PX4飞控用USB线连接起来。这看似简单的一步却藏着好几个新手必踩的“坑”。首先插上USB线后打开终端输入ls /dev/ttyACM*或者ls /dev/ttyUSB*。你应该能看到一个类似/dev/ttyACM0的设备文件。这就是你的飞控在系统里的“门牌号”。如果什么都没显示先检查USB线是否完好飞控是否通电很多飞控需要单独供电或通过USB供电。还可以尝试dmesg | grep tty命令查看系统内核信息看看有没有识别到新的串口设备。找到设备后第一个“坑”来了权限问题。普通用户默认没有读写串口设备的权限。如果你直接启动MAVROS很可能会报错“Permission denied”。临时解决方法是每次插上飞控后都执行sudo chmod 777 /dev/ttyACM0但这很麻烦。一劳永逸的方法是把你自己的用户加入到dialout用户组这个组通常拥有串口设备的读写权限。执行以下命令请将ubuntu替换为你的实际用户名sudo usermod -aG dialout ubuntu然后非常重要你需要注销当前用户并重新登录或者重启电脑这个组权限变更才会生效。仅仅在终端里newgrp dialout可能只在当前shell会话中有效。为了确保万无一失我建议你直接重启一下电脑。重启后再执行ls -l /dev/ttyACM0看看权限部分如果显示crw-rw----并且所属组是dialout那说明你的用户已经在组里了权限问题就彻底解决了。第二个“坑”是波特率设置。PX4飞控通过USB连接时默认的通信波特率通常是921600或者57600。在MAVROS的启动配置里我们需要指定这个波特率。如果你不确定可以查看PX4飞控的参数SER_TEL2_BAUD如果USB连接的是TELEM2口或者最稳妥的办法是两种都试试。5. 启动与测试让MAVROS“活”起来万事俱备只欠东风。现在我们来启动MAVROS节点建立与飞控的通信。请确保你的PX4飞控已经上电并通过USB连接到电脑且已经刷好了标准的PX4固件例如通过QGroundControl刷写。打开一个终端我们将启动MAVROS。这里需要指定飞控的连接地址。根据你的连接方式和波特率启动命令有所不同对于USB连接波特率921600较新固件常见roslaunch mavros px4.launch fcu_url:/dev/ttyACM0:921600对于USB连接波特率57600roslaunch mavros px4.launch fcu_url:/dev/ttyACM0:57600对于数传电台连接例如连接到/dev/ttyUSB0波特率57600roslaunch mavros px4.launch fcu_url:/dev/ttyUSB0:57600如果一切配置正确你会看到终端开始刷屏输出大量的连接信息。重点关注开头部分如果看到[ INFO] [时间戳]: FCU URL: /dev/ttyACM0:921600和[ INFO] [时间戳]: CON: Got HEARTBEAT, connected.这样的信息并且没有红色的[ERROR]报错那么恭喜你MAVROS已经成功连接上了PX4飞控。连接成功后MAVROS会发布一大堆话题Topic。我们可以打开另一个终端用ROS工具来验证数据流是否正常。例如查看飞控的IMU数据频率rostopic hz /mavros/imu/data_raw你应该能看到一个稳定的频率输出比如average rate: 249.xxx这说明IMU数据正在以大约250Hz的频率发布。再比如查看无人机的位置估计来自飞控的EKFrostopic echo /mavros/local_position/pose如果飞控已经完成了指南针校准等准备工作你应该能看到不断刷新的位置和姿态数据。这些测试都通过证明通信链路完全健康。6. 首次解锁飞行激动人心的第一步通信测试OK最后我们来完成最具里程碑意义的一步通过MAVROS远程解锁无人机电机。请注意在进行此操作前务必确保无人机桨叶已经卸下并且放置在平稳、空旷、安全的地方电机旋转起来力量很大足以伤人。解锁操作是通过调用ROS服务Service来实现的。确保你的MAVROS启动节点roslaunch mavros px4.launch ...正在运行。然后打开一个新的终端。对于ROS1Noetic/Melodic等rosservice call /mavros/cmd/arming {value: true}或者使用完整的消息类型调用rosservice call /mavros/cmd/arming value: true对于ROS2Foxy/Humble等ros2 service call /mavros/cmd/arming mavros_msgs/srv/CommandBool {data: true}执行命令后仔细观察终端的返回信息。如果成功你会看到类似success: True的反馈。同时你应该能听到PX4飞控发出“哔-哔-哔-哔”连续急促的提示音并且无人机的电机开始低速旋转怠速。这说明你的指令已经成功下发飞控已经进入准备飞行状态。重要安全提醒解锁后如果不需要立即起飞请务必及时上锁。上锁命令和解锁类似只是把true改成falserosservice call /mavros/cmd/arming {value: false}执行后电机停转飞控提示音恢复为解锁前的状态。走到这一步你已经完成了从零配置MAVROS到成功控制飞控的核心闭环。这个过程里遇到的网络问题、权限问题、端口问题都是实实在在的项目开发中高频出现的“拦路虎”。我把它们和解决方案清晰地列出来就是希望你能少走弯路。7. 进阶配置与深度排错指南基础通信打通后你可能还想进行更复杂的操作或者遇到了其他奇怪的问题。这里我分享几个进阶配置和深度排错的技巧。自定义启动参数px4.launch文件隐藏了很多可配置参数。比如你可能想更改连接飞控的协议默认是串口但也支持UDP和TCP。例如如果你想通过WiFi连接机载电脑树莓派上运行的PX4软件在环仿真SITL启动命令是这样的roslaunch mavros px4.launch fcu_url:udp://:14540192.168.1.100:14557这里的IP地址需要替换成你运行SITL的电脑的IP。再比如你可以通过修改px4.launch文件通常位于/opt/ros/noetic/share/mavros/launch/来改变默认的话题名称、坐标系FRD vs ENU等使其更符合你的项目需求。QGC地面站同时连接很多时候我们希望MAVROS和QGroundControl地面站能同时连接飞控。这需要飞控支持多路MAVLink输出。对于Pixhawk系列飞控通常TELEM2口USB可以给MAVROS而无线电数传连接TELEM1口给QGC。你需要在QGC里设置连接为串口并选择正确的COM口和波特率。确保两边的波特率设置一致。深度排错当MAVROS启动失败时。如果启动时直接报错退出可以尝试增加日志输出级别来查看更多细节roslaunch mavros px4.launch fcu_url:/dev/ttyACM0:921600 _log_level:debug查看是否有关于权限、设备不存在、或者协议版本不匹配的错误。如果出现[FATAL]错误说找不到某个文件很可能是GeographicLib数据集没有正确放置请返回第3节仔细检查。另一个常见问题是心跳包HEARTBEAT已收到但其他数据如IMU、GPS没有。这通常意味着MAVROS和PX4之间的数据流Stream没有正确建立。你可以在MAVROS启动后通过ROS服务请求PX4飞控发送所需的数据流。例如请求发送所有数据rosservice call /mavros/set_stream_rate 0 50 1这个命令的参数含义是stream_id(0代表全部),message_rate(Hz),on_off(1开启)。执行后再观察rostopic hz是否有了数据。坐标系困惑无人机领域有NED北东地和ENU东北天等多种坐标系。PX4飞控内部使用FRD前右下机体坐标系和NED导航坐标系。而ROS/MAVROS默认使用ENU坐标系。MAVROS在中间做了转换。当你看到local_position话题下的数据时它已经是转换到ENU坐标系下的了原点为飞控上电时的位置。理解这一点对于后续做定位和导航算法至关重要否则会出现“方向反了”的诡异问题。配置和排错的过程其实就是和系统对话、理解其内部逻辑的过程。每次解决一个难题你对整个系统的掌控力就加深一层。我刚开始玩的时候光是一个权限问题就卡了大半天现在回想起来都是宝贵的经验。希望这份详细的指南能帮你顺利跨过入门阶段最艰难的那些坎把精力更多地投入到有趣的无人机应用开发中去。记住安全第一大胆尝试耐心调试天空才是极限。