ROS2 Galactic下turtlebot3_gazebo卡住?手把手教你解决spawn_entity报错
最近在Ubuntu 20.04上折腾ROS2 Galactic,想跑一下经典的turtlebot3_gazebo仿真,结果一运行ros2 launch,Gazebo界面是弹出来了,但那个期待中的仿真世界却死活加载不出来,终端里赫然躺着几行刺眼的[spawn_entity.py-4] [ERROR]。相信不少刚接触ROS2机器人仿真的朋友都遇到过这个拦路虎——spawn_entity服务调用失败,导致整个仿真启动流程卡在半路。这不仅仅是turtlebot3_gazebo的问题,它背后反映的是ROS2与Gazebo集成时一个非常典型的环境配置陷阱:Gazebo模型路径(GAZEBO_MODEL_PATH)缺失或设置不当。今天,我们就来彻底拆解这个问题,不仅告诉你如何快速修复,更深入理解其背后的机制,让你以后再遇到类似Gazebo模型加载失败、服务不可用的问题时,能从容应对。
1. 问题现象深度剖析:不仅仅是“卡住”
当你满怀期待地输入ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py,终端开始滚动输出信息,Gazebo客户端界面也可能随之启动。但很快,你会发现仿真世界一片空白,或者Gazebo界面直接卡在加载状态。此时查看终端,错误信息通常聚焦于spawn_entity这个节点。
1.1 错误日志的“弦外之音”
我们仔细看看典型的报错信息:
[spawn_entity.py-4] [ERROR] [1666579919.180097092] [spawn_entity]: Service %s/spawn_entity unavailable. Was Gazebo started with GazeboRosFactory?
[spawn_entity.py-4] [ERROR] [1666579919.182394989] [spawn_entity]: Spawn service failed. Exiting.
第一行错误信息是关键线索:“Service .../spawn_entity unavailable. Was Gazebo started with GazeboRosFactory?”。这句话常常让人误以为是Gazebo服务端插件libgazebo_ros_factory.so没有加载。但事实上,在通过ros2 launch启动的Gazebo中,这个插件通常是默认加载的。问题的根源往往更“上游”。
spawn_entity.py这个脚本的任务,是告诉Gazebo服务器:“请在这个位置(x, y, z)生成一个实体,它的模型文件在/opt/ros/galactic/share/turtlebot3_gazebo/models/turtlebot3_waffle/model.sdf”。Gazebo服务器收到请求后,第一件事就是去指定的路径寻找并加载这个SDF模型文件。如果Gazebo服务器找不到这个文件,spawn服务就会失败,进而导致整个脚本报错退出。
所以,核心矛盾在于:启动脚本知道模型文件的绝对路径,但Gazebo服务器在自己的搜索路径里找不到它。
1.2 Gazebo的资源查找机制
Gazebo(特别是与ROS集成的gazebo_ros包)有一套自己的资源查找机制。它不仅仅依赖绝对路径,更依赖于一系列环境变量所定义的搜索路径。对于模型文件,最重要的环境变量就是 GAZEBO_MODEL_PATH。
你可以把它想象成系统命令的PATH变量。当你在终端输入ls,系统会在PATH列出的所有目录里寻找名为ls的可执行文件。同样,当Gazebo需要加载一个模型时,它会在GAZEBO_MODEL_PATH包含的所有目录及其子目录里,寻找匹配的模型配置(通常是model.config或model.sdf文件)。
在纯净的ROS2 Galactic安装中,GAZEBO_MODEL_PATH可能只包含了Gazebo自带的官方模型库路径(例如/usr/share/gazebo-11/models)。而turtlebot3_gazebo包的模型被安装在了ROS2的共享目录下(/opt/ros/galactic/share/turtlebot3_gazebo/models)。这个路径默认并不在GAZEBO_MODEL_PATH中。因此,当spawn_entity请求加载turtlebot3_waffle模型时,Gazebo服务器翻遍了自家仓库(GAZEBO_MODEL_PATH)也找不到,只能返回失败。
注意:这里有一个常见的误解区。
spawn_entity.py脚本通过-file参数传递的是绝对路径。这个路径是给脚本自己用的,用于读取文件内容。但当脚本通过ROS服务调用将生

2635

被折叠的 条评论
为什么被折叠?



