ROS Stage(轻量级2D仿真工具)仿真入门
什么是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
运行示例
安装完成后,运行官方示例验证环境:
roscorerosrun 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文件的语法结构
-
创建自定义机器人模型
-
编写简单的控制节点
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)