近期想用強化學習進行導航與避障,在進行在線學習測試時發現在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中收發消息,極大程度上減少了我們的配置難度!