第二章:仿真环境搭建——主流仿真平台介绍与环境配置
做传感器仿真这么多年,我最大的体会就是:选对平台,项目就成功了一半。今天咱们就来聊聊三个主流的仿真平台——Gazebo、CARLA、AirSim。我会结合自己的实际经验,帮你理清它们各自的脾气秉性。
2.1 三大主流仿真平台概览
先给个总览,让你心里有个谱。这三个平台,说白了就是三个不同性格的“虚拟世界”。
| 平台 | 定位 | 主要应用场景 | 传感器支持 | 我个人的评价 |
|---|---|---|---|---|
| Gazebo | 通用机器人仿真 | 移动机器人、机械臂、多机器人协同 | 激光雷达、IMU、摄像头、深度相机、GPS | 最成熟,社区资源丰富,但渲染一般 |
| CARLA | 自动驾驶仿真 | 城市道路、交通流、多传感器融合 | RGB相机、语义相机、激光雷达、毫米波雷达 | 渲染效果好,但学习曲线陡 |
| AirSim | 无人机/车辆仿真 | 无人机、地面车辆、多模态传感器 | RGB/深度/红外相机、IMU、磁力计、气压计 | 微软出品,接口友好,但更新慢 |
核心观点:没有最好的平台,只有最合适的平台。做地面机器人,我首选Gazebo;搞自动驾驶,CARLA是标配;玩无人机,AirSim最顺手。
2.2 Gazebo:机器人仿真界的“老大哥”
Gazebo是我用得最多的平台。为什么?因为它跟ROS(机器人操作系统)是天生一对。我在做多传感器融合项目时,Gazebo的插件机制帮了大忙。
2.2.1 环境安装与配置
安装Gazebo其实不复杂,但有几个坑要注意。我建议你直接用ROS的安装方式,省心。
# 安装ROS Noetic(Ubuntu 20.04)
sudo apt update
sudo apt install ros-noetic-desktop-full
# 安装Gazebo(ROS自带)
sudo apt install ros-noetic-gazebo-ros-pkgs ros-noetic-gazebo-ros-control
# 验证安装
gazebo --version
我曾经踩过的坑:直接装Gazebo独立版,结果跟ROS版本不匹配,折腾了两天。后来发现用ROS的包管理器安装最稳。记住:ROS版本和Gazebo版本必须对应。
2.2.2 基础场景创建
创建场景,我习惯用SDF(Simulation Description Format)文件。它比URDF更灵活,尤其适合描述复杂环境。
<?xml version="1.0" ?>
<sdf version="1.6">
<world name="sensor_test_world">
<include>
<uri>model://sun</uri>
</include>
<include>
<uri>model://ground_plane</uri>
</include>
<!-- 添加一个障碍物 -->
<model name="box">
<pose>2 0 0.5 0 0 0</pose>
<link name="body">
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</visual>
</link>
</model>
</world>
</sdf>
启动这个场景很简单:
gazebo sensor_test.world
小技巧:你可以用gz model --spawn-file命令动态添加模型,不用每次都重启Gazebo。我在调试激光雷达时,经常用这招快速换场景。
2.3 CARLA:自动驾驶的“专业选手”
CARLA是专门为自动驾驶设计的。我第一次用的时候,被它的渲染效果惊艳到了——那光影、那路面纹理,跟真的一样。但说实话,它的学习曲线确实有点陡。
2.3.1 环境安装与配置
CARLA的安装比Gazebo麻烦一些,因为它依赖Unreal Engine。我建议你直接下载预编译包。
# 下载CARLA(以0.9.13为例)
wget https://carla-releases.s3.eu-west-3.amazonaws.com/Linux/CARLA_0.9.13.tar.gz
tar -xzf CARLA_0.9.13.tar.gz
cd CARLA_0.9.13
# 安装Python API
pip install carla
# 启动服务器
./CarlaUE4.sh -quality-level=Low -RenderOffScreen
注意:CARLA对显卡要求很高。我当年用GTX 1060跑,只能开低画质。如果你显卡不够力,建议加-RenderOffScreen参数,用无头模式运行。
2.3.2 基础场景创建
CARLA的场景创建是通过Python脚本控制的。我个人觉得这种方式比Gazebo的SDF文件更灵活。
import carla
import random
# 连接CARLA服务器
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
world = client.get_world()
# 选择地图
world = client.load_world('Town01')
# 生成车辆
blueprint_library = world.get_blueprint_library()
vehicle_bp = blueprint_library.filter('model3')[0]
spawn_point = random.choice(world.get_map().get_spawn_points())
vehicle = world.spawn_actor(vehicle_bp, spawn_point)
# 添加RGB相机
camera_bp = blueprint_library.find('sensor.camera.rgb')
camera_transform = carla.Transform(carla.Location(x=1.5, z=2.4))
camera = world.spawn_actor(camera_bp, camera_transform, attach_to=vehicle)
# 开始录制
camera.listen(lambda image: image.save_to_disk('output/%06d.png' % image.frame))
避坑指南:我曾经在CARLA里同时挂载了6个传感器,结果帧率掉到个位数。后来发现,传感器数量不是越多越好,要根据你的需求精打细算。
2.4 AirSim:无人机仿真的“轻骑兵”
AirSim是微软开源的,最初为无人机设计,后来也支持地面车辆。它的优势在于传感器模拟非常真实,尤其是IMU和磁力计。
2.4.1 环境安装与配置
AirSim的安装有两种方式:用Unreal Engine编译,或者用Unity版本。我推荐用Unity版本,省事。
# 克隆AirSim仓库
git clone https://github.com/Microsoft/AirSim.git
cd AirSim
# 安装Python API
pip install airsim
# 下载预编译的Unity环境(以Windows为例)
# 从GitHub Releases下载AirSimNH.zip,解压运行
我的经验:AirSim的Linux支持不如Windows好。如果你在Linux上遇到编译问题,别死磕,直接换Windows或者用Docker。
2.4.2 基础场景创建
AirSim的场景是通过settings.json配置的。这个文件定义了传感器类型、位置、参数等。
{
"SettingsVersion": 1.2,
"SimMode": "Multirotor",
"Vehicles": {
"Drone1": {
"VehicleType": "SimpleFlight",
"DefaultVehicleState": "Armed",
"Sensors": {
"Lidar1": {
"SensorType": 6,
"Enabled": true,
"NumberOfChannels": 16,
"PointsPerSecond": 100000,
"Range": 100,
"HorizontalFOVStart": -180,
"HorizontalFOVEnd": 180,
"VerticalFOVUpper": 15,
"VerticalFOVLower": -15
},
"Imu1": {
"SensorType": 2,
"Enabled": true
}
}
}
}
}
启动后,你可以用Python控制无人机:
import airsim
client = airsim.MultirotorClient()
client.confirmConnection()
client.enableApiControl(True)
client.armDisarm(True)
# 起飞并悬停
client.takeoffAsync().join()
client.hoverAsync().join()
# 获取传感器数据
lidar_data = client.getLidarData()
print(f"激光雷达点数: {len(lidar_data.point_cloud)}")
小提示:AirSim的激光雷达数据是直接返回点云的,省去了你自己做坐标转换的麻烦。我在做无人机避障时,就特别喜欢这一点。
2.5 平台选择建议
说了这么多,到底该选哪个?我给你个简单的决策树:
- 做地面机器人(如扫地机器人、AGV) → Gazebo,ROS生态太强了
- 做自动驾驶(如无人车、园区物流车) → CARLA,场景真实度高
- 做无人机(如巡检、测绘) → AirSim,传感器模拟最准
- 做多机器人协同 → Gazebo,支持多机器人最成熟
- 做传感器算法验证 → 三个都试试,看哪个跟你的算法最匹配
最后说一句:别纠结于“哪个最好”。我见过有人用Gazebo跑自动驾驶,也有人用CARLA做机器人。工具是死的,人是活的。关键是理解每个平台的特性,然后灵活运用。