welcom ! Handel home

2025年2月5日 星期三

(兩輪小車範例)name='chassis' 主體解析

 這段 <link name='chassis'> 代碼描述了一個機器人的 底盤 (chassis),它包含了:

   物理屬性( 質量、慣性)、

   碰撞體(collision)、

   可視化模型(visual),

   以及一個小的萬向輪(caster)。


📌 結構分析

這段代碼主要由以下部分組成:

  1. <pose>:底盤的初始位置
  2. <inertial>:機器人的質量與慣性張量
  3. <collision>:定義碰撞體(box 和 sphere)
  4. <visual>:定義顯示模型(box 和 sphere)
  5. <surface>:摩擦力與滑動參數(適用於 caster)

🔍 詳細解析

1️⃣ <pose> (底盤初始位置)

<pose>0 0 0.1 0 0 0</pose>
  • xyz = 0 0 0.1 → 機器人底盤的初始位置在 z 軸 0.1m 高度。
  • rpy = 0 0 0 → 沒有旋轉。

這表示底盤離地面 10 公分,可能是為了安裝輪子。


2️⃣ <inertial> (質量與慣性張量)

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

📌 作用

  • mass value="10.0" → 底盤質量為 10kg。
  • origin xyz="0.0 0 0.1" → 慣性中心位於 (0,0,0.1),即在底盤的中心。
  • <inertia> → 慣性張量(影響物理運動):
    • ixx="0.5", iyy="1.0", izz="0.1" → 定義了物體在 X、Y、Z 軸上的轉動慣量。

這段定義告訴模擬器,底盤在不同方向上的旋轉阻力不同,可能是因為形狀不均勻或重心不同。


3️⃣ <collision> (碰撞模型)

這裡定義了兩個碰撞體:

📌 (1) 底盤碰撞體

<collision name='collision'> <geometry> <box size=".4 .2 .1"/> </geometry> </collision>
  • box size=".4 .2 .1" → 定義了一個 長 0.4m、寬 0.2m、高 0.1m 的 碰撞盒。
  • 這是底盤的主要碰撞範圍,用於偵測與環境的物理交互。

📌 (2) 萬向輪碰撞體

<collision name='caster_collision'> <origin xyz="-0.15 0 -0.05" rpy="0 0 0"/> <geometry> <sphere radius="0.05"/> </geometry> <surface> <friction> <ode> <mu>0</mu> <mu2>0</mu2> <slip1>1.0</slip1> <slip2>1.0</slip2> </ode> </friction> </surface> </collision>
  • 這是一個 "caster" (萬向輪) 的物理模擬:
    • origin xyz="-0.15 0 -0.05" → 它被放在底盤的 後方 (-0.15m) 和 稍微低一點 (-0.05m),應該是模擬機器人的輔助小輪。
    • geometry → 使用 球形 (sphere) 來模擬一個小輪子 (radius=0.05,半徑 5 公分)。
    • surface:
      • mu=0, mu2=0 → 無摩擦力,表示萬向輪不會影響前進方向。
      • slip1=1.0, slip2=1.0 → 完全滑動,允許自由移動。

這是為了模擬一個無驅動的萬向輪,它可以自由滑動,但不影響機器人的驅動方向。


4️⃣ <visual> (可視化模型)

這裡也有兩個可視化部分:

📌 (1) 底盤視覺模型

<visual name='chassis_visual'> <origin xyz="0 0 0" rpy="0 0 0"/> <geometry> <box size=".4 .2 .1"/> </geometry> </visual>
  • 這個與 <collision> 相同,用來在 Gazebo 或 RViz 顯示機器人外觀。

📌 (2) 萬向輪視覺模型

<visual name='caster_visual'> <origin xyz="-0.15 0 -0.05" rpy="0 0 0"/> <geometry> <sphere radius="0.05"/> </geometry> </visual>
  • 這與 caster 的碰撞體 一樣,讓 萬向輪在可視化中顯示出來。

📝 總結

部分作用細節
<pose>初始位置底盤離地 10cm,無旋轉
<inertial>慣性與質量質量 10kg,不同軸的慣性張量不同
<collision> (底盤)碰撞盒0.4m × 0.2m × 0.1m,定義底盤的碰撞範圍
<collision> (萬向輪)萬向輪球體 (r=0.05m),完全滑動無摩擦
<visual> (底盤)底盤外觀使用相同尺寸的 box 來顯示
<visual> (萬向輪)萬向輪外觀球體 (r=0.05m),用來在模擬器中顯示

✅ 這段代碼的意義

  1. 完整定義底盤 (chassis):

    • 具有物理屬性(質量、慣性)。
    • 具有碰撞檢測(box 為主體,sphere 為萬向輪)。
    • 具有可視化模型(與碰撞體對應)。
  2. 支援萬向輪 (caster) 模擬:

    • 透過 無摩擦、完全滑動 設定,讓萬向輪不會影響驅動方向。
  3. 適用於 Gazebo & ROS 運動控制:

    • 在 Gazebo 中,這樣的設定可以確保機器人能夠平穩運行。
    • 在 RViz 中,這些 <visual> 部分會用來顯示機器人的 3D 模型。

🔍 你還需要什麼?

  • 需要 調整底盤大小、質量?
  • 想要 新增其他組件(如感測器、攝影機)?
  • 想要在 Gazebo 測試這段代碼?

===============

  <link name='chassis'>
    <pose>0 0 0.1 0 0 0</pose>

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

    <collision name='collision'>
      <geometry>
        <box size=".4 .2 .1"/>
      </geometry>
    </collision>

    <visual name='chassis_visual'>
      <origin xyz="0 0 0" rpy=" 0 0 0"/>
      <geometry>
        <box size=".4 .2 .1"/>
      </geometry>
    </visual>


    <collision name='caster_collision'>
      <origin xyz="-0.15 0 -0.05" rpy=" 0 0 0"/>
      <geometry>
        <sphere radius="0.05"/>
      </geometry>
      <surface>
        <friction>
          <ode>
            <mu>0</mu>
            <mu2>0</mu2>
            <slip1>1.0</slip1>
            <slip2>1.0</slip2>
          </ode>
        </friction>
      </surface>
    </collision>

    <visual name='caster_visual'>
      <origin xyz="-0.15 0 -0.05" rpy=" 0 0 0"/>
      <geometry>
        <sphere radius="0.05"/>
      </geometry>
    </visual>
  </link>

========================

(兩輪小車範例)分析 macros.xacro 和 materials.xacro

 這兩個 Xacro (XML Macro) 文件分別定義了:

macros.xacro:包含機器人模型的 慣性計算巨集,

                             可用來計算不同形狀(圓柱、長方體、球體)的慣性張量。

materials.xacro:定義了一些 材質顏色,用於機器人模型的視覺外觀設定。


1 macros.xacro(巨集函數)

這個文件主要包含用來 計算物理屬性的巨集,適用於機器人不同形狀的零件。


#主要功能

定義不同形狀的慣性 (inertia) 計算方式

使用 Xacro 巨集 (<macro>) 來避免重複編寫慣性張量


#內容解析

<?xml version="1.0"?>

<robot>

  <!-- 圓柱形慣性計算 -->

  <macro name="cylinder_inertia" params="m r h">

<inertia  

  ixx="${m*(3*r*r+h*h)/12}" ixy="0" ixz="0"

  iyy="${m*(3*r*r+h*h)/12}" iyz="0"

  izz="${m*r*r/2}"

/>

  </macro>

  <!-- 長方體慣性計算 -->

  <macro name="box_inertia" params="m x y z">

<inertia  

  ixx="${m*(y*y+z*z)/12}" ixy="0" ixz="0"

  iyy="${m*(x*x+z*z)/12}" iyz="0"

  izz="${m*(x*x+y*y)/12}"

/>

  </macro>

  <!-- 球形慣性計算 -->

  <macro name="sphere_inertia" params="m r">

<inertia  

  ixx="${2*m*r*r/5}" ixy="0" ixz="0"

  iyy="${2*m*r*r/5}" iyz="0"

  izz="${2*m*r*r/5}"

/>

  </macro>


</robot>


#macros.xacro 的作用 避免重複計算慣性張量

直接使用 <xacro:cylinder_inertia>、<xacro:box_inertia>、<xacro:sphere_inertia>,不用每次手動計算。

計算不同形狀的慣性


cylinder_inertia (m, r, h) → 計算圓柱的慣性。

box_inertia (m, x, y, z) → 計算長方體的慣性。

sphere_inertia (m, r) → 計算球體的慣性。


#使用方式

假設有一個長方體底盤,使用巨集來計算慣性:

<link name="chassis">

  <inertial>

<mass value="10.0"/>

<xacro:box_inertia m="10.0" x="0.5" y="0.3" z="0.1"/>

  </inertial>

</link>

這樣就不需要手動寫 <inertia>,提高可讀性與可重用性。



2materials.xacro(機器人材質)

這個文件負責 定義機器人的材質顏色,主要透過 <material> 來指定不同顏色。


#內容解析

<?xml version="1.0"?>

<robot>


  <!-- 定義黑色 -->

  <material name="black">

<color rgba="0.0 0.0 0.0 1.0"/>

  </material>


  <!-- 定義藍色 -->

  <material name="blue">

<color rgba="0.0 0.0 0.8 1.0"/>

  </material>


  <!-- 定義綠色 -->

  <material name="green">

<color rgba="0.0 0.8 0.0 1.0"/>

  </material>


  <!-- 定義灰色 -->

  <material name="grey">

<color rgba="0.2 0.2 0.2 1.0"/>

  </material>


  <!-- 定義橙色 -->

  <material name="orange">

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

  </material>


  <!-- 定義棕色 -->

  <material name="brown">

<color rgba="${222/255} ${207/255} ${160/255} 1.0"/>

  </material>


</robot>

#materials.xacro 的作用

統一機器人顏色管理


讓所有機器人的材質都來自 materials.xacro,方便修改顏色。

提高可讀性


透過 <material name="xxx"> 讓 URDF 變得更簡潔。

#使用方式

在 myrobot.xacro 中,可以這樣引用材質:

<visual>

  <geometry>

<box size="0.5 0.3 0.1"/>

  </geometry>

  <material name="blue"/>

</visual>

這樣 chassis 就會變成藍色,而不需要手動寫 RGB 值。


#總結

組件 作用 主要內容

macros.xacro 計算機器人不同形狀的 慣性 提供 cylinder_inertia、box_inertia、sphere_inertia 巨集

materials.xacro 定義機器人的材質顏色 提供 black、blue、green、grey、orange、brown 等材質

這兩個 Xacro 文件 幫助簡化機器人模型的定義,提高可讀性與可重用性。


#你可以這樣做

若要新增新的材質 → 在 materials.xacro 裡加一個 <material>。

若要新增新的幾何形狀 → 在 macros.xacro 裡加一個 <macro>。

這樣未來修改顏色或物理屬性時,只需要改一個地方,不需要到處修改 URDF 文件。

(兩輪小車範例)myrobot_grazbo.xml 分析

## myrobot_grazbo.xml

<?xml version="1.0"?>

<robot>

  <gazebo>

    <plugin name="differential_drive_controller" filename="libgazebo_ros_diff_drive.so">

      <legacyMode>false</legacyMode>

      <alwaysOn>true</alwaysOn>

      <updateRate>20</updateRate>

      <leftJoint>left_wheel_hinge</leftJoint>

      <rightJoint>right_wheel_hinge</rightJoint>

      <wheelSeparation>0.4</wheelSeparation>

      <wheelDiameter>0.1</wheelDiameter>

      <torque>20</torque>

      <commandTopic>cmd_vel</commandTopic>

      <odometryTopic>odom</odometryTopic>

      <odometryFrame>odom</odometryFrame>

      <robotBaseFrame>chassis</robotBaseFrame>

    </plugin>

  </gazebo>


  <gazebo reference="chassis">

      <material>Gazebo/Orange</material>

    </gazebo>


</robot>

======================================

#分析 myrobot.gazebo 文件的內容#

myrobot.gazebo 文件是一個 XML 格式的文件,與 Gazebo 模擬器有關。

它包含機器人的 Gazebo 插件配置,特別是 differential drive (差動驅動) 控制器,這通常用於兩輪驅動的機器人,如自動導航小車。


文件內容說明:

1. <robot> 標籤:這是機器人模型的主要標籤,表示這個文件是為機器人設計的。

2. <gazebo> 標籤:這個部分包含與 Gazebo 模擬相關的設定。

3. <plugin> 插件:

○ name="differential_drive_controller":指定插件名稱,這裡使用的是 libgazebo_ros_diff_drive.so,這是 ROS (Robot Operating System) 提供的差動驅動插件。

○ <legacyMode>false</legacyMode>:表示該插件運行在非傳統模式下,適用於較新的 Gazebo 版本。

○ <alwaysOn>true</alwaysOn>:插件始終保持運行狀態。

○ <updateRate>20</updateRate>:設定更新頻率為 20 Hz。

○ <leftJoint>left_wheel_hinge</leftJoint>:指定左輪關節名稱。

○ <rightJoint>right_wheel_hinge</rightJoint>:指定右輪關節名稱。

○ <wheelSeparation>0.4</wheelSeparation>:左右輪之間的距離為 0.4 米。

○ <wheelDiameter>0.1</wheelDiameter>:輪子的直徑為 0.1 米。

○ <torque>20</torque>:設定輪子的最大扭矩為 20 Nm。

○ <commandTopic>cmd_vel</commandTopic>:機器人將透過 cmd_vel 該 ROS 訂閱主題來接收運動指令。

○ <odometryTopic>odom</odometryTopic>:機器人將透過 odom 該 ROS 主題發佈里程計資訊。

作用:

這個文件的主要作用是為 Gazebo 模擬器提供機器人差動驅動的參數設定,這樣機器人可以在模擬環境中根據 ROS 發送的速度指令 (cmd_vel) 來移動,並且回傳里程計數據 (odom)。

如果你需要修改某些參數,例如改變輪子的大小或驅動頻率,可以調整對應的 <wheelDiameter>、<updateRate> 或 <torque> 等數值。


#########################################################

## myrobot.urdf

<?xml version="1.0" ?>

<!-- =================================================================================== -->

<!-- |    This document was autogenerated by xacro from myrobot.xacro                  | -->

<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->

<!-- =================================================================================== -->

<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">

  <gazebo>

    <plugin filename="libgazebo_ros_diff_drive.so" name="differential_drive_controller">

      <legacyMode>false</legacyMode>

      <alwaysOn>true</alwaysOn>

      <updateRate>20</updateRate>

      <leftJoint>left_wheel_hinge</leftJoint>

      <rightJoint>right_wheel_hinge</rightJoint>

      <wheelSeparation>0.4</wheelSeparation>

      <wheelDiameter>0.1</wheelDiameter>

      <torque>20</torque>

      <commandTopic>cmd_vel</commandTopic>

      <odometryTopic>odom</odometryTopic>

      <odometryFrame>odom</odometryFrame>

      <robotBaseFrame>chassis</robotBaseFrame>

    </plugin>

  </gazebo>

  <gazebo reference="chassis">

    <material>Gazebo/Orange</material>

  </gazebo>

  <material name="black">

    <color rgba="0.0 0.0 0.0 1.0"/>

  </material>

  <material name="blue">

    <color rgba="0.0 0.0 0.8 1.0"/>

  </material>

  <material name="green">

    <color rgba="0.0 0.8 0.0 1.0"/>

  </material>

  <material name="grey">

    <color rgba="0.2 0.2 0.2 1.0"/>

  </material>

  <material name="orange">

    <color rgba="1.0 0.423529411765 0.0392156862745 1.0"/>

  </material>

  <material name="brown">

    <color rgba="0.870588235294 0.811764705882 0.764705882353 1.0"/>

  </material>

  <material name="red">

    <color rgba="0.8 0.0 0.0 1.0"/>

  </material>

  <material name="white">

    <color rgba="1.0 1.0 1.0 1.0"/>

  </material>

  <!--macro name="cylinder_inertia" params="m r h">

    <inertia  ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"

      iyy="${m*(3*r*r+h*h)/12}" iyz = "0"

      izz="${m*r*r/2}"

    />

  </macro>


  <macro name="box_inertia" params="m x y z">

    <inertia  ixx="${m*(y*y+z*z)/12}" ixy = "0" ixz = "0"

      iyy="${m*(x*x+z*z)/12}" iyz = "0"

      izz="${m*(x*x+z*z)/12}"

    />

  </macro>


  <macro name="sphere_inertia" params="m r">

    <inertia  ixx="${2*m*r*r/5}" ixy = "0" ixz = "0"

      iyy="${2*m*r*r/5}" iyz = "0"

      izz="${2*m*r*r/5}"

    />

  </macro>


  <macro name="wheel" params="lr tY">


    <link name="${lr}_wheel">

      <collision>

        <origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" />

        <geometry>

          <cylinder length="${wheelWidth}" radius="${wheelRadius}"/>

        </geometry>

      </collision>


      <visual>

        <origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" />

        <geometry>

          <cylinder length="${wheelWidth}" radius="${wheelRadius}"/>

        </geometry>

        <material name="black"/>

      </visual>


      <inertial>

        <origin xyz="0 0 0" rpy="0 ${PI/2} ${PI/2}" />

        <mass value="${wheelMass}"/>

        <cylinder_inertia m="${wheelMass}" r="${wheelRadius}" h="${wheelWidth}"/>

      </inertial>

    </link>


    <gazebo reference="${lr}_wheel">

      <mu1 value="1.0"/>

      <mu2 value="1.0"/>

      <kp  value="10000000.0" />

      <kd  value="1.0" />

      <fdir1 value="1 0 0"/>

      <material>Gazebo/Black</material>

    </gazebo>



    <joint name="${lr}_wheel_hinge" type="continuous">

      <parent link="chassis"/>

      <child link="${lr}_wheel"/>

    <origin xyz="${-wheelPos+chassisLength/2} ${tY*wheelWidth/2+tY*chassisWidth/2} ${wheelRadius}" rpy="0 0 0" />

      <axis xyz="0 1 0" rpy="0 0 0" />

      <limit effort="10000" velocity="10000"/>

      <joint_properties damping="0.0" friction="0.0"/>

    </joint>



    <transmission name="${lr}_trans">

      <type>transmission_interface/SimpleTransmission</type>

      <joint name="${lr}_wheel_hinge">

        <hardwareInterface>EffortJointInterface</hardwareInterface>

      </joint>

      <actuator name="${lr}Motor">

        <hardwareInterface>EffortJointInterface</hardwareInterface>

        <mechanicalReduction>10</mechanicalReduction>

      </actuator>

    </transmission>


  </macro-->

  <link name="chassis">

    <pose>0 0 0.1 0 0 0</pose>

    <inertial>

      <mass value="10.0"/>

      <origin rpy=" 0 0 0" xyz="0.0 0 0.1"/>

      <inertia ixx="0.5" ixy="0" ixz="0" iyy="1.0" iyz="0" izz="0.1"/>

    </inertial>

    <collision name="collision">

      <geometry>

        <box size=".4 .2 .1"/>

      </geometry>

    </collision>

    <visual name="chassis_visual">

      <origin rpy=" 0 0 0" xyz="0 0 0"/>

      <geometry>

        <box size=".4 .2 .1"/>

      </geometry>

    </visual>

    <collision name="caster_collision">

      <origin rpy=" 0 0 0" xyz="-0.15 0 -0.05"/>

      <geometry>

        <sphere radius="0.05"/>

      </geometry>

      <surface>

        <friction>

          <ode>

            <mu>0</mu>

            <mu2>0</mu2>

            <slip1>1.0</slip1>

            <slip2>1.0</slip2>

          </ode>

        </friction>

      </surface>

    </collision>

    <visual name="caster_visual">

      <origin rpy=" 0 0 0" xyz="-0.15 0 -0.05"/>

      <geometry>

        <sphere radius="0.05"/>

      </geometry>

    </visual>

  </link>

  <link name="left_wheel">

    <!--origin xyz="0.1 0.13 0.1" rpy="0 1.5707 1.5707"/-->

    <collision name="collision">

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <geometry>

        <cylinder length="0.05" radius="0.1"/>

      </geometry>

    </collision>

    <visual name="left_wheel_visual">

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <geometry>

        <cylinder length="0.05" radius="0.1"/>

      </geometry>

    </visual>

    <inertial>

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <mass value="5"/>

      <cylinder_inertia h="0.05" m="5" r="0.1"/>

      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>

    </inertial>

  </link>

  <link name="right_wheel">

    <!--origin xyz="0.1 -0.13 0.1" rpy="0 1.5707 1.5707"/-->

    <collision name="collision">

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <geometry>

        <cylinder length="0.05" radius="0.1"/>

      </geometry>

    </collision>

    <visual name="right_wheel_visual">

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <geometry>

        <cylinder length="0.05" radius="0.1"/>

      </geometry>

    </visual>

    <inertial>

      <origin rpy="0 1.5707 1.5707" xyz="0 0 0"/>

      <mass value="5"/>

      <cylinder_inertia h="0.05" m="5" r="0.1"/>

      <inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>

    </inertial>

  </link>

  <joint name="left_wheel_hinge" type="continuous">

    <origin rpy="0 0 0" xyz="0.1 0.15 0"/>

    <child link="left_wheel"/>

    <parent link="chassis"/>

    <axis rpy="0 0 0" xyz="0 1 0"/>

    <limit effort="100" velocity="100"/>

    <joint_properties damping="0.0" friction="0.0"/>

  </joint>

  <joint name="right_wheel_hinge" type="continuous">

    <origin rpy="0 0 0" xyz="0.1 -0.15 0"/>

    <child link="right_wheel"/>

    <parent link="chassis"/>

    <axis rpy="0 0 0" xyz="0 1 0"/>

    <limit effort="100" velocity="100"/>

    <joint_properties damping="0.0" friction="0.0"/>

  </joint>

</robot>


======================================

#分析 myrobot.urdf 文件的內容#

myrobot.urdf 文件是一個 URDF (Unified Robot Description Format) 文件,用於描述機器人的結構和屬性。

從開頭的註解來看,這個文件是由 Xacro (myrobot.xacro) 自動生成的,這表示該文件是從更高層級的 xacro 文件轉換而來,手動修改可能會被覆蓋。


分析內容

1. XML 頭部

<?xml version="1.0" ?>

這是標準的 XML 頭部。

2. Xacro 產生的文件

<!-- =================================================================================== -->

<!-- |    This document was autogenerated by xacro from myrobot.xacro                  | -->

<!-- |    EDITING THIS FILE BY HAND IS NOT RECOMMENDED                                 | -->

<!-- =================================================================================== -->


這段註解表明 這個 URDF 文件是從 myrobot.xacro 轉換來的,通常建議修改 xacro 文件,而不是直接編輯 urdf。

3. 機器人名稱

<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">


○ name="robot":這是機器人的名稱。

○ xmlns:xacro:這表示它原本是使用 Xacro 擴展語法生成的。

4. Gazebo 插件

<gazebo>

  <plugin filename="libgazebo_ros_diff_drive.so">


○ libgazebo_ros_diff_drive.so:這是 Gazebo 的 ROS 差動驅動插件,與 myrobot.gazebo 內的插件類似,用於控制機器人的移動。



可能的內容與功能

URDF 文件通常包含以下內容:

1. 鏈接 (<link>):描述機器人的不同部分,如底盤、輪子、感測器等。

2. 關節 (<joint>):描述如何將不同的 link 連接在一起(例如輪子如何與機身連接)。

3. 慣性 (<inertial>):描述機器人的物理屬性,如質量和慣性張量。

4. 可視化 (<visual>):描述機器人的外觀,通常使用 .dae 或 .stl 文件來顯示 3D 模型。

5. 碰撞 (<collision>):定義碰撞模型,用於物理模擬。


備註

1. URDF 是機器人描述的核心:

○ myrobot.urdf 定義了機器人的形狀、結構和運動學信息。

○ myrobot.gazebo 主要是 為 Gazebo 模擬提供額外的插件與參數。

2. 不要直接修改 URDF,而應修改 Xacro:

○ myrobot.urdf 是從 myrobot.xacro 生成的,因此應該編輯 myrobot.xacro,然後再重新生成 URDF。

3. 與 ROS 結合使用:

○ 這個 URDF 文件通常與 ROS (Robot Operating System) 一起使用,並通過 robot_state_publisher 來發布機器人的狀態。

4. 與 Gazebo 的關聯:

○ 這個 URDF 文件包含 Gazebo 插件,這意味著這台機器人將在 Gazebo 模擬器中運行,並可能使用 libgazebo_ros_diff_drive.so 來控制運動。


#####################################

## myrobot.xarco 


<?xml version='1.0'?>

<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">


  <xacro:include filename="$(find myrobot_description)/urdf/myrobot.gazebo" />

  <xacro:include filename="$(find myrobot_description)/urdf/materials.xacro" />

  <xacro:include filename="$(find myrobot_description)/urdf/macros.xacro" />


  <link name='chassis'>

    <pose>0 0 0.1 0 0 0</pose>


    <inertial>

      <mass value="10.0"/>

      <origin xyz="0.0 0 0.1" rpy=" 0 0 0"/>

      <inertia

          ixx="0.5" ixy="0" ixz="0"

          iyy="1.0" iyz="0"

          izz="0.1"

      />

    </inertial>


    <collision name='collision'>

      <geometry>

        <box size=".4 .2 .1"/>

      </geometry>

    </collision>


    <visual name='chassis_visual'>

      <origin xyz="0 0 0" rpy=" 0 0 0"/>

      <geometry>

        <box size=".4 .2 .1"/>

      </geometry>

    </visual>



    <collision name='caster_collision'>

      <origin xyz="-0.15 0 -0.05" rpy=" 0 0 0"/>

      <geometry>

        <sphere radius="0.05"/>

      </geometry>

      <surface>

        <friction>

          <ode>

            <mu>0</mu>

            <mu2>0</mu2>

            <slip1>1.0</slip1>

            <slip2>1.0</slip2>

          </ode>

        </friction>

      </surface>

    </collision>


    <visual name='caster_visual'>

      <origin xyz="-0.15 0 -0.05" rpy=" 0 0 0"/>

      <geometry>

        <sphere radius="0.05"/>

      </geometry>

    </visual>

  </link>



  <link name="left_wheel">

    <!--origin xyz="0.1 0.13 0.1" rpy="0 1.5707 1.5707"/-->

    <collision name="collision">

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <geometry>

        <cylinder radius="0.1" length="0.05"/>

      </geometry>

    </collision>

    <visual name="left_wheel_visual">

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <geometry>

        <cylinder radius="0.1" length="0.05"/>

      </geometry>

    </visual>

    <inertial>

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <mass value="5"/>

      <cylinder_inertia m="5" r="0.1" h="0.05"/>

      <inertia

        ixx="1.0" ixy="0.0" ixz="0.0"

        iyy="1.0" iyz="0.0"

        izz="1.0"/>

    </inertial>

  </link>


  <link name="right_wheel">

    <!--origin xyz="0.1 -0.13 0.1" rpy="0 1.5707 1.5707"/-->

    <collision name="collision">

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <geometry>

        <cylinder radius="0.1" length="0.05"/>

      </geometry>

    </collision>

    <visual name="right_wheel_visual">

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <geometry>

        <cylinder radius="0.1" length="0.05"/>

      </geometry>

    </visual>

    <inertial>

      <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/>

      <mass value="5"/>

      <cylinder_inertia m="5" r="0.1" h="0.05"/>

      <inertia

        ixx="1.0" ixy="0.0" ixz="0.0"

        iyy="1.0" iyz="0.0"

        izz="1.0"/>

    </inertial>

  </link>



  <joint type="continuous" name="left_wheel_hinge">

    <origin xyz="0.1 0.15 0" rpy="0 0 0"/>

    <child link="left_wheel"/>

    <parent link="chassis"/>

    <axis xyz="0 1 0" rpy="0 0 0"/>

    <limit effort="100" velocity="100"/>

    <joint_properties damping="0.0" friction="0.0"/>

  </joint>


  <joint type="continuous" name="right_wheel_hinge">

    <origin xyz="0.1 -0.15 0" rpy="0 0 0"/>

    <child link="right_wheel"/>

    <parent link="chassis"/>

    <axis xyz="0 1 0" rpy="0 0 0"/>

    <limit effort="100" velocity="100"/>

    <joint_properties damping="0.0" friction="0.0"/>

  </joint>


</robot>

====================================

#分析 myrobot.xacro 文件的內容#

分析 myrobot.xacro 文件

這個 Xacro (XML Macro) 文件用於生成 URDF (Unified Robot Description Format),它提供了一種更靈活的方式來組織和管理機器人模型,並最終轉換為 myrobot.urdf。


文件內容解析

1. XML 頭部

<?xml version='1.0'?>


這是標準的 XML 宣告。

2. 機器人名稱與 Xacro 命名空間

<robot name="robot" xmlns:xacro="http://www.ros.org/wiki/xacro">


○ name="robot":定義機器人名稱。

○ xmlns:xacro:聲明 Xacro 命名空間,使其可以使用 Xacro 擴展語法。

3. 包含其他 Xacro 文件

<xacro:include filename="$(find myrobot_description)/urdf/myrobot.gazebo" />

<xacro:include filename="$(find myrobot_description)/urdf/materials.xacro" />

<xacro:include filename="$(find myrobot_description)/urdf/macros.xacro" />


○ 這些 xacro:include 指令引入了其他 Xacro 文件:

§ myrobot.gazebo:包含與 Gazebo 相關的模擬設定,如插件配置。

§ materials.xacro:可能包含機器人的顏色、紋理和材質定義。

§ macros.xacro:可能包含一些 Xacro 巨集 (macro),用於簡化模型的定義。

4. 機器人底盤 (chassis)

<link name='chassis'>

  <pose>0 0 0.1 0 0 0</pose>


○ <link>:表示一個獨立的機器人部件,這裡是底盤 (chassis)。

○ <pose>:設定底盤的初始位置 (x, y, z, roll, pitch, yaw)。

5. 慣性 (inertial)

<inertial>

  <mass value="10.0"/>

  <origin xyz="0.0 0 0.1" rpy="0 0 0"/>

  <inertia

  ixx="0.1"

  iyy="0.1"

  izz="0.1"

  ixy="0.0"

  ixz="0.0"

  iyz="0.0"/>

</inertial>

○ <mass value="10.0"/>:機器人的質量為 10 公斤。

○ <origin xyz="0.0 0 0.1" rpy="0 0 0"/>:設定慣性中心的位置。

○ <inertia>:定義機器人的慣性張量 (影響模擬中的物理行為)。


總結

1. myrobot.xacro 是 myrobot.urdf 的模板

○ 這個 Xacro 文件會轉換成 URDF,提供更靈活的機器人定義方式。

2. 使用 Xacro 巨集提高可讀性

○ 透過 xacro:include 引入其他文件,避免 URDF 太過冗長。

○ macros.xacro 可能包含 巨集函式,幫助重複使用組件。

3. 與 Gazebo 整合

○ myrobot.gazebo 被引入,表示這個機器人將在 Gazebo 模擬環境 中運行。

4. 定義了底盤 (chassis) 與物理屬性

○ chassis 是機器人的主體,包含慣性、質量、位置等設定。



建議與備註

• 如果你想要修改機器人的結構,應該編輯 myrobot.xacro,然後再轉換成 myrobot.urdf。

• 如果你要調整 材質,可以修改 materials.xacro。

• 如果你想要增加新的 關節 (joints) 或 零件 (links),可以在這個文件內新增 xacro:macro 來管理它們。



ROS 與機器人模擬學習指南

 #簡介

本學習指南旨在幫助您了解 ROS(機器人作業系統)以及如何在模擬環境中使用它,特別是 Gazebo。本指南涵蓋了從 ROS 的基本概念到更高級的主題,例如 SLAM (Simultaneous Localization and Mapping) 和導航。它還包括了 TurtleBot3 和 DrRobot Jaguar 平台。

#學習目標

  • 了解 ROS 的核心概念和架構。
  • 學會使用 Gazebo 進行機器人模擬。
  • 掌握 TurtleBot3 和 DrRobot Jaguar 機器人的配置和控制。
  • 了解 ROS 的 SLAM 和導航功能。
  • 學習如何使用 URDF、Xacro 建構機器人模型.

#測驗

請以簡潔的語言(2-3 句)回答下列問題:

  1. 什麼是 ROS?它在機器人開發中的作用是什麼?
  2. 說明 ROS 1 和 ROS 2 之間的主要區別。
  3. 什麼是 ROS 節點(Node)?說明節點在 ROS 系統中的作用。
  4. 描述 ROS 的發布(Publish)和訂閱(Subscribe)機制。
  5. 什麼是 Gazebo?它與 ROS 有什麼關係?
  6. 如何在 Gazebo 中使用「無頭模式」執行模擬?
  7. 什麼是 TurtleBot3?簡述其主要應用場景。
  8. OpenCR 控制板在 TurtleBot3 系統中扮演什麼角色?
  9. 什麼是 SLAM?它在機器人導航中的作用是什麼?
  10. 什麼是 URDF?解釋在機器人模擬和建模中的重要性.

#測驗答案

  1. ROS (Robot Operating System) 是一個開放原始碼的機器人軟體框架。它提供工具和函式庫,簡化機器人軟體的開發、測試和部署,並促進機器人系統的模組化和重用。
  2. ROS 1 主要使用 C++03 和 Python 2,依賴自定義的序列化和傳輸機制,而 ROS 2 則基於 C++11/14 和 Python 3,並透過中介軟體介面支援 DDS 標準,提供更強大的即時性和可靠性。ROS2 在平台支援度和編譯系統上也做了許多改進。
  3. ROS 節點是一個執行特定任務的獨立進程。節點通過 ROS 的通信機制(如主題、服務)與其他節點交換訊息,共同構成一個完整的機器人系統,實現複雜的功能。
  4. 在 ROS 中,發布(Publish)是指節點向指定主題(Topic)發送訊息,而訂閱(Subscribe)是指節點接收來自特定主題的訊息。這種機制實現了節點間的非同步通信,使節點可以獨立運作並響應事件。
  5. Gazebo 是一個強大的 3D 機器人模擬器。在 ROS 中,Gazebo 用於創建逼真的虛擬環境,模擬機器人的行為和感測器數據,以便在實際部署前測試和驗證機器人軟體。
  6. 在 Gazebo 中,無頭模式(headless mode)是指在沒有圖形使用者介面 (GUI) 的情況下運行模擬。這可以節省資源,特別是在伺服器上運行模擬時,減少對系統中支援 OpenGL 渲染的顯示卡依賴,並加速模擬。
  7. TurtleBot3 是一個小巧、模組化且低成本的 ROS 機器人平台。它被廣泛應用於教學、研究和開發,可用於 SLAM、導航、自主駕駛等多種機器人應用。
  8. OpenCR 控制板是 TurtleBot3 的核心元件,用於控制馬達、感測器等硬體。它提供 ROS 介面,使 ROS 節點可以控制機器人的底層硬體,實現運動控制、感測器數據採集等功能。
  9. SLAM(Simultaneous Localization and Mapping)是一種演算法,用於同時建立環境地圖並估計機器人自身的位置。在機器人導航中,SLAM 使機器人能夠在未知環境中自主導航,建立環境地圖並定位自身。
  10. URDF (Unified Robot Description Format) 是一種 XML 格式,用於描述機器人的物理屬性,例如連桿、關節和幾何形狀。它在機器人模擬和建模中非常重要,因為它提供了機器人的結構信息,可以被 Gazebo 等模擬器使用,以創建逼真的機器人模型。

#論文題型

  1. 比較 ROS 1 和 ROS 2 的架構,並討論遷移到 ROS 2 的優勢和挑戰。
  2. 描述如何在 ROS 中使用 Gazebo 進行機器人模擬,並討論優化模擬效能的方法。
  3. 分析 TurtleBot3 平台的硬體和軟體架構,並探討其在教育和研究中的應用。
  4. 詳細說明 SLAM 算法在 ROS 中的實現,並比較不同的 SLAM 算法及其適用場景。
  5. 探討 ROS 在自動駕駛領域的應用,並討論 ROS 如何與其他自動駕駛技術(如感知、規劃、控制)集成。

#關鍵詞彙表

  • ROS (Robot Operating System)(機器人作業系統): 一個開放原始碼的機器人軟體框架,提供工具和函式庫簡化機器人軟體的開發。
  • Gazebo (模擬器): 一個 3D 機器人模擬器,用於創建和模擬機器人的物理環境。
  • Node (節點): ROS 系統中的一個獨立執行單元,負責執行特定的任務。
  • Topic (主題): ROS 中節點之間進行訊息傳遞的管道。
  • Publisher (發布者): 向特定主題發送訊息的節點。
  • Subscriber (訂閱者): 接收來自特定主題訊息的節點。
  • Service (服務): ROS 中節點之間進行請求-回應通信的機制。
  • Message (訊息): 在 ROS 節點之間傳遞的數據。
  • ROS 1: ROS 的第一個主要版本,主要基於 C++03 和 Python 2。
  • ROS 2: ROS 的第二個主要版本,基於 C++11/14 和 Python 3,具有更強大的即時性和可靠性。
  • TurtleBot3: 一個小巧、模組化且低成本的 ROS 機器人平台。
  • OpenCR: ROBOTIS 開發的開源控制板,用於控制機器人的硬體。
  • SLAM (Simultaneous Localization and Mapping)(即時定位與地圖構建): 一種演算法,用於同時建立環境地圖並估計機器人自身的位置。
  • Navigation (導航): 機器人在環境中自主移動到目標位置的過程。
  • URDF (Unified Robot Description Format)(統一機器人描述格式): 一種 XML 格式,用於描述機器人的物理屬性。
  • Xacro (XML Macro)(XML 巨集): 一種用於簡化 URDF 文件編寫的巨集語言。
  • Rviz (3D 可視化工具): ROS 的 3D 可視化工具,用於顯示機器人模型、感測器數據和地圖。
  • tf (TransForm) (變換): ROS 中的坐標變換庫,用於管理和計算不同坐標系之間的關係。
  • catkin: ROS 的建構系統,用於編譯和管理 ROS 套件。
  • Colcon: ROS2 的建構系統, 取代 catkin.
  • SDF (Simulation Description Format): Gazebo 用於描述世界和模型的 XML 格式。
  • ament: ROS2 的建構系統, 除 CMake 外, 亦支援其他編譯系統.
  • ros1_bridge: 用於在 ROS1 和 ROS2 之間進行通訊的 ROS 套件。

祝您學習順利!

Xacro (XML Macro) 格式 編寫工具及流程介紹

 在 ROS + Gazebo 環境中,使用 Xacro (XML Macro) 格式來編寫機器人模型能夠提高可讀性與可重用性。

下面將介紹 Xacro 編寫工具、開發流程與轉換 URDF 的步驟。


1. Xacro 編寫工具

在撰寫 Xacro (.xacro) 文件時,可以使用以下工具:

(1)文本編輯器

你可以使用任何文字編輯器來撰寫 Xacro 文件:

  • VS Code(推薦) → 可安裝 ROS Extension 來支援語法高亮。
  • Sublime Text → 輕量級編輯器,適合快速修改。
  • Vim / Nano → 適用於終端操作。

(2)Gazebo 與 RViz

這兩個工具可以幫助你可視化機器人的 Xacro / URDF 模型:

  • Gazebo:用於物理模擬,測試機器人的行為。
  • RViz:用於可視化機器人模型的結構和狀態。

(3)URDF / Xacro 轉換與檢查工具

  • 檢查 Xacro 文件是否正確
    bash
    ros2 run xacro xacro --check myrobot.xacro
  • 轉換 Xacro 為 URDF
    bash
    ros2 run xacro xacro myrobot.xacro > myrobot.urdf
  • 檢視 URDF 結構
    bash
    check_urdf myrobot.urdf
  • 在 RViz 渲染 URDF
    bash
    ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf

2. Xacro 編寫與轉換流程

(1)建立 Xacro 文件結構

通常一個機器人的 Xacro 檔案會有以下結構:

bash
myrobot_description/ │── urdf/ │ │── myrobot.xacro # 主 Xacro 檔案 │ │── macros.xacro # 儲存 Xacro 巨集函式 │ │── materials.xacro # 機器人材質定義 │ │── myrobot.gazebo # Gazebo 相關配置 │── meshes/ │ │── myrobot.dae # 3D 模型文件 │── launch/ │ │── display.launch.py # RViz 渲染 │ │── gazebo.launch.py # Gazebo 模擬啟動

(2)撰寫 myrobot.xacro

Xacro 主要由 <link>、<joint>、<xacro:macro> 等組成,示例如下:

xml
<?xml version="1.0"?> <robot name="myrobot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <!-- 引入其他 Xacro 文件 --> <xacro:include filename="$(find myrobot_description)/urdf/macros.xacro"/> <xacro:include filename="$(find myrobot_description)/urdf/materials.xacro"/> <!-- 定義機器人底盤 --> <link name="chassis"> <visual> <geometry> <box size="0.5 0.3 0.1"/> </geometry> <material name="blue"/> </visual> </link> <!-- 左右輪 --> <xacro:wheel name="left_wheel" joint="left_wheel_joint" /> <xacro:wheel name="right_wheel" joint="right_wheel_joint" /> </robot>

(3)撰寫 macros.xacro(巨集)

Xacro 允許自定義巨集函式,可以簡化重複的 link 或 joint 定義:

xml
<xacro:macro name="wheel" params="name joint"> <link name="${name}"> <visual> <geometry> <cylinder radius="0.05" length="0.02"/> </geometry> </visual> </link> <joint name="${joint}" type="continuous"> <parent link="chassis"/> <child link="${name}"/> <origin xyz="0 0 0" rpy="0 0 0"/> <axis xyz="0 1 0"/> </joint> </xacro:macro>

這樣就能用:

xml
<xacro:wheel name="left_wheel" joint="left_wheel_joint"/> <xacro:wheel name="right_wheel" joint="right_wheel_joint"/>

來簡化模型,而不需要手動寫多次 link 和 joint。


(4)轉換 Xacro 成 URDF

當 Xacro 編寫完成後,執行:

bash
ros2 run xacro xacro myrobot.xacro > myrobot.urdf

來轉換成 URDF 格式。

如果轉換成功,可以使用以下指令檢查 URDF:

bash
check_urdf myrobot.urdf

(5)在 Gazebo 或 RViz 測試

如果 URDF 正確,接下來可以在 Gazebo 或 RViz 測試:

在 RViz 渲染

bash
ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf

在 Gazebo 模擬

bash
ros2 launch gazebo_ros gazebo.launch.py

然後將 myrobot.urdf 加入 Gazebo 來測試模擬環境。


3. Xacro 開發流程總結

✅ 1. 設計機器人模型

  • 繪製機器人的結構,決定 link 和 joint。

✅ 2. 撰寫 Xacro

  • 定義 myrobot.xacro,使用 <xacro:macro> 優化重複部分。
  • 引入 materials.xacro、macros.xacro、myrobot.gazebo。

✅ 3. 轉換成 URDF

bash
ros2 run xacro xacro myrobot.xacro > myrobot.urdf check_urdf myrobot.urdf

✅ 4. 在 Gazebo / RViz 測試

bash
ros2 launch urdf_tutorial display.launch.py model:=myrobot.urdf ros2 launch gazebo_ros gazebo.launch.py

✅ 5. 進行調整

  • 修改 Xacro 文件,重複執行 (步驟 3 ~ 4) 測試。

4. 其他 Xacro 進階技巧

  • 使用 arg 參數化模型

    xml
    <xacro:property name="wheel_radius" value="0.05"/> <xacro:property name="wheel_length" value="0.02"/>

    這樣可以統一修改機器人某些屬性。

  • 條件判斷

    xml
    <xacro:if value="${use_sensor}"> <sensor type="camera"> ... </sensor> </xacro:if>

    允許根據變數來決定是否加入某些元件。


結論

  • Xacro 讓 URDF 更有結構化,避免重複編寫程式碼。
  • 利用 Xacro 巨集(<xacro:macro>)可以簡化 link 和 joint 的定義。
  • 開發流程:
    1. 撰寫 Xacro
    2. 轉換 URDF
    3. 測試與調整(Gazebo / RViz)
  • 工具推薦:
    • VS Code + ROS Extension(開發)
    • Gazebo / RViz(可視化)
    • Xacro 轉換工具(檢查與轉換)

ROS 中 SDF vs URDF 應用說明

在 Robot Operating System (ROS) 中,SDF (Simulation Description Format) 和 URDF (Unified Robot Description Format) 是兩種用來描述機器人的模型格式。兩者的主要區別如下:


1. URDF (Unified Robot Description Format)

URDF 是 ROS 主要用來描述機器人的 XML 格式。它定義了機器人的結構、連結 (links)、關節 (joints) 以及慣性、碰撞、視覺模型等資訊。

URDF 主要特點

  • 主要用於 ROS 生態系統,特別是 RViz (可視化) 和 MoveIt! (運動規劃)。
  • 簡單且輕量,適用於大多數機器人應用。
  • 支援關節限制 (joint limits)、慣性 (inertial properties)、碰撞模型 (collision)、視覺模型 (visual)。
  • 透過 xacro(XML Macro)簡化模型建立,提高可讀性與重複使用性。
  • 不支援 高級物理屬性,例如摩擦係數、彈性等。

URDF 使用範例

xml
<robot name="simple_robot"> <link name="base_link"> <visual> <geometry> <box size="1 1 1"/> </geometry> <material name="blue"/> </visual> </link> </robot>

2. SDF (Simulation Description Format)

SDF 是 Gazebo 模擬器主要使用的機器人描述格式。它提供比 URDF 更完整的機器人建模能力,特別是在物理模擬方面。

SDF 主要特點

  • 更強大的物理引擎支持,包括 摩擦力、彈性、流體動力學、光照屬性等。
  • 支援多機器人模擬(URDF 只能描述單一機器人)。
  • 更靈活的坐標系統,允許自由定義連結與關節的座標。
  • 多版本支持(比 URDF 更靈活)。
  • 適用於 Gazebo,但不像 URDF 那樣深度集成到 ROS。

SDF 使用範例

xml
<robot name="simple_robot"> <link name="base_link"> <visual> <geometry> <box> <size>1 1 1</size> </box> </geometry> </visual> <collision> <geometry> <box> <size>1 1 1</size> </box> </geometry> </collision> </link> </robot>

3. URDF vs. SDF 比較

特性URDFSDF
主要用途ROS (RViz, MoveIt!)Gazebo 模擬
支援的模擬特性基本的物理屬性(慣性、碰撞)進階物理屬性(摩擦、彈性、流體)
多機器人支持不支援支援
語法靈活性比較受限更靈活,支援更複雜的結構
擴展性透過 xacro 來提升可讀性支援內建多層次結構
座標系統受限於樹狀結構支援自由座標系統
Gazebo 支持需轉換成 SDF 格式原生支持

4. 何時使用 URDF 或 SDF?

  • 使用 URDF

    • 如果只在 ROS (RViz, MoveIt!) 進行視覺化或運動規劃。
    • 機器人模型較簡單,不需要進階物理屬性。
    • ROS 生態系統內的開發,如機器人導航、控制等。
  • 使用 SDF

    • 需要在 Gazebo 進行物理模擬。
    • 需要 更細緻的物理屬性(例如摩擦力、彈性等)。
    • 需要 模擬多台機器人 或 更複雜的場景。

5. URDF 轉換成 SDF

因為 Gazebo 使用 SDF,但 ROS 使用 URDF,所以經常需要轉換格式,這可以透過 gz sdf 或 gz urdf 指令來完成:

bash
gz sdf -p model.urdf > model.sdf

或使用 ROS 提供的插件:

bash
rosrun gazebo_ros spawn_model -file model.urdf -urdf -model my_robot

6. 總結

  • URDF 是 ROS 主要使用的機器人描述格式,適合視覺化與控制。
  • SDF 是 Gazebo 主要使用的模擬格式,支援更強的物理屬性與多機器人建模。
  • 如果需要同時使用 ROS 與 Gazebo,通常先寫 URDF,然後轉換成 SDF。

SolidWorks 的外掛程式(SW2URDF)

 SW2URDF 是一個 SolidWorks 的外掛程式,可以方便地將 SolidWorks 的零件和組合件匯出為 URDF (Unified Robot Description Format) 檔案。

URDF 是一種 XML 格式,用於描述機器人的結構和屬性,常用於 ROS (Robot Operating System) 專案中。


以下為 SW2URDF 的使用教學:

•安裝 SW2URDF

1.首先,需要從參考網站下載 SW2URDF 的安裝檔案。

2.下載後,直接執行安裝檔案即可。安裝過程非常快速。

3.安裝完成後,開啟 SolidWorks,應該會在「工具」選單中看到新增的「Export as URDF」選項。

•設定父子關係

1.開啟想要轉換的 SolidWorks 檔案。

2.加入 base_link 的座標。

▪新增一個平面,並在上面繪製輔助線或點,以便後續將座標軸放置於其上。

3.加入其他 Link 的座標。

▪使用前一步驟的方法找出所有需要的座標。

▪有些教學影片可能會直接跳過此步驟,讓系統自動計算其他軸的座標軸,但若系統自動計算錯誤,則需要自行加入座標。

4.設定成可輸出至 ROS package 的格式。

▪選擇「工具」>「File」>「Export as URDF」。

▪設定 base_link:

•在 「Link Components」中選擇底座。

•在 「Coordinate System」 中選擇剛剛設定的座標軸。

•將 「Number of child links」 改為 1。

▪此時會看到樹狀圖中多了一個 Empty_Link。

▪點選 Empty_Link。

•設定 「Link Name」 為 Link_1。

•設定 「Joint Name」 為 Joint_1。

•在 「Link Components」 中選擇馬達 1 和 S and F。


•參考網站

◦sw_urdf_exporter:用於下載及安裝 SW2URDF。

◦Exporting URDFs Directly From Solidworks:SW2URDF 使用教學。

◦Creating URDF model for 4 DOF arm robot:四軸手臂的父子關係設定。


重點提示:

•URDF (Unified Robot Description Format) 是用來描述機器人結構的 XML 檔案格式。

•SW2URDF 可以將 SolidWorks 設計轉換為 URDF 格式,方便在 ROS 環境中使用。

•設定父子關係時,需要為每個 link 加入座標軸,並正確設定 link 和 joint 的名稱和連接關係。

•如果系統自動計算座標錯誤,則需要手動加入座標。


這個工具主要用於將在 SolidWorks 中設計的機器人模型導入 ROS 和 Gazebo 等環境中進行模擬和控制。

透過這些步驟,你可以將 SolidWorks 中的機器人模型轉換為 URDF 檔案,方便後續在 ROS 專案中使用.


SDF (Simulation Description Format) XML格式

SDF (Simulation Description Format) 是一種用於描述模擬環境、機器人和其他物件的 XML 格式。

#以下是關於 SDF 格式的說明:

•基本結構:每個 SDF 檔案都以 <sdf> 標籤開始,並以 </sdf> 標籤結束。在 <sdf> 標籤內,可以定義一個或多個 <world> 標籤,每個 <world> 標籤代表一個模擬世界。

•版本:SDF 檔案的開頭會定義 XML 和 SDF 的版本。例如:

•世界定義:<world> 標籤用於定義模擬世界,包括其名稱、物理特性和視覺效果。

◦名稱:<world> 標籤的 name 屬性用於指定世界的名稱。例如:<world name='world_demo'>。

◦物理特性:<physics> 標籤用於定義世界的物理引擎和相關參數。可以選擇不同的物理引擎,例如 Dart, Ode, Bullet, Simbody 等。

▪<physics type='ode' name='1ms'>

◦視覺效果:可以使用 <scene> 標籤來設定環境光 (ambient_light) 和背景顏色 (background_color)。

▪也可以用 <camera> 標籤來設定相機的 x, y, z 位置。


•模型:

◦定義:<model> 標籤用於定義模擬世界中的物件,包括機器人、靜態物體等。

◦載入:可以從 Gazebo Fuel 網站載入模型,並將其貼在 world 標籤內。也可以將模型下載到本地,然後在 SDF 檔案中引用。

◦位置:可以使用 <pose> 標籤來設定模型在世界中的位置和方向。


▪例如:

◦連結 (Link):使用 <link> 標籤來描述物件的實體部分,像是機器人的手臂或輪子。視覺 (visual) 標籤則是用來定義物件在軟體介面中的外觀。

•插件 (Plugins):SDF 格式允許使用插件來擴展模擬功能。

◦World Control 插件:用於控制世界,包括暫停/播放按鈕,顯示模擬時間和實際時間。

◦WorldStats 插件:用於顯示世界訊息,如模擬時間 (sim_time),實際時間 (real_time),模擬/實際時間比例 (real_time_factor),和迭代次數 (iterations)。


#其他標籤:

◦state: 插件狀態,可用 docked 固定在定點,或是用 floating 浮動

◦render_engine: 渲染引擎可選 ogre 或 ogre2

◦stats_topic: 負責世界訊息統計 (模擬時間與實際時間) 的標題

◦start_paused: 若為 true 則 Gazebo 啟動時預設為暫停模擬狀態。


#使用方法:

◦可以透過指令 $ gz sim <sdf_file_name>.sdf 來啟動模擬。

◦使用 VSCode 等程式碼編輯器來編輯 SDF 檔案。

◦可以使用 gz topic -e -t /world/<world_name>/stats 指令監看世界訊息。

總結來說,SDF 格式提供了一個靈活且可擴展的方式來描述模擬環境,它可以定義世界的物理特性、

視覺效果和模型,並使用插件來擴展功能。它在 ROS 和 Gazebo 中被廣泛使用,以實現機器人模擬。

在 ROS package 中建立 Python node 的方法

 在 ROS package 中建立 Python node 的方法,可以參考以下步驟:

1.建立 ROS Package: 首先,你需要建立一個 ROS package。你可以使用 catkin_create_pkg 指令來創建一個新的 package,並指定相依套件。例如,創建一個名為 my_tutorial 的 package,相依於 rospy 和 std_msgs:

2.

3.建立 Python 節點檔案: 在 package 的 src 資料夾中,建立一個新的 Python 節點檔案,例如 hello_ros.py [你]。

4.撰寫 Python 節點程式碼: 使用文字編輯器打開 hello_ros.py 檔案,並加入以下程式碼:

◦第一行 #!/usr/bin/env python3 指定此腳本使用 Python3 執行。

◦import rospy 導入 ROS Python 函式庫.

◦rospy.init_node('hello_ros_node', anonymous=True) 初始化 ROS 節點,並命名為 hello_ros_node。

◦rospy.loginfo("Hello ROS from Python!") 輸出訊息到 ROS logger。


5.設定執行權限: 確保你的 Python 腳本具有執行權限。你可以使用以下指令:

6.設定 CMakeLists.txt: 打開 package 中的 CMakeLists.txt 檔案,加入以下程式碼來定義如何編譯節點:

◦find_package 尋找 catkin 以及其相依的套件,例如 rospy 和 std_msgs。

◦catkin_package() 宣告此 package 是一個 catkin package。

◦install(PROGRAMS ...) 安裝你的 Python 節點腳本。

7.加入相依套件: 如果你的節點有使用到其他 ROS 套件,你需要在 package.xml 檔案中加入相依套件的宣告。例如,如果你的節點有使用到 rospy,你需要加入:

8.編譯 Package: 回到工作空間的最上層目錄,使用 catkin_make 指令來編譯 package:

9.設定環境變數: 每次開啟新的終端機時,需要設定 ROS 環境變數,讓系統知道你的工作空間位置。你可以執行以下指令:

10.或者,你可以將此指令加入 ~/.bashrc 檔案,使其在每次開啟終端機時自動執行。

11.執行節點: 使用 rosrun 指令來執行你的 Python 節點:

12.注意: 在執行任何節點之前,你需要先啟動 roscore (ROS Master)。

13.或者, 如果你使用 roslaunch 來啟動節點,roslaunch 會自動啟動 roscore,你就不必手動啟動它。


其他注意事項:

•節點名稱: 在 rospy.init_node() 中,你需要指定一個節點名稱。確保這個名稱在你的 ROS 系統中是唯一的。

如果你不希望節點名稱重複,可以加入 anonymous=True 參數,ROS 會自動為節點產生唯一的名稱。

•使用 rostopic: 你可以使用 rostopic 指令來查看節點發佈或訂閱的話題,以及訊息內容。

•訊息 (Messages):ROS 節點之間透過訊息進行溝通。

你可以使用 std_msgs 等套件中定義的標準訊息類型,也可以自定義訊息類型。

•多個回呼函式 (Callback function): 如果你想讓同一個訂閱的 Topic 給多個函式使用,你可以宣告多個 rospy.Subscriber 物件,

  並為每個物件指定不同的回呼函式 [你]。

•參數化: 你可以使用 rospy.get_param() 來讀取 ROS 參數伺服器中的參數值,從而在程式中實現參數化。

•使用 launch 檔案: 你可以使用 launch 檔案來啟動多個節點,並設定它們的參數和 remap 設定。


總結來說,建立 Python ROS 節點需要創建一個 ROS package、編寫 Python 腳本、設定執行權限、

設定 CMakeLists.txt、加入相依套件、編譯 package,最後使用 rosrun 來執行節點。