天天看點

.sdf是什麼檔案_【ROS-Gazebo】基于SDF的多機器人仿真

.sdf是什麼檔案_【ROS-Gazebo】基于SDF的多機器人仿真

前言

這是一個系列小文章,主要介紹在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>
           

效果如下:

.sdf是什麼檔案_【ROS-Gazebo】基于SDF的多機器人仿真

而要加載多機器人模型,隻需要采用所謂的“嵌套模型”即可,将<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>
           

效果如下:

.sdf是什麼檔案_【ROS-Gazebo】基于SDF的多機器人仿真

插件和關節的添加方法和單機器人一緻,隻要注意加上每個模型自己的名稱即可。例如,我們要用一個<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