ros2 service list | grep spawn_entity
沒看到 /spawn_entity 出現
/spawn_entity
是 Gazebo (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 |
快速驗證三步驟
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,確保順序正確。典型寫法 (最小可運作範例):
pythonfrom 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 秒。
如果還是失敗
-
檢查 plug-in 路徑
echo $GAZEBO_PLUGIN_PATH
應該包含/opt/ros/humble/lib
;若沒有,試source /usr/share/gazebo/setup.sh
或把這行加進~/.bashrc
。 -
混用多個 Gazebo/ROS 版本 可能導致 libprotobuf 之類相依衝突;重新安裝
ros-humble-gazebo-ros-pkgs
或用 apt/conda 同源版本可避免這現象robotics.stackexchange.com。 -
啟動次序競爭:若你在同一個
LaunchDescription
內已經有 Gazebo,但spawn_entity
仍然先報等待服務,可以在spawn_entity
加上delay
或用OpaqueFunction
搭配ExecuteProcess
做顯式先後。
接下來怎麼做?
-
先試 「只開 Gazebo → 檢查 /spawn_entity → 再 spawn」 的最小流程, 確定環境與 plug-in 正常。
-
然後把上面的 launch 範例貼進你的
roscar4wheel2
套件裡,重新colcon build
→source install/setup.bash
→ros2 launch roscar4wheel2 display.launch.py
。
若還有問題,把 新的完整 log 或 你的 display.launch.py
內容 貼上來,
我可以再幫你對症下藥。
沒有留言:
張貼留言