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