stage_ros的world文件配置方法
官方文档参阅:http://rtv.github.io/Stage/modules.html
stage_ros是一个基于stage的2D模拟器,用于ROS的仿真测试。虽然现在越来越多的人在使用gazebo,但是在很多轻量测试领域,stage_ros仍然有一席之地。
最常用的基于stage_ros的package是navigation_stage。它集成了对stage_ros的一些调用。但它只使用了dwa和trajactory planner,并且只有有限的几张地图,对我们的测试并不是很方便。所以我们需要制定自己的“my navigation_stage”。
这里简单介绍一下stage_ros需要使用的world文件的配置方法。
define block model ( size [0.500 0.500 0.750] gui_nose 0 ) define topurg ranger ( sensor( range_max 30.0 fov 270.25 samples 1081 ) # generic model properties color "black" size [ 0.050 0.050 0.100 ] ) define pr2 position ( size [0.650 0.650 0.250] origin [-0.050 0 0 0] gui_nose 1 drive "omni" topurg(pose [ 0.275 0 0 0 ]) ) define floorplan model ( # sombre, sensible, artistic color "gray30" # most maps will need a bounding box boundary 1 gui_nose 0 gui_grid 0 gui_outline 0 gripper_return 0 fiducial_return 0 ranger_return 1 ) # set the resolution of the underlying raytrace model in meters resolution 0.01 interval_sim 100 # simulation timestep in milliseconds window ( size [ 745.000 448.000 ] rotate [ 0 -1.560 ] scale 30.287 ) # load an environment bitmap floorplan ( name "willow" bitmap "../maps/willow-full-0.025.pgm" size [58.300 45.625 1.000] pose [ -22.812 29.150 0 90.000 ] ) # throw in a robot pr2( pose [ -26.068 12.140 0 87.363 ] name "pr2" color "blue") block( pose [ -25.251 10.586 0 180.000 ] color "red")
上面是navigation_stage里的一个示例。具体每个元素的语法请之后参阅官方文档。这里只针对文件的结构和自定义元素关系简单说明下:
1)define block model:
define block model ( size [0.500 0.500 0.750] gui_nose 0 )
这是在定义一个块的模型,具体是做什么用的呢?现在还不知道,要读到下面才知道。这就像是定义了一个类,设置了成员变量的默认值,但还没有生成实例。
2)define topurg ranger:
define topurg ranger ( sensor( range_max 30.0 fov 270.25 samples 1081 ) # generic model properties color "black" size [ 0.050 0.050 0.100 ] )
这是在定义一个模拟的声纳或雷达的模型,指定了雷达的最大范围等一些参数。同样,这只是“类”的定义,还没有实例。
3) define pr2 position:
define pr2 position ( size [0.650 0.650 0.250] origin [-0.050 0 0 0] gui_nose 1 drive "omni" topurg(pose [ 0.275 0 0 0 ]) )
这是在定义机器人底盘,也可以说算是在定义一个机器人。我们可以在里面看到,它把2)中的topurg当作一个属性包含在了里面。就类似一个类中包含了类另一个类作为成员变量。从结构上我们能看出来,它是想定义一个带ranger的机器人抽象模型。
4)define floorplan model:
define floorplan model ( # sombre, sensible, artistic color "gray30" # most maps will need a bounding box boundary 1 gui_nose 0 gui_grid 0 gui_outline 0 gripper_return 0 fiducial_return 0 ranger_return 1 )
这是在为地图环境定义一个容器模型。map的地图数据是抽象的,stage_ros是不能直接使用的。所以要有一个容器把这些数据装起来,构造和模拟成一个“真实世界”,变成具体数据,然后才方便去和stage中定义的如前面的block,pr2去计算是否碰撞等。
。如果你启动了move_base_amcl_2.5cm.launch文件的话,可以在stage的窗口中看到它,是一个红色的块
5)world:
# set the resolution of the underlying raytrace model in meters resolution 0.01 interval_sim 100 # simulation timestep in milliseconds
这是world本身属性的定义控制分辨率,模拟频率等。这里要注意一点,这个分辨率是stage本身使用的,不是map的分辨率。这个尤其重要,它主要是影响一些类似碰撞检测等stage本身的机制的。这是个坑,至于为什么,下面说到具体的模拟实例时会解释。
6)window:
window ( size [ 745.000 448.000 ] rotate [ 0 -1.560 ] scale 30.287 )
这是对显示出来的stage_ros的窗口的定义。属性基本都是在调大小,角度之类的,问题不大。唯一需要注意的是,这个size是包含了窗口状态栏的总大小,不只是地图有效区域,这个特别逗。
7)floorplan:
floorplan ( name "willow" bitmap "../maps/willow-full-0.025.pgm" size [58.300 45.625 1.000] pose [ -22.812 29.150 0 90.000 ] )
从这里开始往下就是开始生成我们自己定义的模型的实例的部分了。从这个生成定义我们可以看到,它加载了”../maps/willow-full-0.025.pgm”作为地图数据,也就是静态地图。size是怎么算的呢?用你的图片分辨率乘resolution即可。但要注意,这个resolution可不是5)中定义的那个,而是map server里定义的!这就是前面说到的坑了。整个配置文件里所有的size,pose等实际用的resolution,都是map server里的,不是这个文件本身定义的这个。包含下面的8)中也是这样。
8)pr2 and block:
pr2( pose [ -26.068 12.140 0 87.363 ] name "pr2" color "blue")
block( pose [ -25.251 10.586 0 180.000 ] color "red")
这两个就是定义我们的机器人和无用的块实例的地方了。机器人的名字被赋成了“pr2”,所以如果你在stage的窗口中用鼠标去选中它,就会显示出来这个名字了。颜色数据也在这里被赋值了,用于区分哪个是机器人,哪个是无用的块。
以上就是一个world文件的基本结构了。想要更多的配置和定义信息,可以参阅官方文件的解释。