ROS中階筆記(二):機器人系統設計—URDF機器人建模
01 URDF理論
1.1 什么是URDF
- Unified Robot Description Format,統一機器人描述格式;
- ROS中一個非常重要的機器人模型描述格式;
- 可以解析URDF文件中使用XML格式描述的機器人模型;
- ROS同時也提供URDF文件的C++解析器(可以在C++代碼中直接解析URDF機器人模型,好處:在基於模型的計算算法中,可以在代碼中調用模型的信息,方便模型計算)
1.2 模型< robot >
官網:http://wiki.ros.org/urdf/XML/model
一個完整的機器人模型,由一系列< link >和< joint >組成
- 完整機器人模型的最頂層標簽
- < link > 和 < joint >標簽必須包含在 < robot > 標簽內
<robot name="pr2">
<link> ... </link>
<link> ... </link>
<link> ... </link>
<joint> .... </joint>
<joint> .... </joint>
<joint> .... </joint>
</robot>
1.2.1 < link > element
官網:http://wiki.ros.org/urdf/XML/link
- 描述機器人某個剛體部分的外觀和物理屬性;
- 尺寸(size)、顏色(color)、形狀(shape)、慣性矩陣(inertial matrix)、碰撞屬性(collision properties)等。
<link name="my_link">
<inertial>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder radius="1" length="0.5"/>
</geometry>
</collision>
</link>
包括3個子標簽
- < inertial >:描述link的慣性參數,主要用到機器人動力學的運算部分;
- < visual >:描述機器人link部分的外觀參數, 尺寸、顏色、形狀等的外觀信息;
- < collision >:描述link的碰撞屬性,
link還有一個比較關鍵的部分,就是坐標系
Link origin 是起始坐標,整個link創建的時候都是相對 Link origin坐標系創建的;
1.2.2 < joint > element
官網:http://wiki.ros.org/urdf/XML/joint
joint就是用來連接兩個具體的link部分的;
- 描述機器人關節的運動學和動力學屬性
- 包括關節運動的位置和速度限制
- 根據關節的運動形式,可以將其分為六種類型。
關節類型 | 描述 |
---|---|
continuous | 旋轉關節,可以圍繞單軸無限旋轉 |
revolute | 旋轉關節,類似於continuous,但是有旋轉的角度極限 |
prismatic | 滑動關節,沿某一軸線移動的關節,帶有位置極限 |
planar | 平面關節,允許在平面正交方向上平移或者旋轉 |
floating | 浮動關節,允許進行平移、旋轉運動 |
fixed | 固定關節,不允許運動的特殊關節 |
<joint name="my_joint" type="floating">
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<parent link="link1"/>
<child link="link2"/>
<calibration rising="0.0"/>
<dynamics damping="0.0" friction="0.0"/>
<limit effort="30" velocity="1.0" lower="-2.2" upper="0.7" />
<safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5" />
</joint>
下面圖中,藍色關節表示出一個運動的軸,藍色關節是可以圍繞藍色的軸旋轉的,也就是child這個link是可以圍繞joint上下旋轉。
joint是連接兩個link,需要分一個主次關系,主關節是parent link,子關節是child link, 在xml形式的描述中這個兩個 link是必須存在的
子標簽:
- < calibration >:關節的參考位置,用來校准關節的絕對位置;
- < dynamics >:描述關節的物理屬性,例如阻尼值、物理靜摩擦力等,經常在動力學仿真中用到;
- < limit >:描述運動的一些極限值,包括關節運動的上下限位置、速度限制、力矩限制等;
- < mimic >:描述該關節與已有關節的關系;
- <safety_controller>:描述安全控制器參數。保護機器人關節的運動
02 URDF 實踐
2.1 創建機器人描述的功能包
第一步,進入工作空間中的src 功能包目錄下,
$ cd ./catkin_ws/src/
第二步,創建一個機器人建模的功能包
$ catkin_create_pkg mbot_description urdf xacro
# 機器人模型、描述文件在ROS里,通常的以 機器人名_description
# 並且需要依賴urdf功能包,解析模型 和 xacro(優化urdf用的)依賴
第三步,在mbot_description功能包下創建幾個不同作用的文件夾,如下圖所示:
- urdf:存放機器人模型的URDF或xacro文件
- meshes:放置URDF中引用的模型渲染文件,機器人外觀紋理,讓外觀和實際更相似,通過三維設計軟件導出,放置此文件夾下
- launch:保存相關啟動文件
- config:保存rviz的配置文件、功能包的配置文件
2.2 編輯launch啟動文件
主要是加載urdf 並在rviz中顯示
顯示機器人模型,基本上修改第一行 urdf文件的路徑,即可;
下面display_mbot _base_urdf.launch文件是在rviz中顯示機器人的一種固定形態
<launch>
<!-- param是要加載ros的一個參數:robot_description (描述機器人的具體模型)-->
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf" />
<!-- 設置GUI參數,顯示關節控制插件 -->
<param name="use_gui" value="true"/>
<!-- 運行joint_state_publisher節點,發布機器人的關節狀態 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 運行robot_state_publisher節點,發布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 運行rviz可視化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true" />
</launch>
- joint_state_publisher:發布每個joint(除fixed類型)的狀態,而且可以通過UI界面對joint進行控制
- robot_state_publisher:將機器人各個links、joints之間的關系,通過TF的形式,整理成三維姿態信息發布
2.3 配置config文件
在config文件夾下,創建.rviz 配置文件,保存。
2.4 創建URDF模型
在urdf文件夾下,創建.urdf文件,保存。
第一步:使用圓柱體創建一個車體模型
第二步:使用圓柱體創建左側車輪
第三步:使用圓柱體創建右側車輪
第四步:使用球體創建前后支撐輪
第五步:創建傳感器——攝像頭camera、激光雷達laser、Kinect;
關於Kinect,在meshes文件夾下,創建創建紋理描述文件
2.5 檢查URDF模型整體結構
在urdf文件夾下,執行 urdf_to_graphiz+要檢查的urdf文件
$ urdf_to_graphiz mbot_with_kinect.urdf
會在當前路徑下創建一個pdf文件,把機器人所有的link和joint的關系分析出來;
2.6 啟動launch文件
注意:在運行launch文件時,URDF文件中不能有中文注釋,刪除掉中文注釋,否正會報錯誤;
$ roslaunch mbot_description display_mbot_base_urdf.launch
問題一:啟動錯誤
[ERROR] [1589109861.881993]: Could not find the GUI, install the 'joint_state_publisher_gui' package
$ sudo apt-get install ros-kinetic-joint-state-publisher-gui
問題二:警告
這時候可能還會存在一個警告,如果有的話把launch文件中的joint_state_publisher用joint_state_publisher_gui全部替換掉,即可。
2.7 URDF建模存在的問題
- 模型冗長,重復內容過多
- 參數修改麻煩,不便於二次開發
- 沒有參數計算功能
03 參考資料
官方教程:http://wiki.ros.org/cn/urdf