ROS機(jī)械臂開發(fā):創(chuàng)建機(jī)器人URDF模型

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ā)生碰撞,這是為了加速碰撞檢測做的一種簡化


link.png

<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)很重要。

joint.png

<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>
robot.png

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文件后的顯示

6 DOF robot
顏色定義
<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中使用。

步驟如下:
  1. 在solidworks里加載模型(以UR3的STP模型文件為例)


    導(dǎo)入3D模型
  2. 安裝插件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中使用。

導(dǎo)出的功能包

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

修改email地址

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


修改urdf文件路徑
  1. 測試模型顯示
    得到正確的模型功能包后,在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


rviz
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容