ROS學習筆記12 —— urdf/xacro的使用以及gazebo屬性的描述

在這裏插入圖片描述

1. link 標籤包含的元素

  • <visual>:定義在圖形界面觀察到的圖形,圖形通過子標籤<geometry>定義
  • <collision>:定義碰撞信息,通常與<visual>的內容相同
  • <inertial>:定義慣性參數,其中
    • <origin>:重心位置
    • <mass>:質量
    • <inertia>:轉動慣量

注意,如果link標籤沒有inertial,那麼在gazebo中將無法看到.

顏色定義:

  <material name="orange">
    <color rgba="${255/255} ${108/255} ${10/255} 1.0"/>
  </material>

2. joint標籤

在這裏插入圖片描述

    <!-- joints -->
    <joint name="car_base_wheel" type="continuous">
    	<!--origin:父子端的初始transform,默認爲質心重合-->
        <origin xyz="${(wheel_length+car_width)/2.0} 0.0 0.0" rpy="0.0 0.0 0.0"/>
    	<!--parent:父端-->
        <parent link="car_link"/>
        <!--parent:子端-->
        <child link="wheel"/>
        <!--axis:旋轉軸-->
        <axis xyz="0.0 1.0 0.0"/>
        <!--limit:關節限制範圍-->
    </joint>

關節類型如下:

  • 旋轉(revolute):具有由上限和下限指定的有限範圍
  • 連續(continuous) :繞軸旋轉,沒有上限和下限,例如輪子
  • 棱柱形(prismatic) :滑動接頭,沿軸線滑動,並具有由上限和下限指定的有限範圍
  • 固定(fixed) :自由度爲0
  • 浮動(floating) :關節允許所有6個自由度的運動
  • 平面(planar):此允許在垂直於軸的平面內運動

其他屬性參見:http://wiki.ros.org/urdf/XML/joint

注:這些屬性在sw2urdf時可設置。

3. xacro

1) 常量定義與使用

<xacro:property name=”robotname” value=”marvin” />
<link name=”${robotname}s_leg” />

<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}" />

2) 數學

可以使用+-*/()

<cylinder radius="${wheeldiam/2}" length="0.1"/>
<origin xyz="${reflect*(width+.02)} 0 0.25" />

<xacro:property name="R" value="2" />
<xacro:property name="alpha" value="${30/180*pi}" />
<circle circumference="${2 * pi * R}" pos="${sin(alpha)} ${cos(alpha)}" />
<limit lower="${radians(-90)}" upper="${radians(90)}" effort="0" velocity="${radians(75)}" />

3) 宏定義macro

簡單宏定義:

       <xacro:macro name="default_inertial" params="mass">
           <inertial>
                   <mass value="${mass}" />
                   <inertia ixx="1.0" ixy="0.0" ixz="0.0"
                        iyy="1.0" iyz="0.0"
                        izz="1.0" />
           </inertial>
       </xacro:macro>

<!--簡單宏定義的使用-->
<xacro:default_inertial mass="10"/>

參數宏定義:

   <xacro:macro name="blue_shape" params="name *shape">
       <link name="${name}">
           <visual>
               <geometry>
                   <xacro:insert_block name="shape" />
               </geometry>
               <material name="blue"/>
           </visual>
           <collision>
               <geometry>
                   <xacro:insert_block name="shape" />
               </geometry>
           </collision>
       </link>
   </xacro:macro>

<!--參數宏定義的使用-->   
   <xacro:blue_shape name="base_link">
       <cylinder radius=".42" length=".01" />
   </xacro:blue_shape>

示例:

例1:

<?xml version="1.0"?>
<robot name="test" xmlns:xacro="http://www.ros.org/wiki/xacro">

	<!--常量定義-->
	<xacro:property name="PI" value="3.1415926"/>
    <xacro:property name="width" value="0.2" />
    <xacro:property name="bodylen" value="0.6" />
   
	<!--link描述代碼-->
   <link name="base_link">
       <visual>
           <geometry>
               <cylinder radius="${width}" length="${bodylen}"/>
           </geometry>
           <material name="blue"/>
       </visual>
       <collision>
           <geometry>
               <cylinder radius="${width}" length="${bodylen}"/>
           </geometry>
       </collision>
   </link>


</robot>

例2:使用宏定義,定義多條腿,降低代碼量

   <xacro:macro name="leg" params="prefix reflect">
       <link name="${prefix}_leg">
           <visual>
               <geometry>
                   <box size="${leglen} 0.1 0.2"/>
               </geometry>
               <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
               <material name="white"/>
           </visual>
           <collision>
               <geometry>
                   <box size="${leglen} 0.1 0.2"/>
               </geometry>
               <origin xyz="0 0 -${leglen/2}" rpy="0 ${pi/2} 0"/>
           </collision>
           <xacro:default_inertial mass="10"/>
       </link>
   
       <joint name="base_to_${prefix}_leg" type="fixed">
           <parent link="base_link"/>
           <child link="${prefix}_leg"/>
           <origin xyz="0 ${reflect*(width+.02)} 0.25" />
       </joint>
       <!-- A bunch of stuff cut -->
   </xacro:macro>
   <xacro:leg prefix="right" reflect="1" />
   <xacro:leg prefix="left" reflect="-1" />

4) 條件塊

xacro具有類似於roslaunch的條件塊,這對於諸如可配置的機器人或加載不同的Gazebo插件之類的事情很有用。任意bool型的python條件句都是可以的:

<xacro:if value="<expression>">
  <... some xml code here ...>
</xacro:if>
<xacro:unless value="<expression>">
  <... some xml code here ...>
</xacro:unless>

<!--########################################################-->

<xacro:property name="var" value="useit"/>
<xacro:if value="${var == 'useit'}"/>
<xacro:if value="${var.startswith('use') and var.endswith('it')}"/>

<xacro:property name="allowed" value="${[1,2,3]}"/>
<xacro:if value="${1 in allowed}"/>

5) rospack命令

<foo value="$(find xacro)" />
<foo value="$(arg myvar)" />

<!--默認值-->
<xacro:arg name="myvar" default="false"/>

<!--運行xacro-->
<param name="robot_description" command="$(find xacro)/xacro.py $(arg model) myvar:=true" />

6) 包含其他xacro文件

<xacro:include filename="$(find package)/other_file.xacro" />
<xacro:include filename="other_file.xacro" />
<xacro:include filename="$(cwd)/other_file.xacro" />

<!--爲了避免包含文件的屬性和宏定義之間名稱的衝突,可指定名稱空間-->
<xacro:include filename="other_file.xacro" ns="namespace"/>

<!--對名稱空間內的宏和屬性的訪問:-->
${namespace.property}

7) YAML

校準數據時,從YAML中加載是理想的選擇!

<xacro:property name="yaml_file" value="$(find package)/config/props.yaml" />
<xacro:property name="props" value="${load_yaml(yaml_file)}"/>

<!--此外,也可使用python字典或列表手動聲明-->
<xacro:property name="props" value="${dict(a=1, b=2, c=3)}"/>
<xacro:property name="numbers" value="${[1,2,3,4]}"/>

<!--假設props.yaml內容爲:
				val1: 10
				val2: 20
-->

<!--使用方法:-->
<xacro:property name="val1" value="${props['val1']}" />

8) 其他

從CMakeLists.txt中構建xacro、元素和屬性等等,略~

4. Gazebo標籤

1) 必須的標籤

對於link

  <!-- Base Link -->
  <link name="link1">
    <collision>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
        <box size="${width} ${width} ${height1}"/>
      </geometry>
    </collision>

    <visual>
      <origin xyz="0 0 ${height1/2}" rpy="0 0 0"/>
      <geometry>
        <box size="${width} ${width} ${height1}"/>
      </geometry>
      <material name="orange"/>
    </visual>

    <inertial>
      <origin xyz="0 0 1" rpy="0 0 0"/>
      <mass value="1"/>
      <inertia
        ixx="1.0" ixy="0.0" ixz="0.0"
        iyy="1.0" iyz="0.0"
        izz="1.0"/>
    </inertial>
  </link>

其他可給link添加的標籤:
在這裏插入圖片描述
對於joint

  <joint name="joint2" type="continuous">
    <parent link="link2"/>
    <child link="link3"/>
    <origin xyz="0 ${width} ${height2 - axel_offset*2}" rpy="0 0 0"/>
    <axis xyz="0 1 0"/>
    
    <!--Gazebo5+版本中也使用 friction 屬性-->
    <dynamics damping="0.7"/>
  </joint>

其他可給joint設置的標籤:
在這裏插入圖片描述

2) 紋理相關

gazebo中模型渲染紋理:傳送門

<!-- gazebo -->
<gazebo reference="link_name">
    <material>Gazebo/WoodFloor</material>
    <mu1>0.5</mu1>
    <mu2>0.5</mu2>
</gazebo>




  <gazebo reference="link1">
    <material>Gazebo/Orange</material>
  </gazebo>

mu1、mu2轉到這篇博文:傳送門

像在Rviz中一樣,Gazebo可以同時使用STL和Collada文件。通常建議您使用Collada(.dae)文件,因爲它們支持顏色和紋理,而對於STL文件,您只能使用純色鏈接。

加載.dae文件:在<geometry>標籤下,寫入:

<mesh filename="package://myrobot_description/meshes/kinect.dae">

3) 固定到世界座標系

  <!-- Used for fixing robot to Gazebo 'base_link' -->
  <link name="world"/>

  <joint name="fixed" type="fixed">
    <parent link="world"/>
    <child link="link1"/>
  </joint>

4) transmission標籤

該標籤是爲了實現gazebo對模型的驅動!

  1. type: 目前只有一個值:transmission_interface/SimpleTransmission
  2. joint:首先要指明transmission服務的joint的名稱,之後其中包含一個必填屬性

hardwareInterface:該屬性表明了這個joint是什麼類型的,常用的三個屬性值:

  • EffortJointInterface(通過輸入力控制電機)
  • VelocityJointInterface(控制電機的轉速)
  • PositionJointInterface(控制電機的位置)
  1. actuator:首先要爲你的執行器起一個名字(一般就是什麼什麼motor),之後指定執行器的內部屬性
    • mechanicalReduction:指明電機的減速比
    • hardwareInterface:這個可以不指明,因爲在joint中已經指明瞭

注:該部分轉自https://blog.csdn.net/wubaobao1993/article/details/80960584

5) 驗證gazebo模型

# 檢查urdf能否正確的轉換爲sdf
gz sdf -p test.urdf

# 查看sdf所需信息丟失的任何警告
cat ~/.gazebo/gzsdf.log

具體實例參考:傳送門

URDF只能單獨指定單個機器人的運動學和動力學特性,而無法指定機器人本身在世界中的姿態,同時它也不是通用的描述格式,並且缺乏摩擦和其他特性。爲了解決這些缺點,可以使用SDF文件描述模型

Node:

  • ros中joint驅動靠TF,gazebo中靠物理引擎!

  • 使用名稱前綴獲取兩個相似的對象

  • 利用urdf_tutorial功能包查看生成的模型:

    roslaunch urdf_sim_tutorial display.launch model:=rbo.urdf.xacro
    
  • 將xacro轉換爲urdf:

    rosrun  xacro  xacro.py  test.xacro > test.urdf
    
  • launch文件中調用xacro文件解析器

    <arg name="model" default="$(find xacro)/xacro --inorder '$(find robot_description)/urdf/test.xacro'"/>
    <param name="robot_description" command="$(arg model)"/>
    
  • 將sdf文件轉爲urdf

    rosrun pysdf sdf2urdf test.sdf test.urdf
    

    注意,轉完後關節力和速度限位默認爲-1,如果有需要,記得修改;該轉換僅對單純的模型描述有效,如果引入球關節等urdf實現不了的文件,則會失敗

  • 檢查sdf轉urdf後的文件:

    sudo apt-get install liburdfdom-tools
    
    check_urdf test.urdf
    

參考文獻:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章