一個簡單的二維(弱三維)仿真環境(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例如 而這裏只是簡單的聲明瞭一個障礙物,其中制定了障礙物的大小(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中收發消息,極大程度上減少了我們的配置難度!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章