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的窗口中用鼠标去选中它,就会显示出来这个名字了。颜色数据也在这里被赋值了,用于区分哪个是机器人,哪个是无用的块。

 

PS:特别需要注意一点,地图的格式最好用jpeg。似乎是stage的代码有bug,用gif可能会完全无法正常显示,用png和pgm可能会出现地图缺失导致剩余部分被拉伸。目前测试只有jpeg是正常的。

 

以上就是一个world文件的基本结构了。想要更多的配置和定义信息,可以参阅官方文件的解释。

 

posted @ 2019-09-04 17:16  倾越  阅读(2772)  评论(0编辑  收藏  举报