2. 仿真测试基础

Gazebo,说白了就是无人机开发者的「虚拟试飞场」。

你写好了飞控代码,总不能每次都真机炸机吧?我刚开始做飞控那会儿,有一次在实飞测试中因为一个很小的参数错误,直接把一架四轴摔成了零件。从那以后,我养成了一个习惯——所有改动必须先过Gazebo仿真这一关。

这一章,我们就来把这个「虚拟试飞场」搭起来。

2.1 Gazebo的安装与配置

Gazebo的安装其实不复杂,但版本匹配是个坑。我个人习惯用Gazebo 9搭配ROS Melodic,或者Gazebo 11搭配ROS Noetic。如果你用的是Ubuntu 20.04,我建议直接上Gazebo 11。

注意:千万不要用Ubuntu软件中心直接装Gazebo,那个版本通常太旧,跟ArduPilot和PX4的插件兼容性很差。

正确的安装方式是通过ROS的apt源。先添加ROS软件源,然后一条命令搞定:

sudo apt-get install gazebo11 libgazebo11-dev

装完之后,验证一下:

gazebo --version

如果能看到版本号,说明装好了。嗯,这里要注意——如果你是在虚拟机里跑Gazebo,记得把3D加速打开,否则画面会卡得让你怀疑人生。

2.2 基础世界模型加载

Gazebo装好之后,你看到的默认世界是一个空荡荡的灰色平面。这显然不够用。我们需要加载一些基础世界模型,比如带障碍物的测试场、带建筑物的城市环境,或者模拟风场的动态环境。

Gazebo的世界模型文件是.world格式,本质上是SDF(Simulation Description Format)文件。你可以从Gazebo官方模型库下载,也可以自己写。

加载一个世界模型很简单:

gazebo worlds/empty.world

但空世界没什么意思。我常用的一个测试世界是iris_ardupilot.world,它包含了草地、几个锥桶和一个简单的跑道。加载命令:

gazebo ~/ardupilot_gazebo/worlds/iris_ardupilot.world
小技巧:如果你想让Gazebo启动时自动加载某个世界,可以在~/.bashrc里设置export GAZEBO_WORLD_PATH环境变量,指向你的世界文件目录。

世界模型里可以包含很多东西:地面、建筑、树木、光照、甚至风场。我曾在项目中用过一个带动态风场的世界模型,用来测试无人机在阵风条件下的姿态稳定性。效果很真实,比在真机上试安全多了。

2.3 传感器插件介绍

Gazebo本身只是一个物理引擎和渲染器。要让无人机「感知」环境,需要传感器插件。这些插件模拟了真实传感器的输出,比如图像、激光点云、IMU数据等。

常用的传感器插件有这些:

插件名称 模拟传感器 输出数据类型 典型应用场景
libgazebo_ros_camera.so 单目/双目相机 图像话题(sensor_msgs/Image) 视觉SLAM、目标检测
libgazebo_ros_laser.so 激光雷达(2D/3D) 激光扫描(sensor_msgs/LaserScan) 避障、建图
libgazebo_ros_imu.so IMU(加速度计+陀螺仪) IMU数据(sensor_msgs/Imu) 姿态估计、飞控反馈
libgazebo_ros_gps.so GPS GPS数据(sensor_msgs/NavSatFix) 室外定位、航点导航
libgazebo_ros_sonar.so 超声波/声纳 测距数据(sensor_msgs/Range) 高度保持、近地避障

这些插件怎么用?在无人机的URDF或SDF模型文件中,把插件声明加进去就行。举个例子,给无人机加一个IMU插件:

<plugin name="imu_plugin" filename="libgazebo_ros_imu.so">
  <robotNamespace>/iris</robotNamespace>
  <bodyName>base_link</bodyName>
  <topicName>imu</topicName>
  <frameName>base_link</frameName>
  <updateRate>200.0</updateRate>
</plugin>

这里updateRate是更新频率,单位Hz。我建议IMU设200Hz,GPS设10Hz,相机设30Hz。为什么?因为真实飞控的IMU数据更新率就是200Hz左右,设低了仿真结果会失真。

核心要点:传感器插件的参数设置直接影响仿真逼真度。频率、噪声、延迟这三个参数,一定要根据真实传感器数据手册来配。我曾经因为偷懒把IMU噪声设成0,结果仿真里飞得稳稳的,一上真机就疯狂震荡。

2.4 本章知识体系

为了让你更直观地理解Gazebo仿真环境的整体结构,我画了一张图:

Gazebo仿真环境知识体系 Gazebo仿真环境知识体系 Gazebo仿真引擎 安装与配置 世界模型加载 传感器插件 ROS源安装 版本验证 GPU加速 .world文件 SDF格式 环境元素 相机插件 激光雷达 IMU/GPS 三个模块缺一不可:安装是基础,世界是环境,传感器是感知

从这张图你可以看到,Gazebo仿真环境搭建其实就三个模块:安装配置、世界模型、传感器插件。三者缺一不可。安装是基础,世界模型决定了你的无人机在什么环境里飞,传感器插件决定了它能「看到」什么。

我个人建议,初学者先把空世界跑起来,然后加载一个带简单障碍物的世界,最后再逐步添加传感器插件。别一上来就想搞复杂的多机协同仿真——我见过太多人因为这个把自己劝退了。

实战建议:在Gazebo里跑一个带IMU和GPS的无人机模型,然后打开rostopic echo /iris/imu看看数据流。如果能看到连续的加速度和角速度数据,说明你的仿真环境已经搭好了。这一步我每次搭建新环境都会做,算是「冒烟测试」。