今天我們要來介紹一些基礎URDF的語法,那很多都是看範例去學習的,然後不懂的去查文檔。經過整理後我想分成兩天來向各位介紹我整理出來的結果,希望對各位能有一些幫助。那這個語法說難不難,說簡單好像也還好,而且語法跟我們介紹了許久的python不同,他有點類似html標頭檔案。今天會先介紹他大致上的內容,明天會使用此基礎來建立強化學習中我們會使用到的物件,實際演練一次給各位看。那要建立的物件有目標點跟圍牆。
跟html檔案一樣,這個urdf檔案也有分層次,首先就是<robot>
,在這標籤中含有<link>
跟<joint>
標籤。然後<link>
標籤中又包含<contact>
、<inertial>
、<visual>
、<collision>
,標籤,這四個標籤跟<joint>
又有各自該設定的子標籤。為了不讓文字太曲折複雜,請各位看以下圖片來幫助瞭解URDF檔內容的基礎架構。接下來會針對所有標籤逐一介紹。
圖片勘誤:intertial應為inertial。
程式介紹的方式我想根據每個標頭檔案的不同分別介紹,也會由上圖中顏色深至淺的一層一層介紹,事不宜遲馬上開始介紹吧!那我們要先知道link跟joint代表甚麼,我們有請超可愛的杯麵來擔任小助手~我們可以看到杯麵是由許多部件組成的,有手、頭、身體、腳,手上還有手指。這些都是link,那joint就是用來連接link中的關節了,通常都是以馬達來控制機器人作動。例如頭跟身體中的joint就可以讓機器人完成轉頭的動作。知道link跟joint是甚麼後就來介紹一下如何自定義這些物件。
我們要先定義這是一個機器人模型
<?xml version="1.0">
<robot name="robot_name">
首先要定義link跟此link的名字<link name="yourname">
,這個標籤中含有四個子標籤,如上圖所示,我們來一個一個介紹:
<contact>
這個標籤主要是設定一些接觸時的物理係數用的,其中可以設定橫向摩擦<latteral_friction value="1.0"/>
、滾動摩擦<rolling_friction value="1.0"/>
、慣量縮放<inertia_scaling value="3.0"/>
等。
<inertial>
這個標籤是設定基礎物理屬性用的,其中可以設定重心位置<origin rpy="r p y" xyz="x y z"/>
、質量<mass value="1.0"/>
、轉動慣量<inertia ixx="1" ixy="1" ixz="1" iyy="1" iyz="1" izz="1"/>
<visual>
這個標籤是用來設定視覺用的,根據此標籤會影響到模擬時的所見,其中可以設定以下幾種:
link位置跟旋轉量<origin rpy="r p y" xyz="x y z"/
。
幾何形狀<geometry>
,此標籤中有四種幾何形狀可供選擇使用,分別為立方體<box size="1 1 1"/>
。圓柱體<cylinder radius="1" length="0.5"/>
,需設定半徑跟高。球體<sphere radius="0.5"/>
。如果要匯入自定義的不規則形狀物體可以使用<mesh filename="filepath" scale="1 1 1"/>
並指定沿x、y、z軸縮放大小的scale
參數,以及filename
參數,這是可以匯入.stl、.obj或者.dae檔案的路徑。
材料<material>
了,一樣裡面有兩個子標籤可以設定:設定顏色跟透明度的rgba<color rgba="1 1 1 1"/>
、材質<texture filename=”filepath”>
。
<collision>
這個標籤是用來設定碰撞箱的,如果沒有這個的話那創出來的機器人就像鬼魂一樣,碰不到東西也無法被碰觸到。這個標籤需要設定的跟剛剛介紹的<visual>
大致上一樣,只差在沒有<material>
標籤而已
設定完link後就可以來使用joint將其連接了,需要使用<joint name="jointname" type="type”>
來定義關節。type參數就是這個關節的類型,有分成四種:
continuous
:連續關節,關節角度值可以從負無窮到正無窮,通常用於輪子。
fixed
:不可動關節,單純拿來連接兩個link的。
revolute
:跟continuous
類似,不過有限制轉動弧度的上下限,還需要指定這個關節的最大速度跟施力大小。
prismatic
:這類型的關節並非繞一個軸轉動,而是沿著一個軸移動,使用此種軸就可以讓兩個link進行伸縮。
其中有兩個一定要設定的標籤分別為<parent link="linkname">
跟<child link="linkname">
,linkname都是剛剛定義link時所使用的名字。
接下來可以設定此關節的一些基本設定:
位置<origin rpy="r p y" xyz="x y z">
。
旋轉軸<axis xyz="x y z">
。
物理上下限<limit effort="300" lower="-2.617" upper="1.983" velocity="1"/>
,當joint type=revolute
的時候就須設定,effort
是最大施力、lower
跟upper
為轉動的最小以及最大弧度、velocity
是最大速度。
阻尼值<dynamics damping="1.0">
。
靜摩擦<dynamics friction="1.0">
。
這邊會統整上述介紹的標籤,供各位參考,可根據需求去更改此模板。
<?xml version="1.0">
<robot name="robotname">
<link name="linkname">
<contact>
<latteral_friction value="1.0"/>
<rolling_friction value="1.0"/>
<contact_cfm value="1.0"/>
<contact_erp value="1.0"/>
</contact>
<intertial>
<origin rpy="r p y" xyz="x y z"/>
<mass value="1.0"/>
<inertia ixx="1" ixy="1" ixz="1" iyy="1" iyz="1" izz="1"/>
</intertial>
<visual>
<origin rpy="r p y" xyz="x y z"/>
<geometry>
<box size="1 1 1"/>
</geometry>
<material name="colorname">
<color rgba="1 1 1 1"/>
</material>
</visual>
<collision>
<origin rpy="r p y" xyz="x y z"/>
<geometry>
<box size="1 1 1"/>
</geometry>
</collision>
</link>
<joint name="jointname" type="type">
<parent link="linkname"/>
<child link="linkname"/>
<origin rpy="r p y" xyz="x y z"/>
<axis xyz="x y z"/>
<limit effort="300" lower="-2.617" upper="1.983" velocity="1"/>
<dynamics damping="1.0"/>
<dynamics friction="1.0"/>
</joint>
</robot>
如果在使用pybullet的p.loadURDF()匯入自定義的urdf檔案時發生了pybullet.error: Cannot load URDF file.
錯誤時,大致上可歸類為兩種可能,第一個是路徑錯誤,第二個就是URDF檔案中有設定錯誤的片段。需要特別注意錯誤的根源!!
這些資料都是1年前我剛踏入這個領域實際下來的筆記,難免會有錯誤或者更新一些新的方式或者淘汰一些方式等等情況發生,如果在使用上有問題也歡迎提出更正~以上資料大部分都是直接查詢官方文檔的,連結會放底下。也有一些是觀看github中的範例去學習的。甚至pybullet_data中就有很多模型可供參考了,如果有興趣可以再去看看,明天會介紹我在這個專案中使用到的一些物件,以及環境設計的思路。