解决roslibjs发布turtle1/teleport_absolute时的类型推断错误
解决roslibjs发送海龟TeleportAbsolute消息的错误
问题根源分析
你遇到的错误虽然指向/tf2_web_republisher/goal,但核心问题出在以下两点:
- 消息类型配置错误:海龟仿真器的绝对瞬移消息类型不是
turtle1/teleport_absolute,而是标准的turtlesim/TeleportAbsolute。 - 连接时机与资源复用问题:每次调用
publish()都重新执行connect()并创建Topic实例,异步连接未完成就发布消息,导致roslibjs无法正确识别话题类型。
修正后的代码示例
// 全局维护ROS连接和话题实例,避免重复创建 let ros; let teleportTopic; function connect() { ros = new ROSLIB.Ros({ url: 'ws://localhost:9090' // 替换为你的rosbridge websocket地址 }); ros.on('connection', () => { console.log('已连接到ROS'); // 连接成功后初始化瞬移话题 teleportTopic = new ROSLIB.Topic({ ros: ros, name: "turtle1/teleport_absolute", messageType: "turtlesim/TeleportAbsolute" // 修正消息类型 }); }); ros.on('error', (err) => console.log('ROS连接错误:', err)); ros.on('close', () => console.log('ROS连接已关闭')); } function publish() { // 检查连接和话题是否就绪 if (!ros || !teleportTopic) { console.log('ROS连接或话题未初始化'); return; } // 确保linear变量已定义且有有效值 const data = new ROSLIB.Message({ x: linear.x, y: linear.y, theta: 8.0 }); teleportTopic.publish(data); }
额外注意事项
- 确保
turtlesim_node和rosbridge_server已启动:rosrun turtlesim turtlesim_node roslaunch rosbridge_server rosbridge_websocket.launch - 确认
linear.x、linear.y变量已被正确赋值,避免传递undefined或无效数值。 - 初始调用
connect()后,等待控制台输出"已连接到ROS",再调用publish()发送消息。
内容的提问来源于stack exchange,提问作者snorre søvold
相关产品推荐
相关产品推荐

