Gazebo加载rrbot控制器时出现TCP连接错误,求解决方案
解决ROS Noetic中加载自定义控制器时的TCP连接拒绝问题
针对你在给Gazebo中rrbot模型加载my_position_controller自定义控制器时遇到的TransportTerminated、ConnectionRefusedError及TCP socket连接被拒问题,可按以下步骤排查解决:
1. 确认自定义控制器节点的运行状态
- 执行
rosnode list,检查自定义控制器对应的节点是否已启动。若未出现,先确认控制器包编译无报错(查看catkin_make/catkin build输出),再检查launch文件中是否正确添加了该节点的启动指令。 - 若节点已存在,运行
rosnode info <控制器节点名>,查看节点的话题、服务连接状态,确认是否有未正常建立的通信链路。
2. 验证控制器的pluginlib注册配置
- 检查自定义控制器代码中是否通过
PLUGINLIB_EXPORT_CLASS宏完成了类注册,同时确认对应的.xml插件描述文件中,控制器的名称、类型与代码中的注册信息完全匹配。 - 确认控制器包的
package.xml中已正确声明插件路径,示例配置:<export> <controller_manager plugin="${prefix}/my_controller_plugin.xml"/> </export>
3. 检查Gazebo的ros_control插件配置
- 核对rrbot的URDF文件,确保已正确加载
ros_control插件,示例配置:<gazebo> <plugin name="ros_control" filename="libgazebo_ros_control.so"> <robotNamespace>/rrbot</robotNamespace> </plugin> </gazebo> - 执行
rosservice list,查看是否存在/rrbot/controller_manager/list_controllers等服务。若不存在,说明ros_control插件未完成初始化,需检查URDF的插件参数是否正确。
4. 排查ROS网络与端口问题
- 确认所有节点的
ROS_MASTER_URI一致,执行echo $ROS_MASTER_URI验证,通常应为http://localhost:11311。 - 临时关闭本地防火墙(如
sudo ufw disable)测试,若问题解决,需为ROS相关端口添加防火墙允许规则。 - 查看
.ros/log中的详细日志,定位被拒绝连接的具体端口和目标地址,再用netstat -tulpn | grep <端口号>检查该端口是否被对应节点监听。
5. 检查控制器代码中的通信逻辑
- 若自定义控制器代码中存在手动创建TCP连接的逻辑,确认目标地址、端口配置正确,且无连接超时或权限限制问题。
- 优先使用ROS标准的话题、服务接口实现节点间通信,避免直接操作低级TCP套接字(除非业务必需)。
内容的提问来源于stack exchange,提问作者MIKEL LASS
相关产品推荐
相关产品推荐

