Skip to content

MVSim 定义世界、机器人和传感器

目标: 学习定义 MVSim 世界文件、添加车辆和传感器的基础知识,以及了解主要可用功能。

教程级别: 进阶

预计时间: 30 分钟

MVSim 的世界通过 XML 文件(.world.xml)定义。 世界文件描述了环境(地面、墙壁、障碍物)、车辆(动力学模型、形状、传感器) 以及仿真参数(物理时间步长、GUI 选项)。

MVSim 提供了一套预定义的车辆和传感器定义库,你可以通过 XML include 在自己的世界中复用。 你也可以完全从头定义一切,以获得完全的控制。

你应该已完成 MVSim 快速入门 教程并已安装 MVSim。

以下是一个最小世界文件,创建了一个带有一个机器人的空环境:

<mvsim_world version="1.0">
<!-- Simulation settings -->
<simul_timestep>5e-3</simul_timestep>
<!-- GUI options -->
<gui>
<cam_distance>15</cam_distance>
</gui>
<!-- Ground plane -->
<element class="ground_grid">
</element>
<!-- A differential-drive robot -->
<vehicle name="robot1">
<init_pose>0 0 0</init_pose> <!-- x y yaw(deg) -->
<!-- Dynamical model -->
<dynamics class="differential">
<!-- Params -->
<l_wheel pos="0.0 0.5" mass="4.0" width="0.20" diameter="0.40" />
<r_wheel pos="0.0 -0.5" mass="4.0" width="0.20" diameter="0.40" />
<!-- Visual and physical shape -->
<chassis mass="15.0" zmin="0.05" zmax="0.6">
</chassis>
<!-- Motor controller -->
<controller class="twist_pid">
<!-- Params -->
<KP>4.1543</KP>
<KI>1.9118</KI>
<KD>0.0000</KD>
<max_torque>14.44</max_torque>
<V>0.0</V><W>0</W>
</controller>
</dynamics>
<!-- Motor controller: accept twist commands, PID controller -->
<controller class="twist_pid">
<KP>100</KP> <KI>5</KI> <max_torque>50</max_torque>
</controller>
</vehicle>
</mvsim_world>

将其保存为 my_world.world.xml 并启动:

Terminal window
$ mvsim launch my_world.world.xml

除了从头定义车辆外,你还可以使用 MVSim 自带的预定义定义。 这些是位于 MVSim 包 definitions/ 目录中的 XML 文件。

可用车辆:

  • turtlebot3_burger.vehicle.xml — TurtleBot3 Burger(差速驱动)
  • jackal.vehicle.xml — Clearpath Jackal UGV(四轮差速)
  • ackermann.vehicle.xml — 通用 Ackermann(类汽车)车辆
  • pickup.vehicle.xml — 皮卡(Ackermann)
  • agricobiot2.vehicle.xml — 农业机器人(Ackermann 传动系统)

可用传感器:

  • lidar2d.sensor.xml — 通用 2D 激光扫描仪
  • rplidar-a2.sensor.xml — RPLidar A2
  • velodyne-vlp16.sensor.xml — Velodyne VLP-16 3D LiDAR
  • ouster-os1.sensor.xml — Ouster OS1 3D LiDAR
  • helios-32-FOV-70.sensor.xml — Helios 32 束 3D LiDAR
  • camera.sensor.xml — RGB 相机
  • rgbd_camera.sensor.xml — 深度相机(RGBD)
  • imu.sensor.xml — 惯性测量单元
  • gnss.sensor.xml — GPS/GNSS 接收器

要使用带有传感器的预定义车辆,请使用 XML include:

<mvsim_world version="1.0">
<simul_timestep>5e-3</simul_timestep>
<gui>
<cam_distance>15</cam_distance>
</gui>
<element class="ground_grid">
</element>
<!-- Include the Jackal vehicle definition -->
<include file="$(ros2 pkg prefix mvsim)/share/mvsim/definitions/jackal.vehicle.xml"
default_sensors="true"
/>
<vehicle name="r1" class="jackal">
<init_pose>0 0 170</init_pose> <!-- In global coords: x,y, yaw(deg) -->
<init_vel>0 0 0</init_vel> <!-- In local coords: vx,vy, omega(deg/s) -->
<!-- You can also attach sensors to vehicles in separate includes,
or define them inline within the vehicle block. -->
<!-- <include file="$(ros2 pkg prefix mvsim)/share/mvsim/definitions/lidar2d.sensor.xml" sensor_x="1.7" sensor_z="1.01" sensor_yaw="0" max_range="70.0" sensor_name="laser1" /> -->
</vehicle>
<variable name="WALL_THICKNESS" value="0.2"></variable>
<!-- Wall with a single door -->
<element class="vertical_plane">
<x0>-10</x0> <y0>-10</y0>
<x1>-10</x1> <y1>10</y1>
<z>0.0</z> <height>3.0</height>
<cull_face>NONE</cull_face>
<texture>https://mrpt.github.io/mvsim-models/textures-cgbookcase/wall-bricks-01.png</texture>
<texture_size_x>2.5</texture_size_x>
<texture_size_y>2.5</texture_size_y>
<thickness>${WALL_THICKNESS}</thickness> <!-- Wall thickness in meters -->
<!-- Door at 50% position (middle of wall), 1.2m wide, standard height -->
<door>
<position>0.5</position> <!-- 0.0 = start point, 1.0 = end point -->
<width>1.2</width> <!-- meters -->
<z_min>0.0</z_min> <!-- bottom of door -->
<z_max>2.1</z_max> <!-- top of door -->
<name>main_entrance</name>
</door>
</element>
</mvsim_world>

MVSim 支持多种类型的环境元素:

栅格占用地图 加载灰度图像作为 2D 障碍物地图,通常用于室内导航测试:

<element class="occupancy_grid">
<file>map.png</file>
<resolution>0.05</resolution> <!-- meters/pixel -->
</element>

高程地图 从灰度高程图图像定义地形高度,适用于室外场景:

<element class="elevation_map">
<resolution>1.0</resolution>
<elevation_image>terrain.png</elevation_image>
<elevation_image_min_z>0.0</elevation_image_min_z>
<elevation_image_max_z>5.0</elevation_image_max_z>
</element>

纹理平面 添加可视的地面表面:

<element class="horizontal_plane">
<cull_face>BACK</cull_face>
<x_min>-25</x_min> <x_max>25</x_max>
<y_min>-25</y_min> <y_max>25</y_max>
<z>0.0</z>
<texture>asphalt.png</texture>
<texture_size_x>5.0</texture_size_x>
<texture_size_y>5.0</texture_size_y>
</element>

方块 是静态或动态刚体(盒子、自定义形状),用作障碍物或可操作物体:

<block class="obstacle1">
<shape_from_visual/>
<visual>
<model_uri>package://mvsim/models/box.dae</model_uri>
</visual>
<init_pose>3.0 2.0 0</init_pose>
<mass>20</mass>
</block>

MVSim 提供三种主要动力学模型:

  • 差速驱动(class="differential"):如 TurtleBot3 的两轮机器人。 通过线速度和角速度控制。

  • Ackermann(class="ackermann"):前轮转向的类汽车车辆。 通过线速度和转向角控制。

  • Ackermann 传动系统(class="ackermann_drivetrain"):具有开放式或 Torsen 差速器的真实传动系统模型, 适用于更精确的车辆行为仿真。

每个车辆可以使用不同的电机控制器:

  • twist_pid:接收 geometry_msgs/msg/Twist 命令并进行 PID 速度跟踪。 这是 ROS 2 集成中最常用的选择。
  • twist_ideal:瞬时速度命令(无动力学延迟)。
  • twist_front_steer_pid:用于通过线速度和转向角控制的 Ackermann 车辆。
  • raw:直接车轮扭矩控制。

MVSim 中的传感器支持可配置的噪声模型。 例如,一个带有噪声参数的 IMU 传感器:

<sensor class="imu" name="imu1">
<pose>0 0 0.5 0 0 0</pose> <!-- x y z roll pitch yaw -->
<rate_hz>100</rate_hz>
<!-- Gyroscope noise -->
<gyroscope_noise>
<noise_std>1e-3</noise_std> <!-- rad/s -->
<bias_initial_std>1e-4</bias_initial_std>
<bias_drift>1e-6</bias_drift>
</gyroscope_noise>
<!-- Accelerometer noise -->
<accelerometer_noise>
<noise_std>1e-2</noise_std> <!-- m/s^2 -->
<bias_initial_std>1e-3</bias_initial_std>
<bias_drift>1e-5</bias_drift>
</accelerometer_noise>
</sensor>

LiDAR 传感器支持距离范围、角分辨率和噪声等参数:

<sensor class="laser" name="laser1">
<pose>0.15 0 0.3 0 0 0</pose>
<rate_hz>10</rate_hz>
<ray_count>360</ray_count>
<fov_degrees>360</fov_degrees>
<range_max>20.0</range_max>
<range_std_noise>0.01</range_std_noise> <!-- meters -->
<raytrace_3d>true</raytrace_3d> <!-- use 3D collision for 2D scans -->
</sensor>

多机器人仿真: MVSim 原生支持同一世界中的多个车辆。 每个车辆拥有自己的 ROS 2 命名空间、TF 树和一组 topic。 机器人可以通过传感器相互检测,并通过碰撞进行物理交互。

属性区域: 你可以在世界中定义具有不同物理属性的区域,例如不同的摩擦系数 或 GPS 拒止区域(GNSS 传感器停止报告位置)。

动画角色: MVSim 支持骨骼动画的 3D 角色(例如行人),沿着路径点行走, 适用于在动态环境中测试感知和规划。

关节与铰接车辆: 车辆可以通过距离关节(绳索/缆线)或旋转关节(铰链)连接, 从而实现拖车、牵引绳和铰接系统的仿真。

XML 高级功能: 世界文件支持 <include> 指令、变量替换、数学表达式、 <for> 循环和 <if> 条件,使得程序化生成复杂环境成为可能。

无头与超实时运行: MVSim 可以在没有 GUI 的情况下以可配置的仿真速度运行, 这对自动化测试和强化学习工作流非常有用。

MVSim 与其他仿真器相比占据不同的定位:

优势:

  • 非常轻量:低 CPU 和内存占用,快速启动时间。
  • 专注的车辆动力学,支持多种摩擦和传动模型。
  • 简单的基于 XML 的世界格式,易于上手。
  • 原生多机器人支持,每个车辆拥有独立的 ROS 2 命名空间。
  • 支持超实时仿真,适合批量测试。
  • 通过 XML 循环和条件实现程序化世界生成。

局限性:

  • 物理仿真为 2D(Box2D):没有完整的 3D 刚体动力学。 物体不会倾倒或飞起。 高程地图增加了地形高度,但物理本质仍是 2D 的。
  • 传感器仿真不如完整的 3D 仿真器精细:相机渲染和 LiDAR 模型 功能完备但非照片级真实。
  • 与 Gazebo 相比,预制模型和环境的生态系统较小。
  • 专注于轮式移动机器人。