6.4 URDF使用語法【萬字解析趕緊碼住】
6.4 URDF使用語法
URDF 文件是一個標(biāo)準(zhǔn)的 XML 文件,在 ROS 中預(yù)定義了一系列的標(biāo)簽用于描述機(jī)器人模型,機(jī)器人模型可能較為復(fù)雜,但是 ROS 的 URDF 中機(jī)器人的組成卻是較為簡單的,可以主要簡化為兩部分:連桿(link標(biāo)簽) 與 關(guān)節(jié)(joint標(biāo)簽),本節(jié)會介紹這些標(biāo)簽的使用語法,并通過相關(guān)案例強(qiáng)化大家對標(biāo)簽的認(rèn)識,主要標(biāo)簽如下:
robot 標(biāo)簽,這是整個 urdf 文件的根標(biāo)簽;
link 標(biāo)簽,用于描述機(jī)器人剛體部分的標(biāo)簽;
joint 標(biāo)簽,是用于連接不同剛體的“關(guān)節(jié)”。
除了 URDF 的使用語法之外,本節(jié)還會介紹一些常用的 urdf 工具,通過工具可以驗證 urdf 文件是否存在語法或邏輯異常。
6.4.1 URDF語法01_robot
1.簡介
urdf 中為了保證 xml 語法的完整性,使用了robot標(biāo)簽作為根標(biāo)簽,所有的 link 和 joint 以及其他標(biāo)簽都必須包含在 robot 標(biāo)簽內(nèi),在該標(biāo)簽內(nèi)可以通過 name 屬性設(shè)置機(jī)器人模型的名稱。
2.屬性
name:主文件必須具有名稱屬性, name 屬性在被包含的文件中是可選的。如果在被包含文件中指定了屬性名稱,則它必須具有與主文件中相同的值。
3.子標(biāo)簽
其他標(biāo)簽都是其子級標(biāo)簽。
4.示例

6.4.2 URDF語法02_link
1.簡介
urdf 中的 link 標(biāo)簽用于描述機(jī)器人某個部件(也即剛體部分)的外觀和物理屬性,比如: 機(jī)器人底座、輪子、激光雷達(dá)、攝像頭...每一個部件都對應(yīng)一個 link, 在 link 標(biāo)簽內(nèi),可以設(shè)計該部件的形狀、尺寸、顏色、慣性矩陣、碰撞參數(shù)等一系列屬性。

2.屬性
name(必填):為連桿命名。
3.子標(biāo)簽
<visual>(可選):用于描述link的可視化屬性,可以設(shè)置link的形狀(立方體、球體、圓柱等)。
name(可選):指定link名稱,此名稱會映射為同名坐標(biāo)系,還可以通過引用該值定位定位link。
<geometry>(必填):用于設(shè)置link的形狀,比如:立方體、球體或圓柱。
<box>:立方體標(biāo)簽,通過size屬性設(shè)置立方體的邊長,原點為其幾何中心。
<cylinder>:圓柱標(biāo)簽,通過radius屬性設(shè)置圓柱半徑,通過length屬性設(shè)置圓柱高度,原點為其幾何中心。
<sphere>:球體標(biāo)簽,通過radius屬性設(shè)置球體半徑,原點為其幾何中心。
<mesh>:通過屬性filename引用“皮膚”文件,為link設(shè)置外觀,該文件必須是本地文件。使用 package://<packagename>/<path>為文件名添加前綴。
<origin>(可選):用于設(shè)置link的相對偏移量以及旋轉(zhuǎn)角度,如未指定則使用默認(rèn)值(無偏移且無旋轉(zhuǎn))。
xyz:表示x、y、z三個維度上的偏移量(以米為單位),不同數(shù)值之間使用空格分隔,如未指定則使用默認(rèn)值(三個維度無偏移)。
rpy:表示翻滾、俯仰與偏航的角度(以弧度為單位),不同數(shù)值之間使用空格分隔,如未指定則使用默認(rèn)值(三個維度無旋轉(zhuǎn))。
<material>(可選):視覺元素的材質(zhì)。也可以在根標(biāo)簽robot中定義material標(biāo)簽,然后,可以在link中按名稱進(jìn)行引用。
name(可選):為material指定名稱,可以通過該值進(jìn)行引用。
<color>(可選):rgba 材質(zhì)的顏色,由代表red/green/blue/alpha 的四個數(shù)字組成,每個數(shù)字的范圍為 [0,1]。
<texture>(可選):材質(zhì)的紋理,可以由屬性filename設(shè)置。
<collision>(可選):link的碰撞屬性??梢耘clink的視覺屬性一致,也可以不同,比如:我們會通常使用更簡單的碰撞模型來減少計算時間,或者設(shè)置的值大于link的視覺屬性,以盡量避免碰撞。另外,同一鏈接可以存在多個 <collision>標(biāo)簽實例,多個幾何圖形組合表示link的碰撞屬性。
name(可選):為collision設(shè)置名稱。
<geometry>(必須):請參考visual標(biāo)簽的geometry使用規(guī)則。
<origin>(可選):請參考visual標(biāo)簽的origin使用規(guī)則。
<inertial>(可選):用于設(shè)置link的質(zhì)量、質(zhì)心位置和中心慣性特性,如果未指定,則默認(rèn)為質(zhì)量為0、慣性為0。
<origin>(可選):該位姿(平移、旋轉(zhuǎn))描述了鏈接的質(zhì)心框架 C 相對于鏈接框架 L 的位置和方向。
xyz:表示從 Lo(鏈接框架原點)到 Co(鏈接的質(zhì)心)的位置向量為 x L?x + y L?y + z L?z,其中 L?x、L?y、L?z 是鏈接框架 L 的正交單位向量。
rpy:將 C 的單位向量 ?x、?y、?z 相對于鏈接框架 L 的方向表示為以弧度為單位的歐拉旋轉(zhuǎn)序列 (r p y)。注意:?x、?y、?z 不需要與連桿的慣性主軸對齊。
<mass>(必填):通過其value屬性設(shè)置link的質(zhì)量。
<inertia>(必填):對于固定在質(zhì)心坐標(biāo)系 C 中的單位向量 ?x、?y、?z,該連桿的慣性矩 ixx、iyy、izz 以及關(guān)于 Co(連桿的質(zhì)心)的慣性 ixy、ixz、iyz 的乘積。
注意:<collision> 和 <inertial> 在仿真環(huán)境下才需要使用到,如果只是在 rviz2 中集成 urdf,那么不必須為 link 定義這兩個標(biāo)簽。
4.示例
1.需求
分別生成長方體、圓柱與球體的機(jī)器人部件。
2.實現(xiàn)
功能包 cpp06_urdf 的 urdf/urdf 目錄下,新建 urdf 文件 demo02_link.urdf,并編輯文件,輸入如下內(nèi)容:


6.4.3 URDF語法03_joint
1.簡介
urdf 中的 joint 標(biāo)簽用于描述機(jī)器人關(guān)節(jié)的運動學(xué)和動力學(xué)屬性,還可以指定關(guān)節(jié)運動的安全極限,機(jī)器人的兩個部件(分別稱之為 parent link 與 child link)以”關(guān)節(jié)“的形式相連接,不同的關(guān)節(jié)有不同的運動形式: 旋轉(zhuǎn)、滑動、固定、旋轉(zhuǎn)速度、旋轉(zhuǎn)角度限制....,比如:安裝在底座上的輪子可以360度旋轉(zhuǎn),而攝像頭則可能是完全固定在底座上。

2.屬性
name(必填):為關(guān)節(jié)命名,名稱需要唯一。
type(必填):設(shè)置關(guān)節(jié)類型,可用類型如下:
continuous:旋轉(zhuǎn)關(guān)節(jié),可以繞單軸無限旋轉(zhuǎn)。
revolute:旋轉(zhuǎn)關(guān)節(jié),類似于 continues,但是有旋轉(zhuǎn)角度限制。
prismatic:滑動關(guān)節(jié),沿某一軸線移動的關(guān)節(jié),有位置極限。
planer:平面關(guān)節(jié),允許在平面正交方向上平移或旋轉(zhuǎn)。
floating:浮動關(guān)節(jié),允許進(jìn)行平移、旋轉(zhuǎn)運動。
fixed:固定關(guān)節(jié),不允許運動的特殊關(guān)節(jié)。
3.子標(biāo)簽
<parent>(必填):指定父級link。
link(必填):父級link的名字,是這個link在機(jī)器人結(jié)構(gòu)樹中的名字。
<child>(必填):指定子級link。
link(必填):子級link的名字,是這個link在機(jī)器人結(jié)構(gòu)樹中的名字。
<origin>(可選):這是從父link到子link的轉(zhuǎn)換,關(guān)節(jié)位于子link的原點。
xyz:各軸線上的偏移量。
rpy:各軸線上的偏移弧度。
<axis>(可選):如不設(shè)置,默認(rèn)值為(1,0,0)。
xyz:用于設(shè)置圍繞哪個關(guān)節(jié)軸運動。
<calibration>(可選):關(guān)節(jié)的參考位置,用于校準(zhǔn)關(guān)節(jié)的絕對位置。
rising(可選):當(dāng)關(guān)節(jié)向正方向移動時,該參考位置將觸發(fā)上升沿。
falling(可選):當(dāng)關(guān)節(jié)向正方向移動時,該參考位置將觸發(fā)下降沿。
<dynamics>(可選):指定接頭物理特性的元素。這些值用于指定關(guān)節(jié)的建模屬性,對仿真較為有用。
damping(可選):關(guān)節(jié)的物理阻尼值,默認(rèn)為0。
friction(可選):關(guān)節(jié)的物理靜摩擦值,默認(rèn)為0。
<limit>(關(guān)節(jié)類型是revolute或prismatic時為必須的):
lower(可選):指定關(guān)節(jié)下限的屬性(旋轉(zhuǎn)關(guān)節(jié)以弧度為單位,棱柱關(guān)節(jié)以米為單位)。如果關(guān)節(jié)是連續(xù)的,則省略。
upper(可選):指定關(guān)節(jié)上限的屬性(旋轉(zhuǎn)關(guān)節(jié)以弧度為單位,棱柱關(guān)節(jié)以米為單位)。如果關(guān)節(jié)是連續(xù)的,則省略。
effort(必填):指定關(guān)節(jié)可受力的最大值。
velocity(必填):用于設(shè)置最大關(guān)節(jié)速度(旋轉(zhuǎn)關(guān)節(jié)以弧度每秒 [rad/s] 為單位,棱柱關(guān)節(jié)以米每秒 [m/s] 為單位)。
<mimic>(可選):此標(biāo)簽用于指定定義的關(guān)節(jié)模仿另一個現(xiàn)有關(guān)節(jié)。該關(guān)節(jié)的值可以計算為value = multiplier * other_joint_value + offset。
joint(必填):指定要模擬的關(guān)節(jié)的名稱。
multiplier(可選):指定上述公式中的乘法因子。
offset(可選):指定要在上述公式中添加的偏移量,默認(rèn)為 0(旋轉(zhuǎn)關(guān)節(jié)的單位是弧度,棱柱關(guān)節(jié)的單位是米)。
<safety_controller>(可選):安全控制器。
soft_lower_limit(可選):指定安全控制器開始限制關(guān)節(jié)位置的下關(guān)節(jié)邊界,此限制需要大于joint下限。
soft_upper_limit(可選):指定安全控制器開始限制關(guān)節(jié)位置的關(guān)節(jié)上邊界的屬性,此限制需要小于joint上限。
k_position(可選):指定位置和速度限制之間的關(guān)系。
k_velocity(必填):指定力和速度限制之間的關(guān)系。
4.示例
1.需求
創(chuàng)建機(jī)器人模型,底盤為長方體,在長方體的前面添加一攝像頭,攝像頭可以沿著 Z 軸 360 度旋轉(zhuǎn)。

2.實現(xiàn)
功能包 cpp06_urdf 的 urdf/urdf 目錄下,新建 urdf 文件 demo03_joint.urdf,并編輯文件,輸入如下內(nèi)容:

執(zhí)行指令后,會彈出一個新的窗口,在該窗口中有一個”進(jìn)度條“,通過拖拽進(jìn)度條可以控制相機(jī)旋轉(zhuǎn)。
5.使用base_footprint優(yōu)化urdf
1.需求
前面實現(xiàn)的機(jī)器人模型是半沉到地下的,因為默認(rèn)情況下: 底盤的中心點位于地圖原點上,所以會導(dǎo)致這種情況產(chǎn)生,可以使用的優(yōu)化策略,將初始 link 設(shè)置為一個尺寸極小的 link(比如半徑為 0.001m 的球體,或邊長為 0.001m 的立方體),然后再在初始 link 上添加底盤等剛體,這樣實現(xiàn),雖然仍然存在初始link半沉的現(xiàn)象,但是基本可以忽略了,這個初始 link 一般稱之為 base_footprint。

2.實現(xiàn)
功能包 cpp06_urdf 的 urdf/urdf 目錄下,新建 urdf 文件 demo04_basefootprint.urdf,并編輯文件,輸入如下內(nèi)容:

編譯后,工作空間終端下調(diào)用如下命令執(zhí)行:
ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/urdf/demo04_basefootprint.urdf
執(zhí)行指令后,在 rviz2 將Fixed Frame設(shè)置為base_footprint,機(jī)器人模型將正常顯示在”地面“上。
6.4.4 URDF練習(xí)
1.需求
創(chuàng)建一個四輪機(jī)器人模型,機(jī)器人參數(shù)如下:底盤為長方體狀,長20cm寬12cm高7cm,車輪半徑為2.5cm,車輪厚度為2cm,底盤離地間距為 1.5cm。

2.實現(xiàn)
功能包 cpp06_urdf 的 urdf/urdf 目錄下,新建 urdf 文件 demo05_exercise.urdf,并編輯文件,輸入如下內(nèi)容:

編譯后,工作空間終端下調(diào)用如下命令執(zhí)行:
ros2 launch cpp06_urdf display.launch.py model:=`ros2 pkg prefix --share cpp06_urdf`/urdf/urdf/demo05_exercise.urdf
命令執(zhí)行后,rviz2 中可以顯示與需求類似的機(jī)器人模型。
6.4.5 URDF工具
在 ROS2 中,提供了一些URDF文件相關(guān)的工具,比如:
check_urdf命令可以檢查復(fù)雜的 urdf 文件是否存在語法問題;
urdf_to_graphviz命令可以查看 urdf 模型結(jié)構(gòu),顯示不同 link 的層級關(guān)系。
當(dāng)然,要使用工具之前,請先安裝,安裝命令:sudo apt install liburdfdom-tools。
1.check_urdf 語法檢查
進(jìn)入urdf文件所屬目錄,調(diào)用:check_urdf urdf文件,如果不拋出異常,說明文件合法,否則非法。
示例,終端下進(jìn)入功能包 cpp06_urdf 的 urdf/urdf 目錄,執(zhí)行如下命令:
check_urdf demo05_exercise.urdf
urdf 文件如無異常,將顯示urdf中l(wèi)ink的層級關(guān)系,如下圖所示:

否則將會給出錯誤提示。
2.urdf_to_graphviz 結(jié)構(gòu)查看
進(jìn)入urdf文件所屬目錄,調(diào)用:urdf_to_graphviz urdf文件,當(dāng)前目錄下會生成 pdf 文件。
示例,終端下進(jìn)入功能包 cpp06_urdf 的 urdf/urdf 目錄,執(zhí)行如下命令:
urdf_to_graphviz demo05_exercise.urdf
當(dāng)前目錄下,將生成以urdf中robot名稱命名的.pdf和.gv文件,打開pdf文件會顯示如下圖內(nèi)容:

在上圖中會以樹形結(jié)構(gòu)顯示link與joint的關(guān)系。
注意:該工具以前名為urdf_to_graphiz現(xiàn)建議使用urdf_to_graphviz替代。

B站有完整的ros系列教程視頻,可以觀看完整內(nèi)容ros課程ROS2理論與實踐
更多內(nèi)容將在猛獅知識星球社區(qū)更新最新課程,后續(xù)將推出更多優(yōu)質(zhì)內(nèi)容——詳情可關(guān)注猛獅集訓(xùn)營公眾號和猛獅集訓(xùn)營官方網(wǎng)站