今天接續上篇,繼續介紹怎麼用 XML 格式來描述 Gazebo 裡面的模型。
前往 models
目錄建立一個模型目錄,我先取名為 my_model
。接著在裡面建立模型配置檔 model.config
和模型描述檔 model.sdf
:
$ mkdir models/my_model
$ touch models/my_model/model.config
$ touch models/my_model/model.sdf
model.config
model.config
檔案是用來定義模型的基本資訊,例如模型的名稱、版本、作者資訊等,這些資訊有助於 Gazebo 確認和使用該模型。
在 model.config
加入內容如下:
<?xml version="1.0"?>
<model>
<name>My model</name>
<version>1.0</version>
<sdf version="1.5">model.sdf</sdf>
<author>
<name>Your Name</name>
<email>your@mail.com</email>
</author>
<description>
This is a rectangular metal box model for gazebo simulation.
</description>
</model>
model.sdf
SDF(Simulation Description Format,模擬描述格式)是 Gazebo 在模擬環境中呈現物件的檔案格式,在這個系列文中會採用 1.5 版的 SDF 格式。關於 SDF 格式的文件可以查看 SDFormat.org 的規格文件。
model.sdf
檔案是用來定義模型的幾何形狀、物理性質、材質等具體屬性。在這裡,我們會建立一個簡單的長方體模型。
在 model.sdf
加入內容如下,這裡包含了一些常見的模型描述:
<?xml version="1.0" ?>
<sdf version="1.5">
<model name="my_model">
<static>false</static>
<pose>0 0 0 0 0 0</pose>
<!-- 設定模型的連結部分, 這一篇先不談 -->
<link name="base_link">
<!-- 慣性設定 -->
<inertial>
<mass>8.37</mass>
<inertia>
<ixx>0.194</ixx>
<iyy>0.264</iyy>
<izz>0.104</izz>
</inertia>
</inertial>
<!-- 碰撞設定 -->
<collision name="collision">
<geometry>
<box> <!-- 定義模型為一個箱體 -->
<size>0.3 0.2 0.5</size> <!-- x, y, z 尺寸, 單位:公尺 -->
</box>
</geometry>
<surface>
<friction>
<ode> <!-- 摩擦力採用 ODE 物理引擎計算 -->
<mu>100</mu> <!-- 水平方向的摩擦係數 -->
<mu2>50</mu2> <!-- 垂直方向的摩擦係數 -->
</ode>
</friction>
</surface>
</collision>
<!-- 視覺設定 -->
<visual name="visual">
<geometry>
<box> <!-- 定義模型為一個箱體 -->
<size>0.3 0.2 0.5</size> <!-- x, y, z 尺寸, 單位:公尺 -->
</box>
</geometry>
<material>
<script> <!-- 使用 Gazebo 的材質檔 -->
<uri>file://media/materials/scripts/gazebo.material</uri>
<name>Gazebo/Red</name>
</script>
</material>
</visual>
</link>
</model>
</sdf>
<model>
標籤:
<static>
標籤:定義模型是否是靜態的。如果模型是靜態的,它不會受物理引擎影響而移動。這裡設為 false
,表示該模型可以移動。
<pose>
:在建立模型時,可以設定模型預設位置和姿態,六個數值分別代表位置向量 x
、y
、z
(以公尺為單位),和旋轉角度 roll
、pitch
、yaw
(以弧度為單位)。
<link>
標籤:
連結(link)是 SDF 格式中模型的基本單位,可以包含慣性、碰撞、視覺等屬性。對於連結的概念會在之後要建立一個較複雜模型時會再詳細介紹。
<inertial>
標籤:設定模型的質量和轉動慣量(Inertia),這影響模型對外力的抵抗效果。例如,如果將一台無人機的質量和轉動慣量設定很小,那它就很容易被風吹走,或者原地起飛就會開始到處亂轉。
轉動慣量通常是 3x3 矩陣形式,但在 Gazebo 中只需要提供對角線上的三個值(
ixx
、iyy
、izz
),分別對應物體沿 X、Y、Z 軸的旋轉慣性。
這些數值是根據物體的形狀及其質量分佈計算的,對於不同形狀的物體計算公式不同,我這裡的數值是請 ChatGPT 提供的。
<collision>
標籤:定義模型的碰撞屬性,決定了模型會如何與環境中的其他物體進行碰撞和反彈。這裡使用了一個簡單的長方體來表示碰撞區域。在這個標籤中可以設定幾何形狀尺寸(<geometry>
)和表面性質(<surface>
)。
表面性質影響模型的摩擦力、碰撞恢復係數等。常用的屬性有::摩擦力(
<friction>
)、彈性(<bounce>
)和觸感(<contact>
)。
<visual>
標籤:設定模型的視覺屬性,包括幾何形狀和材質。這裡使用灰色作為模型的外觀顏色。在這個標籤中可以設定幾何形狀尺寸(<geometry>
)、材質(<material>
)和透明度(<transparency>
)。一般來說會將幾何形狀設定的和 <collision>
標籤一致。
碰撞和視覺的幾何形狀可以是簡單的幾何體,也可以是網格模型(使用
.dae
檔案)。
常見的幾何形狀有:箱體(<box>
)、球體(<sphere>
)、圓柱體(<cylinder>
)和網格(<mesh>
)。
和昨天一樣,雖然也是沒有做什麼太複雜的東西,卻寫了好多呀!不過雖然設定好了模型,但是還要透過世界檔(.world
)來放進模擬環境中,下一篇就會介紹世界檔的設定方式,到時候就可以看到今天設定的模型的樣子囉。