前言
這是一個系列小文章,主要介紹在ROS-Gazebo中如何更好地使用SDF格式模組化與仿真。衆所周知,URDF是ROS的原生支援格式,但在某些情況下(尤其是Gazebo仿真時),使用SDF格式會更加合理。鑒于中文網絡上幾乎沒有成體系的SDF介紹博文,是以我将自己在碩士期間關于SDF模型的使用經驗稍作總結。如有謬誤,還望友好地指出。
本系列規劃如下内容,建議按順序閱讀。尤其是第一篇,以确認你是否有必要使用SDF模組化:
- 為什麼選擇SDF?
- SDF規範文檔與模型資源
- SDF的模組化與使用
- ERB:子產品化生成SDF模型
- SDF與URDF的互相轉換
- 基于SDF的多機器人仿真
- 使用與編寫自定義插件——以PID控制插件為例
1 多機器人仿真的思路
當我們使用URDF模型時,要想進行多機器人仿真,一般是在launch檔案中為模型和控制器添加不同的命名空間,讓gazebo能夠區分不同的機器人。
而對于SDF中的多機器人仿真,我們可以将多個機器人的.sdf建立在同一個.world檔案下,在launch中加載這一個檔案即可。之是以可以這樣做,我們在 SDF規範文檔與模型資源 一文中也提到,是因為SDF格式支援<model>元素的嵌套(model中套model),而URDF不具有這一特性。
下面我們用一個例子來說明如何在同時加載3個cart_front_steer小車。這是官方模型庫中提供的模型,如何下載下傳官方模型庫亦可見 SDF規範文檔與模型資源 。
2 建立多機器人.world檔案
前面文章中說過,在world中添加單個模型,隻需要加入如下<model>元素即可,其中
cart_front_steer
是模型名稱,模型檔案夾必須在gazebo模型環境變量中。
<model name='cart_front_steer'>
<include>
<uri>model://cart_front_steer</uri>
</include>
</model>
效果如下:
而要加載多機器人模型,隻需要采用所謂的“嵌套模型”即可,将<model>元素中的代碼修改如下。其中<name>元素為每個模型定義了單獨的名稱,便于為每個模型單獨添加插件和關節。<pose>元素定義了每個模型的初始位置。
<model name='cart_front_steer'>
<!-- A testing model -->
<include>
<uri>model://cart_front_steer</uri>
<name>cart_front_steer_1</name>
<pose>0 0 0.1 0 0 0</pose>
</include>
<!-- A testing model -->
<include>
<uri>model://cart_front_steer</uri>
<name>cart_front_steer_2</name>
<pose>1.5 0 0.1 0 0 0</pose>
</include>
<!-- A testing model -->
<include>
<uri>model://cart_front_steer</uri>
<name>cart_front_steer_3</name>
<pose>3.0 0 0.1 0 0 0</pose>
</include>
</model>
效果如下:
插件和關節的添加方法和單機器人一緻,隻要注意加上每個模型自己的名稱即可。例如,我們要用一個<fixed>關節将前兩個小車的底盤連在一起,隻需要在一級<model>元素下添加如下關節即可:
<joint name="fixed_joint_1" type="fixed">
<parent>cart_front_steer_1::chassis</parent>
<child>cart_front_steer_2::chassis</child>
</joint>
最後,在launch檔案中啟動本.world檔案。
<launch>
<include file="$(find gazebo_ros)/launch/empty_world.launch">
<arg name="world_name" value="$(find mult_robot)/world/mult_robot.world"/>
</include>
</launch>
功能包代碼見我的項目:
小明工坊:SDF多機器人仿真github.com