ROS /clock话题未发布求助:Gazebo仿真时钟异常排查
检查Gazebo时钟发布配置
确认Gazebo启动时加载了负责时钟发布的ROS插件:libgazebo_ros_init.so和libgazebo_ros_factory.so。如果是自定义launch文件,需确保包含这些插件的配置;若使用官方empty_world.launch,默认会启用时钟发布。同时全局参数use_sim_time需设为true,可通过rosparam get /use_sim_time查看,若为false,执行rosparam set /use_sim_time true临时修正,或在launch文件中添加<param name="use_sim_time" value="true"/>。验证ROS节点时间同步
所有依赖仿真时间的节点(包括你的Simple Action Client)必须启用use_sim_time。检查代码中是否存在硬编码使用真实时间的逻辑,比如直接调用ros::Time::now()而未依赖仿真时间参数,这类代码会导致时间不同步,进而阻塞Action Client的等待逻辑。排查Gazebo与ROS的连接状态
用rosnode list确认/gazebo节点存在,若不存在则说明ROS插件加载失败,查看Gazebo启动日志的报错信息(比如依赖缺失、插件路径错误)。再通过rosnode info /gazebo检查该节点是否发布/clock话题。修复环境与网络问题
确认ROS_MASTER_URI、ROS_IP(或ROS_HOSTNAME)环境变量配置正确,避免节点间通信阻塞。关闭系统防火墙或确保ROS与Gazebo的通信端口开放,防止话题消息被拦截。重置仿真运行状态
即使界面显示未暂停,也可在Gazebo界面点击"Play"按钮重新触发运行,部分情况下界面状态与实际进程状态会出现不一致。也可在Gazebo控制台输入physics::get_world()->run()手动启动物理引擎。优化Action Client等待逻辑
由于未发布的/clock会导致Action Client的等待函数无限阻塞,可在代码中添加超时判断:ros::Duration timeout(10.0); if (!action_client.waitForServer(timeout)) { ROS_ERROR("Action server not available within timeout"); return -1; }或在launch文件中添加节点等待
/clock发布后再启动客户端:<node pkg="rostopic" type="rostopic" name="wait_for_clock" args="echo /clock -n 1" />
内容的提问来源于stack exchange,提问作者krlepping

