官方文檔參閱: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文件的基本結構了。想要更多的配置和定義信息,可以參閱官方文件的解釋。