2025年6月25日 星期三

ROS2 gazebo_ros 安裝確定

 ros2 service list | grep spawn_entity 

 沒看到 /spawn_entity 出現

/spawn_entityGazebo (gzserver) 在載入 libgazebo_ros_factory.so plug-in 

之後才會向 ROS 2 公布的服務—如果你在 ros2 service list 裡完全看不到它,

就表示 Gazebo 端根本沒跑,或 plug-in 沒被載入



為什麼會消失?

成功條件發生的位置
gzserver 正在跑gazebo.launch.py (或你自行呼叫 gzserver)啟動
libgazebo_ros_init.so + libgazebo_ros_factory.so 這兩個 plug-in 有被 gzserver 帶起來plug-in 讓 Gazebo 把 ROS 2 節點和 /spawn_entity 服務「注入」進模擬器answers.ros.org
你的 launch 流程 啟動 Gazebo, 呼叫 spawn_entity.py官方範例 gazebo.launch.py 就做了正確的排序docs.ros.org

若其中任何一步漏掉,就會得到 Waiting for service /spawn_entity …Was Gazebo started with GazeboRosFactory? 這類訊息get-help.theconstruct.ai

快速驗證三步驟

bash
# 1️⃣ 只開 Gazebo,確定服務真的出現 ros2 launch gazebo_ros gazebo.launch.py # 這一步會同時帶 GUI ros2 service list | grep spawn_entity # 應該要看到 /spawn_entity # 2️⃣ 如果還是沒有 → 可能 plug-in 沒裝好 sudo apt install ros-humble-gazebo-ros-pkgs # 重新確認有安裝到 plug-in ls /opt/ros/humble/lib | grep libgazebo_ros_factory.so # 應該要有檔案 # 3️⃣ 手動測:不跑 GUI 也行 gzserver -s libgazebo_ros_init.so -s libgazebo_ros_factory.so ros2 service list | grep spawn_entity # 仍應該出現

只要第 1 步能看到 /spawn_entity,你就可以在另一個終端跑 ros2 run gazebo_ros spawn_entity.py … 測試模型能不能進來。


修改你自己的 display.launch.py

Gazebo 先拉進同一個 launch,確保順序正確。典型寫法 (最小可運作範例):

python
from launch import LaunchDescription from launch_ros.actions import Node from launch.actions import IncludeLaunchDescription from launch.launch_description_sources import PythonLaunchDescriptionSource from ament_index_python.packages import get_package_share_directory import os def generate_launch_description(): # ➊ 啟動 Gazebo(會自帶 libgazebo_ros_* plug-ins) gazebo = IncludeLaunchDescription( PythonLaunchDescriptionSource( os.path.join(get_package_share_directory('gazebo_ros'), 'launch', 'gazebo.launch.py') ), # 可以在這裡傳 world:=xxx 或 gui:=false 等參數 ) # ➋ 等 Gazebo 起來再呼叫 spawn_entity.py spawn_entity = Node( package='gazebo_ros', executable='spawn_entity.py', arguments=[ '-entity', 'roscar', '-file', os.path.join(get_package_share_directory('roscar4wheel2'), 'urdf', 'roscar.urdf'), '-x', '0', '-y', '0', '-z', '0.1' ], output='screen' ) return LaunchDescription([gazebo, spawn_entity])

重點:把 gazebo 放在 list 前面,使它比 spawn_entity 先啟動;spawn_entity 自己會等待 /spawn_entity 服務最多 30 秒。


如果還是失敗

  1. 檢查 plug-in 路徑
    echo $GAZEBO_PLUGIN_PATH 應該包含 /opt/ros/humble/lib;若沒有,試 source /usr/share/gazebo/setup.sh 或把這行加進 ~/.bashrc

  2. 混用多個 Gazebo/ROS 版本 可能導致 libprotobuf 之類相依衝突;重新安裝 ros-humble-gazebo-ros-pkgs 或用 apt/conda 同源版本可避免這現象robotics.stackexchange.com

  3. 啟動次序競爭:若你在同一個 LaunchDescription 內已經有 Gazebo,但 spawn_entity 仍然先報等待服務,可以在 spawn_entity 加上 delay 或用 OpaqueFunction 搭配 ExecuteProcess 做顯式先後。


接下來怎麼做?

  • 先試 「只開 Gazebo → 檢查 /spawn_entity → 再 spawn」 的最小流程, 確定環境與 plug-in 正常。

  • 然後把上面的 launch 範例貼進你的 roscar4wheel2 套件裡,重新 colcon buildsource install/setup.bashros2 launch roscar4wheel2 display.launch.py

若還有問題,把 新的完整 log你的 display.launch.py 內容 貼上來,

我可以再幫你對症下藥。

沒有留言:

張貼留言