2. 环境搭建:Ubuntu系统配置、安装ArduPilot SITL、安装PX4 SITL、安装Gazebo与ROS Noetic、验证环境是否正常

说实话,做无人机系统稳定性验证,最怕的不是算法调不通,而是环境搭到一半崩了。我见过太多同学卡在依赖冲突上,一卡就是两三天。所以这一章,咱们把地基打牢。

我个人习惯用 Ubuntu 20.04 LTS。为什么?因为 ROS Noetic 官方只支持 20.04,而 ArduPilot 和 PX4 的 SITL 在 20.04 上跑得最稳。你非要用 22.04 也不是不行,但有些包得自己编译,坑比较多。

核心思路: 先装系统基础依赖 → 再装 ArduPilot SITL → 再装 PX4 SITL → 然后装 Gazebo + ROS → 最后跑一个仿真验证所有组件是否联通。

2.1 Ubuntu 系统基础配置

装完 Ubuntu 20.04 桌面版后,第一件事不是装软件,而是换源。国内网络环境你懂的,不换源的话,apt update 能卡到你怀疑人生。

# 备份原源
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

# 替换为清华源(也可以用阿里云、中科大)
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

然后装一些基础工具。这些包看着多,但后面编译仿真环境时缺一个都会报错。

sudo apt install -y git wget curl cmake build-essential \
  python3 python3-pip python3-venv \
  libeigen3-dev libopencv-dev \
  protobuf-compiler libprotobuf-dev \
  libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
小技巧: 我习惯装完系统后先跑一次 sudo apt autoremove,把没用的旧内核清理掉,避免 /boot 分区爆满。曾经有个项目,仿真跑了三天突然报错,查了半天发现是磁盘满了。

2.2 安装 ArduPilot SITL

ArduPilot 的 SITL 其实就是一个可以在 PC 上运行的固件模拟器。它不需要真实硬件,直接用你的电脑 CPU 模拟飞控的运算。

先克隆代码。注意,ArduPilot 的仓库很大,建议用 --depth=1 只拉最新版本,省时间也省硬盘。

cd ~
git clone --depth=1 https://github.com/ArduPilot/ardupilot.git
cd ardupilot

# 安装子模块(这一步比较慢,耐心等)
git submodule update --init --recursive

# 安装 Python 依赖
pip3 install -r requirements.txt

# 编译 SITL 固件(以 Copter 为例)
./waf configure --board sitl
./waf copter

编译完成后,验证一下能不能启动:

cd ~/ardupilot
sim_vehicle.py -v ArduCopter --map --console

如果看到 MAVLink 控制台和地图窗口弹出来,说明 ArduPilot SITL 装好了。我第一次看到那个地图窗口时还挺激动的——一个没有硬件的无人机,就这么在电脑里飞起来了。

注意: 如果 sim_vehicle.py 报错说缺少 mavproxy,手动装一下:pip3 install mavproxy。另外,确保你的 Python 版本是 3.8 或 3.9,3.10 以上有些包不兼容。

2.3 安装 PX4 SITL

PX4 的 SITL 安装方式跟 ArduPilot 不太一样。它用 make 来编译,而且依赖 Gazebo 作为仿真后端。不过咱们先只装 SITL 本体,Gazebo 后面单独装。

cd ~
git clone --depth=1 https://github.com/PX4/PX4-Autopilot.git --branch v1.14.3
cd PX4-Autopilot

# 安装 PX4 的 Python 依赖
pip3 install -r requirements.txt

# 编译 SITL 固件
make px4_sitl gazebo-classic

这里有个坑:make px4_sitl gazebo-classic 会尝试自动下载 Gazebo,但国内网络经常失败。我建议先装好 Gazebo 再跑这个命令,或者用 make px4_sitl 只编译固件,后面再手动配置 Gazebo 的模型路径。

编译成功后,测试一下:

cd ~/PX4-Autopilot
make px4_sitl gazebo-classic_iris

如果看到 Gazebo 窗口里出现一架 Iris 四旋翼,说明 PX4 SITL 跑起来了。

2.4 安装 Gazebo 与 ROS Noetic

Gazebo 和 ROS 的安装顺序有讲究。我建议先装 ROS,再装 Gazebo,因为 ROS 的包管理会自动处理 Gazebo 的依赖版本。

2.4.1 安装 ROS 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

# 更新并安装桌面完整版
sudo apt update
sudo apt install -y ros-noetic-desktop-full

# 初始化 rosdep
sudo rosdep init
rosdep update

# 设置环境变量
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source ~/.bashrc

装完后验证一下:

roscore

如果看到 ROS master 启动的日志,说明 ROS 装好了。按 Ctrl+C 退出。

2.4.2 安装 Gazebo 11

ROS Noetic 官方推荐 Gazebo 11。直接用 apt 装最省事:

sudo apt install -y gazebo11 libgazebo11-dev

# 安装 ROS 与 Gazebo 的桥接包
sudo apt install -y ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control

验证 Gazebo 能否启动:

gazebo --verbose

第一次启动可能会慢一些,因为要加载模型库。看到空荡荡的灰色世界窗口,就说明成功了。

避坑指南: 我曾经在 Gazebo 启动时遇到黑屏,折腾了半天发现是显卡驱动问题。如果你用虚拟机,记得开启 3D 加速;如果是双系统,确保装了 NVIDIA 官方驱动。Gazebo 对 OpenGL 版本有要求,低于 3.3 会直接罢工。

2.5 验证环境是否正常

所有组件装完后,咱们做一个综合验证。目标是:启动 PX4 SITL,让它通过 ROS 与 Gazebo 通信,然后从 MAVROS 发一条起飞指令,看无人机是否真的离地。

先创建一个 ROS 工作空间:

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
catkin_make
source devel/setup.bash

然后安装 MAVROS:

sudo apt install -y ros-noetic-mavros ros-noetic-mavros-extras

# 下载地理数据(MAVROS 需要)
sudo /opt/ros/noetic/lib/mavros/install_geographiclib_datasets.sh

现在启动完整的仿真链路。我习惯用一个 launch 文件来管理,但为了验证,咱们分步来:

终端 1:启动 PX4 SITL + Gazebo

cd ~/PX4-Autopilot
make px4_sitl gazebo-classic_iris

终端 2:启动 MAVROS 桥接

roslaunch mavros px4.launch fcu_url:="udp://:14540@127.0.0.1:14557"

终端 3:发送起飞指令

rostopic pub -1 /mavros/cmd/arming std_msgs/Empty "{}"
rostopic pub -1 /mavros/cmd/takeoff mavros_msgs/CommandTOL "{min_pitch: 0.0, yaw: 0.0, latitude: 0.0, longitude: 0.0, altitude: 2.0}"

如果一切正常,你会看到 Gazebo 里的 Iris 无人机缓缓升到 2 米高度。那一刻,整个环境搭建就算验证通过了。

验证清单:
  • ArduPilot SITL 能启动并显示 MAVLink 控制台
  • PX4 SITL 能启动并加载 Gazebo 模型
  • Gazebo 窗口正常渲染,无黑屏或崩溃
  • ROS Noetic 的 roscore 能正常启动
  • MAVROS 能成功连接 PX4 SITL
  • 无人机能响应起飞指令并保持悬停

2.6 环境架构总览

为了让你对整个仿真链路有个直观认识,我画了一张架构图。它展示了各个组件之间的数据流向:

SITL 仿真环境架构图 用户 / 地面站 MAVLink 协议 ArduPilot SITL PX4 SITL Gazebo 物理仿真引擎 动力学模型 · 传感器仿真 · 环境渲染 ROS Noetic 中间件 MAVROS 桥接节点 ROS 话题 / 服务 数据流:用户指令 → 飞控 → Gazebo → ROS → MAVROS → 反馈回用户

从这张图你可以看到,整个仿真链路其实是一个闭环:用户通过地面站或 ROS 话题发送指令,经过 MAVLink 协议到达飞控 SITL,飞控计算控制量后传给 Gazebo 进行物理仿真,Gazebo 把传感器数据通过 ROS 发回给飞控,同时 MAVROS 把状态信息反馈给用户。任何一个环节断了,无人机都飞不起来。

2.7 常见问题与解决

问题现象 可能原因 解决方法
sim_vehicle.py 报错 "No module named 'mavproxy'" MAVProxy 未安装 pip3 install mavproxy
Gazebo 启动黑屏 显卡驱动或 OpenGL 版本问题 安装 NVIDIA 驱动;虚拟机开启 3D 加速
make px4_sitl 下载依赖超时 网络问题 使用代理或手动下载依赖包
MAVROS 连接失败 端口号或 IP 不匹配 检查 PX4 启动日志中的 UDP 端口,确保与 launch 文件一致
无人机起飞后剧烈抖动 PID 参数未调或仿真步长问题 检查 mc_att_control 参数;降低仿真实时性要求

嗯,环境搭建这部分内容确实不少,但每一步都有它的意义。你想想看,如果连仿真环境都跑不通,后面那些稳定性分析、控制器调参根本无从谈起。我当年刚开始做飞控时,光装环境就花了一周,踩过的坑现在都变成经验了。