一个简单的二维(弱三维)仿真环境(stage)

        近期想用强化学习进行导航与避障,在进行在线学习测试时发现在v-rep中测试由于需要进行大量的渲染等计算,小的pc机帧率降至4~8fps,将耗费大量的时间在自学习上,因此考虑能否找到一个较为轻量级的仿真平台,将主要注意力从物理仿真转移至地图级别来,思考过gezebo,确实是一个很好的替代品,但希望找到一个更加简单粗暴的仿真软件,最终发现了stage这个2006年出来的小型仿真平台,他几乎没有任何图形交互功能,连障碍物的导入都需要用文档去编写,但简单意味着高效,如果我们需要一个运行效率高而对物理引擎要求很低仿真环境,stage是一个不错的选择。还有一大亮点是它足够小可以直接作为ros的一个package进行编译,与ros有着很好的兼容性而不必像v-rep一样需要复杂的bridge。

        在这里可以下载到stage的整个工程,下下来直接在工作区catkin_make之后就可以用了,这部分网上的资料较为齐全,可以参考这里:

       http://wiki.ros.org/stage_ros


        装好环境之后跑了一下自带的几个world文件的demo,想在网上找找相应的介绍文档,找了一圈却没有发现比较好的,只好把实例的world文档拆开了一点一点注释看看每一个函数的作用了。

        例如例程里的willow-erratic.world文件,代码如下:

window
(
  size [ 635 666 ] # in pixels
  scale 22.971   # pixels per meter
  center [ -20.306  21.679 ]
  rotate [ 0.000  0.000 ]
  			
  show_data 1              # 1=on 0=off
)


define block model
(
  size [0.500 0.500 0.500]
  gui_nose 0
)

define topurg ranger
(
	sensor( 			
    range [ 0.0  30.0 ]
    fov 270.25
   samples 1081
  )

  # generic model properties
  color "black"
  size [ 0.050 0.050 0.100 ]
)

define erratic position
(
  #size [0.415 0.392 0.25]
  size [0.350 0.350 0.250]
  origin [-0.050 0.000 0.000 0.000]
  gui_nose 1
  drive "diff"
  topurg(pose [ 0.050 0.000 0.000 0.000 ])
)

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.000
)

# set the resolution of the underlying raytrace model in meters
resolution 0.02

interval_sim 100  # simulation timestep in milliseconds


window
( 
  size [ 745 448 ] 

  rotate [ 0.000 -1.560 ]
  scale 28.806 
)

# load an environment bitmap
floorplan
( 
  name "willow"
  bitmap "willow-full.pgm"
  size [54.000 58.700 0.500]
  pose [ -29.350 27.000 0.000 90.000 ]
)

# throw in a robot
erratic( pose [ -11.277 23.266 0.000 180.000 ] name "era" color "blue")
block( pose [ -13.924 25.020 0.000 180.000 ] color "red")

我们首先分析一下结构,可以看出在def 部分声明了一些量,这些量中有些被别的def所引用,有些在后面的环境构建中被引用,因此可以看作是在声明一些基础元组,例如:

define block model
(
  size [0.500 0.500 0.500]
  gui_nose 0
)
这段简单的声明了一个叫做"block"的model型量,而有很多官方提供的model例如
  • Actuator model
  • Blinkenlight model
  • Blobfinder model
  • Camera model
  • Fiducial detector model
  • Gripper model
  • Position model
  • Ranger model
  • Wifi model
而这里只是简单的声明了一个障碍物,其中制定了障碍物的大小(size),以及是否用箭头标识。后面又
define topurg ranger
声明了一个叫topurg的激光测距雷达,设定了它的量程,区间等等参数。接着声明了一个position量:

define erratic position
声明了未来的小车模型,同时通过函数

topurg(pose [ 0.050 0.000 0.000 0.000 ])
将之前构造的激光雷达挂载在小车的(x=0.05)的位置

之后通过

def floorplan model

构造出一个容纳地图的框架,之后把从外部获得的.pgm图挂载在这个框架里面可以直接将图转换成障碍物,非常方便。

接着通过:

erratic( pose [ -11.277 23.266 0.000 180.000 ] name "era" color "blue")
block( pose [ -13.924 25.020 0.000 180.000 ] color "red")
分别构造了机器人与障碍物,只需要run这个world文件就可以了,并且非常优秀的一点在于传感器与机器人都自动在ros中创建了topic,可以直接从topic中收发消息,极大程度上减少了我们的配置难度!

你可能感兴趣的:(ROS;)