第二章:仿真环境搭建——主流仿真平台介绍与环境配置

做传感器仿真这么多年,我最大的体会就是:选对平台,项目就成功了一半。今天咱们就来聊聊三个主流的仿真平台——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做机器人。工具是死的,人是活的。关键是理解每个平台的特性,然后灵活运用。

仿真环境传感器配置与优化 - 知识体系 仿真平台选择 Gazebo CARLA AirSim ROS集成 SDF场景 插件机制 Python API 城市地图 交通流 settings.json 无人机控制 传感器模拟 核心原则:根据应用场景选择平台,灵活运用各平台特性 地面机器人→Gazebo | 自动驾驶→CARLA | 无人机→AirSim

可可精品资料库