welcom ! Handel home

2025年2月5日 星期三

(兩輪小車範例)解析 left_wheel (左輪) 定義

 

📌 解析 left_wheel (左輪) 定義

這段 <link name="left_wheel"> 定義了機器人的 左輪,包含:

  1. 碰撞體 (collision):物理模擬中的碰撞區域。
  2. 可視化模型 (visual):Gazebo / RViz 中的渲染外觀。
  3. 慣性 (inertial):影響物理模擬的質量與轉動慣量。

🔍 詳細解析

1️⃣ collision (碰撞模型)

<collision name="collision"> <origin xyz="0 0 0" rpy="0 1.5707 1.5707"/> <geometry> <cylinder radius="0.1" length="0.05"/> </geometry> </collision>

📌 作用

  • 定義一個 半徑 0.1m、長度 0.05m 的圓柱形 碰撞區域
  • rpy="0 1.5707 1.5707"(旋轉 90°):
    • 1.5707 = π/2(90°),這將圓柱側放成輪子的形狀

📌 為什麼這樣設置?

  • Gazebo 物理模擬 中,輪子實際是圓柱體。
  • 預設情況下,圓柱的軸朝 z,但車輪需要沿 y 軸旋轉,所以我們讓它繞 x 旋轉 90°,再繞 y 旋轉 90°,這樣就能讓圓柱變成「車輪」方向。

2️⃣ visual (外觀模型)

<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>

📌 作用

  • collision 相同,這段程式碼定義了左輪在 Gazebo / RViz外觀模型
  • 這裡的 <geometry> 也使用 圓柱 (cylinder) 來代表輪子,尺寸與碰撞模型一致:
    • radius="0.1" → 半徑 10cm
    • length="0.05" → 厚度 5cm

🚀 這裡的 visual 只影響 Gazebo/RViz 顯示,不影響物理模擬


3️⃣ inertial (質量與慣性)

<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>

📌 作用

  • mass value="5" → 左輪的質量為 5kg
  • cylinder_inertia m="5" r="0.1" h="0.05"
    • 這是 Xacro 巨集 (macro)
    • 它會計算並填入適當的慣性張量 (ixx, iyy, izz)。

4️⃣ cylinder_inertia 巨集計算

macros.xacro 文件中,我們定義了 cylinder_inertia

<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>

根據 m=5kgr=0.1mh=0.05m 代入:

ixx = iyy = (5 * (3 * 0.1^2 + 0.05^2) / 12) = 0.0131 izz = (5 * 0.1^2 / 2) = 0.025

所以 真正的慣性數值應該是

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

但是目前的代碼是:

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

這代表:

  • 可能 沒有使用 cylinder_inertia 計算,而是手動設定(不合理)。
  • 建議修改成 cylinder_inertia 的計算結果,以符合物理模擬

✅ 這段代碼的總結

部分作用細節
collision (碰撞體)物理碰撞圓柱 (radius=0.1, length=0.05),旋轉 90° 變成輪子方向
visual (外觀)Gazebo / RViz 顯示collision 相同,影響機器人外觀
inertial (慣性張量)物理模擬質量 5kg,應該使用 cylinder_inertia 計算慣性

🚀 建議修改

1️⃣ 修正 inertia

目前的 inertia 手動設定為 1.0,但應該用 cylinder_inertia 自動計算:

修改前

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

修改後

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

這樣會自動計算並填入正確的 ixxiyyizz 值。


2️⃣ 確保 rpy 旋轉方向正確

目前的 rpy="0 1.5707 1.5707"

  • 如果輪子方向不對,可能只需要 旋轉 90° (1.5707) 或 -90° (-1.5707)

可以測試:

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

這樣可能會讓輪子與底盤對齊更自然。


🎯 總結

這段 <link name="left_wheel"> 代碼為機器人的左輪,主要:

  • 使用 cylinder 作為碰撞體與可視化模型
  • 旋轉 90° 讓圓柱變成輪子
  • 質量為 5kg,但慣性數據可能需要修正
  • 應該用 cylinder_inertia 計算正確的 inertia,而不是手動設定 1.0
=================================================

  <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>



沒有留言: