1. 为什么你需要一个“合体”的开发环境?
如果你刚开始接触无人机开发,可能会觉得PX4和ROS是两个独立的庞然大物。PX4负责飞控,管着无人机怎么飞得稳、怎么执行任务;ROS则是机器人界的“社交达人”,负责协调各种传感器、规划路径,并做出决策。以前,你可能需要分别折腾它们,然后在中间写一大堆串口通信代码,既麻烦又容易出错。
现在,把它们“撮合”在一起,让ROS直接和PX4“对话”,事情就变得优雅多了。你可以用ROS强大的工具链(比如Rviz可视化、rosbag记录数据)来实时监控无人机状态,用ROS的节点来发送高级指令(比如“飞到那个坐标点”),而PX4则专心负责底层稳定的飞行控制。这就像是给无人机装上了大脑(ROS)和小脑(PX4),大脑负责思考去哪、做什么,小脑负责保持平衡、精准执行每一个动作。
搭建这个联合环境,听起来有点技术含量,但别怕。我当年也是从一堆报错里爬出来的。这篇指南,我会把我踩过的坑、验证过的步骤,掰开揉碎了讲给你听。我们的目标很明确:在一台Ubuntu系统的电脑上,搭建一个能编译PX4固件、能运行ROS、并且能让它们俩顺畅通信的完整开发环境。 跟着走,即使你是新手,也能一步步搞定。
2. 搭建前的准备工作:打好地基
万事开头难,准备工作做得好,后面就能省下一半的麻烦。这里没有高深理论,全是实打实的操作。
2.1 选择并安装你的操作系统
PX4和ROS对Linux系统,特别是Ubuntu,支持得最好。强烈推荐使用Ubuntu 18.04 LTS或Ubuntu 20.04 LTS。这两个是长期支持版,社区资源最丰富,遇到问题也最容易找到答案。我个人的经验是,对于PX4+ROS Melodic这个经典组合,Ubuntu 18.04兼容性最无懈可击;如果你想用更新的ROS Noetic,那就选Ubuntu 20.04。
怎么安装Ubuntu?如果你用的是Windows,我建议你在电脑上搞个双系统,或者使用虚拟机。双系统性能最好,但需要分区操作;虚拟机(如VMware或VirtualBox)安装简单,但图形性能和USB设备直通可能会有点小问题。如果你用Mac,可以考虑用虚拟机安装Ubuntu。无论哪种方式,请确保为Ubuntu系统分配至少50GB的磁盘空间,因为后续要下载的源码和编译中间文件会占用不少地方。
2.2 必不可少的系统更新与基础工具
装好Ubuntu后,第一件事就是打开终端(快捷键 Ctrl+Alt+T),把系统更新到最新状态。这能确保你的软件源和基础库都是最新的,避免很多因版本过旧导致的依赖问题。
sudo apt update
sudo apt upgrade -y
更新完成后,安装一些我们后续步骤一定会用到的“瑞士军刀”式工具,比如用于下载代码的 git、用于解压的 curl、wget等。
sudo apt install git curl wget zip unzip cmake build-essential -y
2.3 关键一步:将用户加入dialout组
这是一个非常关键但容易被忽略的步骤。在Linux系统中,串口(USB口)设备默认只有root用户有读写权限。我们的飞控板(如Pixhawk)是通过USB连接到电脑的,为了让你的普通用户账号能访问它,必须将用户加入到dialout用户组。
操作很简单,一行命令:
sudo usermod -a -G dialout $USER
执行完这条命令后,你必须完全注销当前用户,然后重新登录,或者直接重启电脑。这个改动只有在重新登录会话后才会生效。很多同学在这一步偷懒,没重启,后面连接飞控时就会遇到“权限拒绝”的错误,切记切记。
3. 安装PX4开发工具链:让飞控“活”起来
PX4官方提供了非常方便的安装脚本,可以一键安装大部分依赖。但网络环境时好时坏,我们得做两手准备。
3.1 使用官方脚本安装(网络畅通时的首选)
官方脚本会帮你安装编译器、仿真工具、uORB消息生成器等一整套东西。在终端中,依次执行以下命令:
# 下载PX4源码(包含安装脚本)
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
# 运行基础依赖安装脚本
bash ./Tools/setup/ubuntu.sh
这个 ubuntu.sh 脚本是针对最新版PX4的。它会自动检测你的Ubuntu版本并安装对应的依赖。过程中需要输入密码确认,并且会下载不少东西,请保持网络连接稳定。
3.2 手动安装与常见问题破解
有时候官方脚本可能会因为网络问题卡住,或者安装不全。这时候我们就得知道它背后干了啥,手动查漏补缺。
问题1:ubuntu.sh 脚本运行失败或极慢
这通常是访问国外软件源或GitHub慢导致的。我们可以为apt换一个国内的软件源镜像(如阿里云、清华源),并配置GitHub加速。
对于apt,可以备份原来的源列表文件 /etc/apt/sources.list,然后替换为国内源的内容。具体替换方法可以搜索“Ubuntu 换源”。
对于Git,可以设置代理或使用镜像站。一个简单的方法是修改git clone时的地址,但更推荐的是使用git config设置HTTPS代理(如果你有的话)。
问题2:Python包安装失败
PX4编译依赖一些Python包,比如jinja2和pyserial。如果脚本没装好,可以手动安装:
# 确保已安装pip
sudo apt install python-pip # 对于Ubuntu 18.04/Python2
# 或
sudo apt install python3-pip # 对于Ubuntu 20.04/Python3
# 安装必要的Python包
pip install --user jinja2 pyserial
# 如果系统默认是python3,则使用pip3
# pip3 install --user jinja2 pyserial
问题3:权限问题导致编译失败
这是非常经典的一个坑。当你第一次在PX4-Autopilot目录下执行make编译命令时,可能会遇到类似“Permission denied”的错误,指向Tools或build目录下的某些文件。
这是因为从Git克隆下来的某些脚本文件没有执行权限。解决方法很简单,在PX4-Autopilot根目录下,赋予工具链执行权限:
# 在PX4-Autopilot目录下执行
chmod +x Tools/setup/*.sh
# 如果后续在特定平台编译还有问题,可以尝试对Nuttx工具链也加权限
cd Platforms/nuttx/Nuttx/nuttx
chmod -R 777 tools
cd ../../../../ # 返回PX4-Autopilot根目录
3.3 第一次编译测试:验证PX4环境
工具链安装好后,我们不需要连接真实的飞控,就可以先进行一次编译测试,这能验证环境是否基本正确。我们编译一个针对仿真器(如Gazebo)的版本。
# 确保在PX4-Autopilot根目录
make px4_sitl_default gazebo
这个命令会编译PX4的软件在环(SITL)仿真版本,并自动启动Gazebo仿真环境。如果一切顺利,你会看到终端开始疯狂输出编译信息,最后Gazebo界面弹出来,里面有一架 Iris 无人机模型。看到这个,恭喜你,PX4的基础环境就算搭成了!按 Ctrl+C 可以终止仿真。
4. 安装ROS与MAVROS:架起沟通的桥梁
ROS是我们的“大脑”,而MAVROS则是连接大脑和PX4“小脑”的专用插件。它把ROS的话题(Topic)、服务(Service)转换成PX4能理解的MAVLink消息。
4.1 安装ROS Melodic(对应Ubuntu 18.04)
如果你的系统是Ubuntu 18.04,那么对应的ROS发行版是Melodic。在终端中依次执行以下命令:
# 1. 设置软件源
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
# 2. 设置密钥
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# 3. 更新软件包索引
sudo apt update
# 4. 安装ROS桌面完整版(推荐,包含ROS、rqt、rviz、机器人通用库等)
sudo apt install ros-melodic-desktop-full -y
# 5. 初始化rosdep(ROS依赖管理工具)
sudo rosdep init
rosdep update
# 6. 设置环境变量,让终端能找到ROS命令
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
source ~/.bashrc
# 7. 安装构建ROS包所需的工具
sudo apt install python-rosinstall python-rosinstall-generator python-wstool build-essential -y
注意:sudo rosdep init 和 rosdep update 这两步经常因为网络问题失败。如果遇到rosdep update失败,通常是连接不到海外资源。解决办法是修改rosdep的源为国内镜像。你可以搜索“ROS melodic rosdep 国内源”找到具体的修改方法,通常是修改/etc/ros/rosdep/sources.list.d/20-default.list文件中的URL。
4.2 安装ROS Noetic(对应Ubuntu 20.04)
如果你用的是Ubuntu 20.04,那就安装ROS Noetic。步骤与Melodic类似,只是把命令中的melodic替换为noetic,并且注意Python版本变成了Python3。
# 设置软件源和密钥(Noetic的密钥可能不同,请以ROS官网指令为准)
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver 'hkp://keyserver.ubuntu.com:80' --recv-key C1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
# 对于Noetic,可能需要使用curl方式安装密钥,具体请参考ros.org官网
sudo apt update
sudo apt install ros-noetic-desktop-full -y
sudo rosdep init
rosdep update
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt install python3-rosinstall python3-rosinstall-generator python3-wstool build-essential -y
4.3 安装并编译MAVROS
MAVROS的安装推荐使用源码编译的方式,这样能获得最新的特性,并且更容易排查问题。
首先,创建一个ROS的工作空间(如果还没有的话):
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin init
接下来,使用wstool工具来获取MAVROS及其依赖的源码。MAVROS依赖MAVLink,所以我们需要一起下载。
cd ~/catkin_ws/src
# 下载MAVROS源码
git clone https://github.com/mavlink/mavros.git
# 下载MAVLink消息定义(MAVROS的子模块)
cd mavros
git submodule update --init --recursive
cd ..
在编译之前,我们需要用rosdep来自动安装系统依赖。这一步非常重要,能避免很多“找不到头文件”之类的编译错误。
cd ~/catkin_ws
rosdep install --from-paths src --ignore-src --rosdistro melodic -y
# 如果是Noetic,将 melodic 替换为 noetic
如果rosdep install命令报错,提示找不到某些依赖,你可以尝试手动安装最常见的几个:
sudo apt install ros-melodic-geographic-msgs ros-melodic-geodesy ros-melodic-mavlink -y
# 对于Noetic: ros-noetic-geographic-msgs ros-noetic-geodesy ros-noetic-mavlink
依赖解决后,就可以开始编译了。我们使用catkin build而不是旧的catkin_make,因为它更智能,支持并行编译且隔离性更好。
cd ~/catkin_ws
catkin build
编译过程可能需要一段时间。如果最终看到类似“[100%]”的进度提示,并且没有红色错误信息,就说明成功了。
4.4 安装地理数据库
MAVROS需要一些地理数据库文件才能进行精确的地理位置计算(比如GPS坐标转换)。官方提供了一个脚本自动安装:
# 在catkin_ws目录下,运行MAVROS提供的脚本
cd ~/catkin_ws/src/mavros/mavros/scripts
sudo ./install_geographiclib_datasets.sh
这个脚本会下载并安装所需的数据集。如果因为网络问题下载失败,你可以去GeographicLib的官网手动下载geographiclib-datasets-*.tar.gz文件,然后根据脚本内容手动解压到/usr/share/GeographicLib目录下。
5. 连接与测试:让PX4和ROS握手
环境都装好了,现在我们来让它们俩“见个面”,确认通信是否正常。
5.1 使用软件在环(SITL)仿真测试
这是最安全、最方便的测试方法,不需要真实硬件。我们需要同时启动PX4仿真和MAVROS节点。
第一步:启动PX4 SITL仿真 在一个终端窗口中,启动PX4的Gazebo仿真:
cd ~/PX4-Autopilot
make px4_sitl_default gazebo
等待Gazebo启动完毕,无人机模型加载出来。
第二步:启动MAVROS节点 再打开一个新的终端窗口,先激活ROS和你的工作空间环境,然后启动MAVROS节点,让它连接到PX4仿真器。
# 激活ROS环境(如果是Noetic,把melodic换成noetic)
source /opt/ros/melodic/setup.bash
# 激活你的catkin工作空间
source ~/catkin_ws/devel/setup.bash
# 启动MAVROS,连接到本地UDP端口14550(这是PX4 SITL的默认端口)
roslaunch mavros px4.launch fcu_url:="udp://:14550@127.0.0.1:14557"
第三步:检查通信状态 再打开第三个终端,使用ROS命令行工具查看话题和检查连接状态。
# 查看当前所有活跃的ROS话题,应该能看到很多以/mavros/开头的话题
rostopic list
# 检查MAVROS与飞控的连接状态
rostopic echo /mavros/state
关注/mavros/state话题输出的connected字段,如果显示True,并且armed和guided字段也有合理值,那就说明MAVROS已经成功连接到了PX4仿真器!你还可以通过rostopic echo /mavros/imu/data来查看仿真IMU数据,确认数据流是否正常。
5.2 连接真实飞控硬件测试
当你有了真实的Pixhawk等飞控硬件后,测试步骤也很类似,只是连接方式变了。
- 连接飞控:用USB线将Pixhawk连接到电脑。
- 检查设备:在终端输入
ls /dev/ttyACM*或ls /dev/ttyUSB*,应该能看到类似/dev/ttyACM0的设备出现。记住这个设备名。 - 修改启动参数:启动MAVROS时,将
fcu_url参数改为串口设备。你需要有该串口的读写权限(这就是为什么之前要把用户加入dialout组)。
roslaunch mavros px4.launch fcu_url:="/dev/ttyACM0:57600"
这里的57600是PX4默认的串口波特率。如果连接不上,可以尝试921600(高速率)或115200。
- 同样检查状态:使用
rostopic echo /mavros/state来确认硬件连接是否成功。如果connected为True,并且你能在QGroundControl地面站中同时看到连接,那就大功告成了。
6. 进阶配置与开发技巧
环境搭通只是第一步,要想高效开发,还得做一些优化和了解一些技巧。
6.1 配置工作环境脚本
每次开终端都要source一堆脚本太麻烦。我们可以把这两条命令加到~/.bashrc文件的末尾:
echo "source /opt/ros/melodic/setup.bash" >> ~/.bashrc
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
# 还可以加上PX4-Autopilot的环境变量,方便直接使用make命令
echo "export PX4_HOME=~/PX4-Autopilot" >> ~/.bashrc
echo "cd $PX4_HOME" >> ~/.bashrc
这样每次打开新的终端,ROS和你的工作空间环境就自动准备好了。
6.2 理解通信桥梁:MAVLink与MAVROS
MAVLink是PX4和外界通信的“语言”,是一种非常轻量级的消息编组协议。MAVROS则是一个“翻译官”+“邮差”,它内部运行着一个MAVLink路由器,负责:
- 翻译:将ROS的标准消息类型(如
sensor_msgs/Imu)翻译成MAVLink消息(如HIGHRES_IMU)发给PX4,反之亦然。 - 路由:管理多个MAVLink连接(比如同时连接地面站和你的ROS节点)。
你开发自己的ROS节点时,只需要订阅或发布到/mavros/下的相关话题即可,完全不用直接处理MAVLink的字节流。例如,要控制无人机起飞,你可以给/mavros/setpoint_position/local发布一个geometry_msgs/PoseStamped类型的目标位置消息,同时通过服务调用/mavros/cmd/arming来解锁电机。
6.3 常用调试与诊断命令
开发过程中,这些命令会成为你的好帮手:
rqt_graph:可视化显示当前ROS节点和话题之间的连接图,一眼看清数据流向。rosnode info /mavros:查看MAVROS节点的详细信息,包括它发布和订阅的所有话题、服务。rostopic hz /mavros/imu/data:查看IMU数据的实际发布频率,检查数据流是否稳定。rqt_console:查看ROS节点的日志输出,过滤错误和警告信息。- 如果MAVROS连接不上,首先检查
fcu_url参数是否正确,其次检查串口权限,最后查看MAVROS启动时的日志输出,通常会有明确的错误提示。
6.4 固件更新与自定义编译
当你需要修改PX4飞控行为时,就需要修改固件源码并重新编译、烧录。
- 修改代码:在
~/PX4-Autopilot目录下找到对应的模块源码进行修改。 - 编译固件:针对你的飞控硬件进行编译。例如,针对Pixhawk 4使用:
编译成功后,会在cd ~/PX4-Autopilot make px4_fmu-v5_default # Pixhawk 4 的编译目标build/px4_fmu-v5_default目录下生成px4_fmu-v5_default.px4固件文件。 - 烧录固件:
- 通过USB烧录(推荐):用USB线连接飞控和电脑,然后运行:
终端会提示你按一下飞控上的复位按钮,然后自动完成烧录。make px4_fmu-v5_default upload - 通过QGroundControl烧录:将生成的
.px4文件在QGC的“固件”页面中,选择“自定义固件文件”进行烧录。
- 通过USB烧录(推荐):用USB线连接飞控和电脑,然后运行:
7. 避坑指南:我踩过的那些雷
这条路我走过,有些坑你完全可以避开。
- 坑1:编译PX4时内存不足:编译PX4,特别是
make px4_sitl_default gazebo第一次会非常消耗内存,如果虚拟机分配的内存小于4GB,很可能在编译Gazebo模型时卡死或报错。建议给虚拟机分配至少4GB(推荐8GB)内存。 - 坑2:ROS版本与Ubuntu版本不匹配:这是最致命的问题。一定要严格按照ROS官网的说明配对。Ubuntu 18.04配Melodic,20.04配Noetic。混用会导致大量库找不到。
- 坑3:
catkin build失败,提示找不到geographiclib:这就是前面提到的地理数据库没装。务必运行install_geographiclib_datasets.sh脚本。 - 坑4:MAVROS连接成功,但QGroundControl连不上:当MAVROS通过USB连接飞控时,它独占了串口。QGroundControl无法同时访问。解决方法有两种:一是通过MAVROS将数据转发给QGC(配置
gcs_url参数),二是使用飞控上的另一个串口(如TELEM2)专门连接数传电台,让QGC通过数传连接。 - 坑5:自定义消息编译问题:如果你在PX4中修改了uORB消息定义,在ROS端也需要同步更新对应的
px4_msgs包。通常需要重新编译px4_ros_com这个包(如果你用了的话),并确保ROS节点引用了最新的消息头文件。
搭建环境的过程就像拼一个复杂的乐高模型,每一步都卡紧了,最后才能严丝合缝地运行起来。别怕报错,终端里的错误信息是你最好的朋友,仔细阅读它,百分之九十的问题都能通过搜索错误信息找到解决方案。多动手试一次,你对整个系统的理解就会更深一层。当你第一次看到自己的ROS节点成功控制仿真无人机起飞时,那种成就感会让你觉得这一切折腾都是值得的。好了,环境已经就绪,接下来就可以尽情探索无人机自主飞行的精彩世界了。

1万+

被折叠的 条评论
为什么被折叠?



