什么是Stage?

Stage是一个2D多机器人仿真器,它作为ROS的一个节点(stageros)运行。Stage通过.world文件定义整个仿真世界——包括环境地图、障碍物、机器人模型以及各类传感器。

Stage的核心特点:

  • 轻量级:对计算机资源要求低,可在普通配置上流畅运行

  • 支持多机器人:可同时仿真多个机器人,适合集群算法验证

  • 传感器支持:激光雷达、里程计、位姿等

  • ROS原生支持:与ROS生态无缝集成

  • 图片

Stage与Gazebo的选择

很多初学者会困惑:什么时候用Stage,什么时候用Gazebo?

  • Stage适合

    :算法快速原型验证、教学演示、多机器人集群仿真、对物理精度要求不高的场景

  • Gazebo适合

    :需要逼真物理引擎的场景、视觉传感器仿真、复杂环境交互、产品级验证

简单来说,做SLAM和导航算法的初步测试,Stage完全够用;但如果要测试机械臂控制或视觉SLAM,就得用Gazebo了。

快速上手:运行第一个Stage仿真

安装

在ROS Noetic中,Stage可以通过apt直接安装:

sudo apt install ros-noetic-stage-ros

运行示例

安装完成后,运行官方示例验证环境:

roscore
rosrun stage_ros stageros `rospack find stage_ros`/world/willow-erratic.world

执行后,你应该会看到一个Stage窗口弹出,里面有一个机器人在地图中移动。

查看仿真话题

在另一个终端中查看Stage发布的ROS话题:

bash

rostopic list

典型的话题包括:

  • /cmd_vel

    :接收速度控制指令

  • /odom

    :发布里程计数据

  • /base_scan

    :发布激光雷达扫描数据

深入理解.world文件

.world文件是Stage仿真的核心,它定义了仿真世界的一切。我们来看一个完整的.world文件结构:

bash

# 定义激光雷达传感器

define my_laser ranger

(

  sensor

  (

    range_min 0.1        # 最小探测距离(米)

    range_max 8.0        # 最大探测距离(米)

    fov 360.0            # 视场角(度)

    samples 720          # 采样点数

  )

  color "blue"

  size [0.12 0.12 0.08]

)

# 定义机器人模型

define my_robot position

(

  # 里程计误差模型

  odom_error [0.03 0.03 0.0 0.0 0.0 0.05]

  # 机器人外形尺寸(长 宽 高)

  size [0.45 0.40 0.30]

  # 驱动类型

  drive "diff"           # 差速驱动

  # 图形属性

  gui_nose 1             # 显示方向箭头

  color "red"

  # 挂载激光雷达

  my_laser(pose [0.15 0.0 -0.05 0.0])

)

自定义机器人模型

Stage中的机器人模型通过.inc文件定义。下面是一个带有360度激光雷达的差速机器人模型示例(保存为my_robot.inc):

# 定义激光雷达传感器

define my_laser ranger

(

  sensor

  (

    range_min 0.1        # 最小探测距离(米)

    range_max 8.0        # 最大探测距离(米)

    fov 360.0            # 视场角(度)

    samples 720          # 采样点数

  )

  color "blue"

  size [0.12 0.12 0.08]

)

# 定义机器人模型

define my_robot position

(

  # 里程计误差模型

  odom_error [0.03 0.03 0.0 0.0 0.0 0.05]

  # 机器人外形尺寸(长 宽 高)

  size [0.45 0.40 0.30]

  # 驱动类型

  drive "diff"           # 差速驱动

  # 图形属性

  gui_nose 1             # 显示方向箭头

  color "red"

  # 挂载激光雷达

  my_laser(pose [0.15 0.0 -0.05 0.0])

)

 常见陷阱**:在世界文件中实例化机器人时,必须使用my_robot(你在.inc中定义的模型名),而不是robot。使用robot会调用Stage的默认无激光模型,导致激光雷达数据为空。

实战案例:让机器人动起来

1. 键盘控制机器人

首先安装键盘控制工具:

bash

sudo apt install ros-noetic-teleop-twist-keyboard

启动Stage仿真后,在另一终端运行:

bash

rosrun teleop_twist_keyboard teleop_twist_keyboard.py

现在你就可以用键盘控制机器人移动了。

2. 使用Stage内置控制器

Stage还内置了一些控制器,无需编写额外代码就能实现简单行为。例如,使用wander控制器让机器人自动漫游避障:

roomba

(

  name "roomba"

  pose [-8 6 0 0]

  sicklaser()

  ctrl "wander"          # 启用漫游控制器

)

常见问题排查

问题1:激光雷达数据恒为最大量程

可能原因:

  • 世界文件中使用了robot而不是自定义模型名

  • 地图加载失败,激光只能探测到边界墙

  • floorplan中的laser_return未设置为1

解决方法:检查机器人实例化时的模型名称是否正确,确保地图文件路径正确。

问题2:Stage启动后窗口无响应

可能原因:Gazebo模型库下载阻塞(即使在Stage中也会触发)

解决方法:手动下载Gazebo模型库到~/.gazebo/models/目录。

问题3:无法通过键盘控制机器人

可能原因:未正确发布/cmd_vel话题,或话题名称不匹配

解决方法:用rostopic list确认话题名称,用rostopic echo /cmd_vel检查是否有消息发布。

总结

Stage是一个轻量级但功能完整的2D机器人仿真工具,特别适合:

  • SLAM和导航算法的快速原型验证

  • 多机器人集群仿真

  • ROS教学和入门实践

通过本文的示例,你应该能够:

  • 安装并运行Stage仿真

  • 理解.world文件的语法结构

  • 创建自定义机器人模型

  • 编写简单的控制节点

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐