1. URDF建模原理
URDF是一種使用XML格式描述的機(jī)器人模型文件
- Links:坐標(biāo)系與幾何關(guān)系
- Joints:Links之間的關(guān)系
<link>標(biāo)簽
- 描述機(jī)器人某個剛體部分的外觀和物理屬性;
- 描述連桿尺寸、顏色、形狀、慣性矩陣、碰撞屬性等;
- 每個link會成為一個坐標(biāo)系
一個典型的link標(biāo)簽如下:
<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>
(注意長度單位是米,角度單位是弧度)
<collision>標(biāo)簽描述了碰撞屬性,如下圖紅色框(圓柱體)所示,當(dāng)進(jìn)入框內(nèi)時就會認(rèn)為發(fā)生碰撞,這是為了加速碰撞檢測做的一種簡化

<joint>標(biāo)簽
- 描述兩個link之間的關(guān)系,分為六種類型;
- 包括關(guān)節(jié)運(yùn)動的位置和速度限制;
- 描述機(jī)器人關(guān)節(jié)的運(yùn)動學(xué)和動力學(xué)屬性
<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>
每個joint連接兩個link,其中的origin是相對于上一個joint的origin描述的,而上面的<link>標(biāo)簽中的origin是相對于joint坐標(biāo)系表達(dá)的,也就是說在機(jī)器人運(yùn)動過程中,每個連桿的joint和link坐標(biāo)系是相對靜止的,理解這一點(diǎn)很重要。

<robot>標(biāo)簽
整個模型由<robot>根標(biāo)簽包含,一個完整的機(jī)器人模型,由一系列<link>和<joint>組成
<robot name="pr2">
<link> ... </link>
<link> ... </link>
<link> ... </link>
<joint> .... </joint>
<joint> .... </joint>
<joint> .... </joint>
</robot>

URDF建模存在的問題
- 模型冗長,重復(fù)內(nèi)容過多
- 參數(shù)修改麻煩,不便于二次開發(fā)
- 沒有參數(shù)自動計算功能
由此產(chǎn)生了URDF的改進(jìn)版本:xacro模型文件,它具有如下優(yōu)點(diǎn):
- 精簡模型代碼:
創(chuàng)建宏定義
文件包含 - 提供可編程接口:
常量}
變量
數(shù)學(xué)計算
條件語句
常量定義
<xacro:property name="the_radius" value="2.1" />
<xacro:property name="the_length" value="4.5" />
常量使用
<geometry type="cylinder" radius="${the_radius}" length="${the_length}" />
數(shù)學(xué)計算
<!-- + - * /運(yùn)算-->
<xacro:property name="radius" value="4.3" />
<circle diameter="${2 * radius}" />
宏定義
<xacro:macro name="pr2_caster" params="suffix *origin **content **anothercontent">
<joint name="caster_${suffix}_joint">
<axis xyz="0 0 1" />
</joint>
<link name="caster_${suffix}">
<xacro:insert_block name="origin" />
<xacro:insert_block name="content" />
<xacro:insert_block name="anothercontent" />
</link>
</xacro:macro>
宏調(diào)用
<xacro:pr2_caster suffix="front_left">
<pose xyz="0 1 0" rpy="0 0 0" />
<container>
<color name="yellow"/>
<mass>0.1</mass>
</container>
<another>
<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>
</another>
</xacro:pr2_caster>
文件包含
比如傳感器一個文件,機(jī)器人本體一個文件,移動底盤一個文件,用一個文件include三個文件拼在一起
<xacro:include filename="$(find package)/other_file.xacro" />
<xacro:include filename="other_file.xacro" />
<xacro:include filename="$(cwd)/other_file.xacro" />
2. 機(jī)械臂URDF建模
以一個6軸機(jī)器人為例,下圖是在rviz中加載xacro文件后的顯示

顏色定義
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 1"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Red">
<color rgba="1 0 0 1"/>
</material>
link定義
包含可視化,慣性矩陣,碰撞檢測三個部分
<link name="link0">
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="${link0_radius}" length="${link0_length}"/>
</geometry>
<material name="White" />
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<cylinder radius="${link0_radius}" length="${link0_length}"/>
</geometry>
</collision>
<cylinder_inertial_matrix m="${link0_mass}" r="${link0_radius}" h="${link0_length}"/>
</link>
joint定義
<joint name="joint1" type="revolute">
<parent link="link0"/>
<child link="link1"/>
<origin xyz="0 0 ${link0_length/2}" rpy="0 ${M_PI/2} 0" />
<axis xyz="-1 0 0" />
<limit effort="300" velocity="1" lower="${-M_PI}" upper="${M_PI}"/>
</joint>
參數(shù)定義
<!-- Constants -->
<xacro:property name="M_PI" value="3.14159"/>
<!-- link1 properties -->
<xacro:property name="link0_radius" value="0.05" />
<xacro:property name="link0_length" value="0.04" />
<xacro:property name="link0_mass" value="1" />
下面是在rviz中可視化該模型的launch文件,
<launch>
<arg name="model" />
<!-- 加載機(jī)器人模型參數(shù) -->
<param name="robot_description" command="$(find xacro)/xacro --inorder $(find marm_description)/urdf/marm.xacro" />
<!-- 設(shè)置GUI參數(shù),顯示關(guān)節(jié)控制插件 -->
<param name="use_gui" value="true"/>
<!-- 運(yùn)行joint_state_publisher節(jié)點(diǎn),發(fā)布機(jī)器人的關(guān)節(jié)狀態(tài) -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 運(yùn)行robot_state_publisher節(jié)點(diǎn),發(fā)布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 運(yùn)行rviz可視化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find marm_description)/urdf.rviz" required="true" />
</launch>
3. 從SolidWorks三維模型導(dǎo)出URDF
真實(shí)的機(jī)械臂不會是這樣的圓柱、方塊組成的簡單模型,真實(shí)場景是購買到廠商機(jī)械臂本體后,對方給你一個3D模型文件,如.stp文件,需要solidworks轉(zhuǎn)成urdf導(dǎo)入ROS中使用。
步驟如下:
-
在solidworks里加載模型(以UR3的STP模型文件為例)
導(dǎo)入3D模型 -
安裝插件sw2urdfSetup做配置,link的部分,joint關(guān)系
插件下載地址
a) 插入基準(zhǔn)軸,如圖共6個axis
插入旋轉(zhuǎn)軸
b) 工具--->File--->Export as URDF
依次添加7個link(多出來的一個是基座base_link)和6個joint,如圖:
添加joint和link
添加完成后,點(diǎn)擊preview and export,在彈出來的窗口中,依次配置joint限位參數(shù),當(dāng)然留到URDF文件中手動添加tag也可以。
配置joint限位
最后next,finish,選擇功能包保存路徑,這個功能包將會在ROS中使用。

c) 修復(fù)一些小問題
直接編譯功能包會出現(xiàn)一些錯誤,還需要修改一些小的問題:
(1)email地址,如下圖的第10行,需改為xxx@xxx.xxx的形式

(2)修改display.launch文件中的urdf文件路徑

- 測試模型顯示
得到正確的模型功能包后,在rviz中測試一下模型是否正確顯示以及各個關(guān)節(jié)運(yùn)動是否正常。
i5@i5-ThinkPad-T460p:~/ws_moveit$ catkin_make
i5@i5-ThinkPad-T460p:~/ws_moveit$ roslaunch ur3 display.launch
打開rviz后,將Fixed frame更改為base_link,點(diǎn)擊Add,添加RobotModel




