2025年6月30日 星期一

Joint by URDF 關節 定義說明

right_front_wheel_joint 的 URDF 定義如下:

xml
<joint name="right_front_wheel_joint" type="continuous"> <!-- 使用continuous --> <parent link="body_car"/> <child link="body_right_front_wheel"/> <origin xyz="0.1 0.1 -0.05" rpy="0 0 1.5708"/> <!-- 近似位置 --> <axis xyz="0 0 1"/> <!-- 定義關節的旋轉軸向 --> </joint>

🔍 分析說明

項目說明
type="continuous"適用於輪子這類可自由旋轉、不設上限角度的關節。常見於差速驅動車。
origin rpy="0 0 1.5708"表示車輪的朝向做了 Z 軸旋轉 90 度(1.5708 rad),這是必要的前處理,但也可能代表幾何方向與旋轉軸需要額外檢查。
<axis xyz="0 0 1"/>表示輪子旋轉軸朝向 Z 軸。但這通常不正確,除非車輪垂直裝在地上旋轉,正常輪子應繞 Y 軸旋轉(左右轉動)

✅ 建議修正方式

若以車輪位於地面、並朝著前方滾動的正常輪子方向為準,則其旋轉軸應為:

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

若你已透過 <origin rpy="0 0 1.5708"/> 將輪子模型朝向轉了 90 度,則也需要讓 axis 對應變為 X 軸旋轉

✅ 正確範例(若模型輪子原本是 Y 軸方向)

xml
<joint name="right_front_wheel_joint" type="continuous"> <parent link="body_car"/> <child link="body_right_front_wheel"/> <origin xyz="0.1 0.1 -0.05" rpy="0 0 0"/> <!-- 輪子模型直接朝 X --> <axis xyz="0 1 0"/> <!-- 車輪繞 Y 軸旋轉(常見設定) --> </joint>

✅ 更強健方式:直接觀察 STL 模型方向

若你不確定你的 wheel.stl 是哪個方向:

  1. 載入至 RViz 或 Blender 觀察模型方向。

  2. 假如輪子的圓心是繞 Y 軸轉動,那 axis 設 Y 軸(0 1 0)即可。

  3. 如果你模型旋轉了 90 度(例如使用 <origin rpy="0 0 1.5708"/>),則你可能需修正軸為 (1 0 0)


⚙️ 額外建議

如要做成 Xacro 模板,建議將軸向與位姿參數化:

xml
<xacro:macro name="wheel_joint" params="name parent child xyz rpy axis"> <joint name="${name}" type="continuous"> <parent link="${parent}"/> <child link="${child}"/> <origin xyz="${xyz}" rpy="${rpy}"/> <axis xyz="${axis}"/> </joint> </xacro:macro>

這樣可靈活地定義四顆輪子的 joint。



Gemini API 有關圖形多模態的限制

 Gemini 系列模型中,支援 API 傳送圖形(即具有多模態功能)的主要模型有:

  1. Gemini 1.0 Pro Vision (或簡稱 Gemini Pro Vision):

    • 這是 Gemini 1.0 系列中支援視覺輸入的模型。它可以處理文字和圖片輸入,並生成文字回應。

    • 在許多情境下,它是處理多模態任務的常用選擇。

  2. Gemini 1.5 Flash:

    • 如您在程式碼中使用的,這是 Gemini 1.5 系列中速度更快、效率更高的模型。它原生支援多模態輸入,包括圖片、音訊、影片和文字,並能生成文字回應。

    • 它專為需要低延遲、高效能的工作負載而設計,例如即時聊天機器人或代理服務。

  3. Gemini 1.5 Pro:

    • 這是 Gemini 1.5 系列中功能更強大、推理能力更強的模型。它同樣原生支援多模態輸入,適用於更複雜的程式編寫、推理和多模態理解任務。

    • 雖然回應速度可能比 Flash 略慢,但在需要深度思考和高準確度時表現更佳。

總結來說,目前透過 Gemini API 支援圖像輸入的推薦模型包括:

  • Gemini 1.5 Flash (推薦用於速度和效率,您目前正在使用的模型)

  • Gemini 1.5 Pro (推薦用於更複雜的推理和理解)

  • Gemini 1.0 Pro Vision (較早期的版本,但仍支援視覺)

支援的圖片 MIME 類型包括:

  • image/png

  • image/jpeg

  • image/webp

  • image/heic

  • image/heif

您可以根據您的應用場景和對模型效能、成本的需求來選擇最適合的 Gemini 模型。在 Google AI Studio 中,您可以方便地測試和選擇這些模型。

2025年6月27日 星期五

ROS2 啟動文件 (Launch File)要點 get_package_share_directory and URDF

 在「啟動文件 (Launch File)」的更大背景脈絡下,來源對 get_package_share_directory 函數提供了詳細的看法,強調了它在 ROS2 應用中管理和定位資源檔案的關鍵作用。


get_package_share_directory (通常是 FindPackageShare 的一種表達) 是 ROS2 Python 啟動文件中一個非常重要的功能。它的主要目的是 動態獲取指定 ROS2 套件的共享目錄路徑。這項功能對於在啟動時載入位於套件內部的資源檔案至關重要,這些資源檔案可能包括:
統一機器人描述格式 (URDF) 模型文件
Gazebo 世界文件 (.world)
RVIZ 配置檔案 (.rviz)
其他任何在啟動時需要被系統找到的資源檔案
這個函數的引入,解決了傳統上在腳本中硬編碼路徑的問題,提供了 一種跨平台和獨立於安裝位置的可靠路徑獲取方式。無論套件被安裝到何處(例如,不同的 ROS2 發行版路徑或自定義的工作空間中),它都能正確地找到共享資源
在啟動文件中的應用與細節
來源揭示了 get_package_share_directory 在 Python 啟動文件中的具體應用方式和相關考量:
模組導入:要使用此功能,通常需要從 launch_ros.actionslaunch.substitutions 等模組中導入 FindPackageShare (或類似的函數,如 get_package_share_directory 的底層實現)。例如,來源提到 FindPackageShare 是從 substitutions 庫中引入的
路徑建構get_package_share_directory 函數通常會與其他路徑處理函數(如 PathJoinSubstitution)結合使用,以構建指向特定資源檔案的完整路徑。例如,一個常見的模式是先用 FindPackageShare 找到套件的共享目錄,然後用 PathJoinSubstitution 將目錄路徑與檔案名(例如 urdf/model.urdf)連接起來
動態載入 URDF:在啟動文件中配置 robot_state_publisher 節點時,get_package_share_directory 被用來 動態獲取 URDF 檔案的路徑,以便 robot_state_publisher 能夠讀取並發布機器人的 TF 信息
Gazebo 模型路徑設定:此函數在配置 Gazebo 模擬時也扮演重要角色。例如,可以利用它獲取包含模型網格檔案的套件路徑,然後 將其添加到 GAZEBO_MODEL_PATH 環境變數中。這是非常重要的,因為 Gazebo 需要這些路徑才能找到並載入模型及其相關資源。如果模型不在 GAZEBO_MODEL_PATH 中,可能會導致錯誤或模型無法顯示
載入 RVIZ 配置:啟動 RVIZ 節點時,也可以使用 get_package_share_directory 來動態指定 .rviz 配置檔案的路徑,使得 RVIZ 能自動載入預設的視覺化設定
範例與實踐:在多個來源中,透過具體程式碼片段展示了如何在 display.launch.pystartworld.launch.py 等啟動文件中應用 get_package_share_directory 來定位 URDF、Gazebo 世界和 RVIZ 配置檔案
總體而言,get_package_share_directory 是 ROS2 Python 啟動文件中的一個基礎且不可或缺的工具,它提升了啟動檔案的靈活性、可移植性和可維護性,確保了 ROS2 系統能夠可靠地找到並利用分散在不同套件中的機器人資源

#================================
要在 Gazebo 中插入 URDF 模型進行模擬,需要準備特定的資料和遵循一系列的操作流程。
這包括 URDF 模型的內容定義、啟動文件的編寫,以及 ROS2 環境的正確配置與操作
以下是將 URDF 模型插入 Gazebo 進行模擬所需的資料和操作流程:
#[ 所需資料 ]
1.
URDF 模型文件 (.urdf.xacro):
基本結構:URDF 是一種 XML 文件,以 <robot> 標籤開始和結束,用於描述機器人的運動學、幾何形狀和物理特性
Xacro 是 URDF 的擴展,允許使用宏和數學運算來簡化複雜 URDF 文件的編寫和管理,推薦使用
鏈結 (Link) 定義:每個鏈結是機器人的一個剛體部分
視覺 (Visual)<visual> 標籤定義鏈結的外觀,包括幾何形狀(如 boxcylinderspheremesh)和材料(顏色、紋理)
碰撞 (Collision)<collision> 標籤定義鏈結的物理碰撞形狀
它對於計算物理碰撞至關重要。建議使用基本幾何形狀來減少計算負擔,而非直接使用網格(mesh),因為網格的計算成本較高
慣性 (Inertial)<inertial> 標籤定義鏈結的質量和慣性張量
這對於在 Gazebo 中準確模擬重力、力矩和動態行為是至關重要的。缺少或錯誤的定義會導致不真實的物理行為
原點 (Origin):定義鏈結相對於其父鏈結的平移和旋轉
關節 (Joint) 定義<joint> 標籤用於連接兩個鏈結,定義它們之間的運動關係
類型 (Type):例如 fixed(固定)、continuous(連續旋轉)、revolute(有限制旋轉)和 prismatic(直線移動)
父子鏈結 (Parent/Child Link):指定關節連接的父鏈結和子鏈結
軸 (Axis):定義關節的旋轉或移動軸
Gazebo 特定標籤<gazebo> 標籤用於為 Gazebo 模擬器提供額外的物理屬性(如材料、摩擦、剛度 kp, kd)和外掛(如差動驅動外掛)
材質:可以在 URDF 中指定 Gazebo 內建材質,為機器人鏈結添加顏色
外掛:例如 libgazebo_ros_diff_drive.so 差動驅動外掛,用於實現機器人的運動控制,並發布里程計和 TF
2.
Gazebo 世界文件 (.world):
定義 Gazebo 模擬環境,包括地面、光源和其他預設模型
3.
ROS2 啟動文件 (.launch.py.launch.xml):
目的:啟動多個 ROS2 節點、設定參數和管理多個程序
Python 啟動文件 (.launch.py):常用的啟動文件格式
導入模組:例如 LaunchDescription, Node, DeclareLaunchArgument, PathJoinSubstitution, FindPackageShare.
模型路徑定義:使用 FindPackageShare (或 get_package_share_directory) 和 PathJoinSubstitution 動態獲取 URDF 文件路徑,確保跨平台和安裝位置的可靠性
GAZEBO_MODEL_PATH 環境變數至關重要,確保 Gazebo 能找到模型。這通常在啟動文件中設定,將包含模型檔案的套件路徑添加到此環境變數中
如果模型不在這個路徑中,可能會導致錯誤或模型無法顯示
配置節點
robot_state_publisher:讀取 URDF 並發布機器人 TF (轉換框架) 信息
joint_state_publisher (可選 _gui):發布機器人各個關節的狀態信息,對於控制或視覺化關節非常有用
gazebo.launch.py:從 gazebo_ros 套件啟動 Gazebo 模擬器,並指定要載入的世界文件
spawn_entity.py:從 gazebo_ros 套件執行,用於將 URDF 模型實例化(生成)到 Gazebo 世界中。
需要提供模型名稱、URDF 內容(通常透過 robot_description 話題提供),以及初始位置和方向
4.
套件依賴 (package.xml):
確保在 package.xml 中聲明所有必要的依賴,例如 joint_state_publisherrobot_state_publisherrvizgeometry_msgsturtlesim (如果相關)
#[ 操作流程 ]
1.
創建 ROS2 工作空間 (Workspace):
在主目錄下創建一個資料夾,例如 ros2_ws
在其內部創建 src 資料夾:mkdir -p ros2_ws/src
導航至工作空間根目錄:cd ros2_ws
首次構建空工作空間:colcon build。這會生成 buildinstalllog 資料夾
2.
創建 ROS2 套件 (Package):
導航至 src 資料夾:cd src
使用 ros2 pkg create --build-type ament_python <package_name> 創建 Python 套件。例如 my_robot_controller
3.
設置套件結構和文件:
在你的套件資料夾內(例如 my_robot_controller),創建 launchurdf 等自定義資料夾,用於存放啟動文件和 URDF 模型文件
將編輯好的 URDF 模型文件(例如 my_robot.urdf)放入 urdf 資料夾
創建 Gazebo 世界文件(例如 my_world.world)並放入一個約定的資料夾(例如 worldsmodels
創建 Python 啟動文件(例如 start_simulation.launch.py)並放入 launch 資料夾
重要:將啟動文件設置為可執行chmod +x <launch_file.py>
4.
編輯啟動文件內容:
在你的啟動文件中,使用 FindPackageSharePathJoinSubstitution 來動態獲取 URDF 文件和世界文件的路徑
設定 GAZEBO_MODEL_PATH 環境變數,指向你的模型所在的資料夾
實例化並配置必要的 ROS2 節點:
gazebo.launch.py 來啟動 Gazebo 模擬器
robot_state_publisher 來發布機器人的 TF 信息
spawn_entity.py 來將 URDF 模型載入到 Gazebo 中,並指定模型的名稱、URDF 來源(通常是 robot_description 話題)和初始姿態
5.
聲明依賴並配置安裝:
package.xml 中添加所有必要的運行時依賴 (exec_depend) 和構建時依賴 (build_depend)
對於 C++ 套件:在 CMakeLists.txt 文件中,使用 install(DIRECTORY ... DESTINATION ...) 命令確保你的 launchurdf 和模型相關資料夾及其內容被正確安裝到 ROS2 環境中
對於 Python 套件:如果你的 URDF 或世界文件不被 setup.py 直接處理,仍可能需要在 CMakeLists.txt 中使用 install(DIRECTORY ...) 來確保它們被正確安裝
6.
構建套件 (Build the Package):
導航回工作空間的根目錄
運行 colcon build 命令來編譯你的套件
對於 Python 開發,可以使用 --symlink-install 選項,它允許你在不重新構建的情況下,即時運行對 Python 代碼的修改
7.
來源化工作空間 (Source the Workspace):
每次打開新的終端時,或在你修改套件後,都需要運行 source install/setup.bash 命令。這會將你的自定義套件添加到環境變數中,使 ROS2 系統能夠找到並運行它們。這稱為「Overlay」,它疊加在 ROS2 的全局安裝「Underlay」之上
8.
運行啟動文件:
在終端中運行命令:ros2 launch <package_name> <launch_file_name.launch.py>
例如:ros2 launch my_robot_controller start_simulation.launch.py
9.
驗證模型在 Gazebo 中顯示:
啟動文件成功運行後,應會彈出 Gazebo 模擬器窗口,你應該能夠看到你的 URDF 模型出現在預定義的世界中
如果在 Gazebo 中看不到模型,請檢查終端輸出的錯誤信息,特別是關於模型路徑或物理屬性的警告
透過以上步驟,你便能將 URDF 模型成功地載入到 Gazebo 模擬器中,並進行後續的測試與控制