2. 开发环境搭建
说实话,做多无人机地面站开发,环境搭建这一步最容易被轻视。很多人急着写代码,结果编译报错一整天,最后发现是依赖版本没对齐。我这些年踩过的坑,十有八九都出在环境上。所以这一章,咱们把地基打牢。
本章核心目标:在一台干净的 Ubuntu 机器上,完成从操作系统配置到 PX4 仿真环境联调的全链路搭建。最终你能在终端里跑起一个虚拟无人机,并且用 ROS2 节点给它发指令。
2.1 操作系统选择与基础配置
我个人习惯用 Ubuntu 22.04 LTS。为什么?因为 ROS2 Humble 官方推荐的就是 22.04,省去很多兼容性麻烦。当然,如果你手头只有 20.04 的机器,也能用,但需要手动处理一些依赖版本问题。
装完系统后,第一件事不是装 ROS,而是换源。你想想看,国内网络环境从官方源拉包,那速度……嗯,你懂的。
# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 替换为清华源(Ubuntu 22.04)
sudo sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
sudo sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list
# 更新
sudo apt update && sudo apt upgrade -y
小技巧:换源后记得检查一下 apt policy 的输出,确认源地址已经变成镜像站。我曾经遇到过 sed 命令没生效,结果还是从官方源下载,白白等了半小时。
接下来装一些基础工具。这些包后面都会用到,一次性装好省事。
sudo apt install -y \
git \
wget \
curl \
vim \
net-tools \
htop \
build-essential \
cmake \
python3-pip \
python3-venv \
terminator
2.2 ROS2 Humble 安装与配置
ROS2 的安装流程其实很固定,但有几个细节容易翻车。我建议严格按照官方步骤来,别自己瞎改。
2.2.1 设置 locale
ROS2 要求 UTF-8 编码。这一步很多人跳过,结果后面 ros2 topic list 中文乱码。
sudo apt update && sudo apt install locales
sudo locale-gen en_US en_US.UTF-8
sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8
export LANG=en_US.UTF-8
2.2.2 添加 ROS2 源
# 添加 ROS2 GPG key
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
# 添加源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
2.2.3 安装 ROS2 Humble
这里有两个选择:桌面版(desktop)和基础版(base)。做地面站开发,我建议装桌面版,因为包含了 rviz2、rqt 等可视化工具,调试时非常有用。
sudo apt install -y ros-humble-desktop
装完后,记得把 ROS2 环境变量加到 .bashrc 里。不然每次开终端都要 source 一遍,烦不烦?
echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc
source ~/.bashrc
注意:如果你同时装了 ROS1 和 ROS2,千万别把两个 setup.bash 都 source 到同一个终端里。环境变量会打架,导致各种诡异错误。我建议用别名或者单独开终端来区分。
2.2.4 验证安装
跑一个简单的 talker-listener 测试,确认 ROS2 能正常工作。
# 终端1
ros2 run demo_nodes_cpp talker
# 终端2
ros2 run demo_nodes_py listener
如果看到 "I heard: Hello World" 这样的输出,说明 ROS2 装好了。
2.3 MAVSDK 与 PX4 环境搭建
这部分是地面站开发的核心。MAVSDK 负责和无人机通信,PX4 提供仿真环境。两者配合,才能在地面站上看到虚拟无人机的状态。
2.3.1 安装 PX4 依赖
PX4 的编译依赖比较多,我整理了一个清单,照着装就行。
| 依赖类别 | 具体包名 | 用途 |
|---|---|---|
| 编译工具 | gcc, g++, cmake, ninja-build | 编译 PX4 固件 |
| Python 工具 | pip, empy, toml, numpy, jinja2 | 代码生成与配置 |
| 仿真依赖 | Gazebo, protobuf, libeigen3-dev | 无人机物理仿真 |
| 图形界面 | libopencv-dev, libgstreamer1.0-dev | 机载摄像头模拟 |
# 一键安装
sudo apt install -y \
gcc g++ cmake ninja-build \
python3-pip python3-empy python3-toml python3-numpy python3-jinja2 \
libeigen3-dev libopencv-dev libgstreamer1.0-dev \
gazebo libgazebo-dev
pip3 install --user protobuf==3.20.3
避坑指南:protobuf 版本一定要锁在 3.20.3。我试过装最新版,结果 PX4 编译时报 protobuf 兼容性错误,折腾了一下午才发现是版本问题。
2.3.2 编译 PX4 固件
从 GitHub 克隆 PX4 源码,然后编译。注意,这里要用 make px4_sitl 编译仿真版本,不是飞控硬件版本。
cd ~
git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
make px4_sitl gazebo
第一次编译会比较慢,大概 20-30 分钟。趁这个时间,你可以去泡杯咖啡。编译成功后,你会看到 Gazebo 窗口弹出来,里面有一架四旋翼无人机。
2.3.3 安装 MAVSDK
MAVSDK 提供 C++ 和 Python 两种接口。做地面站开发,我推荐用 C++ 版本,性能更好。但如果你只是快速验证,Python 版本也够用。
# 安装 MAVSDK C++ 库
cd ~
wget https://github.com/mavlink/MAVSDK/releases/download/v1.4.0/libmavsdk-dev_1.4.0_amd64.deb
sudo dpkg -i libmavsdk-dev_1.4.0_amd64.deb
# 安装 MAVSDK Python 库
pip3 install mavsdk
2.3.4 验证 MAVSDK 与 PX4 通信
启动 PX4 仿真后,MAVSDK 默认通过 UDP 端口 14540 与仿真器通信。我们来写一个简单的 Python 脚本,读取无人机的位置信息。
import asyncio
from mavsdk import System
async def run():
drone = System()
await drone.connect(system_address="udp://:14540")
print("等待无人机连接...")
async for state in drone.core.connection_state():
if state.is_connected:
print("无人机已连接!")
break
async for position in drone.telemetry.position():
print(f"位置: {position}")
if __name__ == "__main__":
asyncio.run(run())
运行这个脚本,如果看到位置数据不断输出,说明环境搭建成功了。
2.4 整体架构图
下面这张图展示了我们搭建的整个开发环境架构。你可以看到数据从 PX4 仿真器出发,经过 MAVSDK 桥接,最终被 ROS2 节点消费。
2.5 常见问题与解决方案
环境搭建过程中,有几个问题几乎每个人都会遇到。我列出来,你遇到了直接对照解决。
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
| Gazebo 启动后黑屏 | 显卡驱动问题或模型路径未设置 | 安装 mesa-utils,并设置 export GAZEBO_MODEL_PATH=$HOME/PX4-Autopilot/Tools/sitl_gazebo/models |
| MAVSDK 连接超时 | UDP 端口被占用或防火墙拦截 | 检查 netstat -uln | grep 14540,确保端口未被占用;关闭防火墙测试 |
| ROS2 节点找不到话题 | ROS_DOMAIN_ID 不匹配 | 所有终端设置相同的 export ROS_DOMAIN_ID=0 |
| 编译 PX4 时报 protobuf 错误 | protobuf 版本过高 | 卸载高版本,安装 protobuf==3.20.3 |
重要提醒:如果你在虚拟机里跑 Gazebo,记得开启 3D 加速。否则仿真帧率会低到令人崩溃。我曾在 VirtualBox 里试过,默认设置下只有 5 FPS,根本没法用。换成 VMware 或者直接双系统会好很多。