Loading

roslibjs 完整用法:核心功能与通信操作

一、使用前提(环境准备)

roslibjs通过rosbridge_server(ROS的WebSocket桥接服务)与ROS通信,因此需完成两步准备:

1. ROS端启动rosbridge

roslibjs的所有通信都依赖rosbridge的WebSocket服务,启动命令:


# 启动默认配置的rosbridge websocket(端口9090)
roslaunch rosbridge_server rosbridge_websocket.launch

2. 前端引入roslibjs

有两种方式,新手推荐CDN快速引入:


<!-- CDN引入(推荐新手) -->
<script src="https://static.robotwebtools.org/roslibjs/current/roslib.min.js"></script>

<!-- 或npm安装(适用于模块化项目) -->
<!-- 1. 安装:npm install roslib -->
<!-- 2. 引入:import ROSLIB from 'roslib'; -->

二、核心对象与基础连接

ROSLIB.Ros是roslibjs的核心对象,用于建立与rosbridge的WebSocket连接,所有后续操作都依赖这个对象。

示例:创建并连接ROS


// 1. 创建ROS连接对象(指定rosbridge的WebSocket地址)
const ros = new ROSLIB.Ros({
  url: 'ws://localhost:9090' // rosbridge默认端口是9090
});

// 2. 注册连接状态回调(必加,用于调试和状态处理)
// 连接成功
ros.on('connection', () => {
  console.log('✅ 成功连接到ROS桥接服务器');
});

// 连接错误(如rosbridge未启动、地址错误)
ros.on('error', (error) => {
  console.error('❌ 连接失败:', error);
});

// 连接关闭
ros.on('close', () => {
  console.log('🔌 ROS连接已关闭');
});

三、roslibjs核心用法(附完整示例)

1. 话题(Topic)操作(最常用)

ROS话题是异步发布/订阅模式,对应ROSLIB.Topic对象,支持订阅(接收数据)发布(发送数据)

1.1 订阅话题(从ROS接收数据)

示例:订阅海龟仿真的/turtle1/pose话题(获取海龟位姿)


// 定义话题对象
const poseTopic = new ROSLIB.Topic({
  ros: ros,                // 关联已建立的ROS连接
  name: '/turtle1/pose',   // 话题名称(与ROS端一致)
  messageType: 'turtlesim/Pose' // 消息类型(必须匹配)
});

// 订阅话题,注册数据回调
poseTopic.subscribe((message) => {
  console.log('🐢 海龟位姿数据:');
  console.log('x坐标:', message.x);
  console.log('y坐标:', message.y);
  console.log('朝向角度:', message.theta);
  
  // 可选:满足条件后取消订阅
  // if (message.x > 5) poseTopic.unsubscribe();
});

1.2 发布话题(向ROS发送指令)

示例:发布/turtle1/cmd_vel话题(控制海龟移动)


// 定义话题对象
const cmdVelTopic = new ROSLIB.Topic({
  ros: ros,
  name: '/turtle1/cmd_vel',
  messageType: 'geometry_msgs/Twist'
});

// 构造要发布的消息(严格匹配消息类型结构)
const twistMsg = new ROSLIB.Message({
  linear: { x: 1.0, y: 0.0, z: 0.0 }, // 线速度(x方向前进)
  angular: { x: 0.0, y: 0.0, z: 0.5 } // 角速度(z轴旋转)
});

// 单次发布
cmdVelTopic.publish(twistMsg);

// 可选:持续发布(比如定时器)
// setInterval(() => {
//   cmdVelTopic.publish(twistMsg);
// }, 100); // 每100ms发布一次

// 可选:停止发布(取消广告)
// cmdVelTopic.unadvertise();

2. 服务(Service)调用(请求-响应模式)

ROS服务是同步/异步的请求-响应通信,对应ROSLIB.ServiceROSLIB.ServiceRequest对象。

示例:调用/spawn服务(生成新海龟)


// 定义服务对象
const spawnService = new ROSLIB.Service({
  ros: ros,
  name: '/spawn',          // 服务名称
  serviceType: 'turtlesim/Spawn' // 服务类型
});

// 构造服务请求参数
const spawnRequest = new ROSLIB.ServiceRequest({
  x: 3.0,    // 新海龟x坐标
  y: 3.0,    // 新海龟y坐标
  theta: 0.0, // 朝向角度
  name: 'turtle2' // 新海龟名称
});

// 调用服务(异步回调)
spawnService.callService(
  spawnRequest,
  (response) => { // 成功回调
    console.log('✅ 新海龟生成成功,名称:', response.name);
  },
  (error) => { // 失败回调
    console.error('❌ 服务调用失败:', error);
  }
);

3. 参数服务器操作(Param)

ROS参数服务器用于存储全局配置,对应ROSLIB.Param对象,支持读取设置删除

3.1 读取参数


// 定义参数对象(海龟仿真背景红色值)
const bgRedParam = new ROSLIB.Param({
  ros: ros,
  name: '/turtlesim/background_r'
});

// 获取参数值
bgRedParam.get((value) => {
  console.log('🎨 背景红色值:', value);
});

3.2 设置参数


// 修改参数值(将背景红色设为255)
bgRedParam.set(255);

// 验证修改结果
bgRedParam.get((value) => {
  console.log('🎨 修改后背景红色值:', value);
});

// 可选:删除参数
// bgRedParam.delete();

4. TF变换查询(坐标变换)

ROS的TF用于描述不同坐标系的关系,roslibjs通过ROSLIB.TFClient查询。

示例:查询base_link相对于odom的坐标变换


// 创建TF客户端
const tfClient = new ROSLIB.TFClient({
  ros: ros,
  fixedFrame: 'odom',    // 参考坐标系
  rate: 10.0             // 查询频率(Hz)
});

// 订阅TF变换
tfClient.subscribe('base_link', (tf) => {
  console.log('🌐 base_link相对于odom的变换:');
  console.log('平移:', tf.translation); // {x, y, z}
  console.log('旋转(四元数):', tf.rotation); // {x, y, z, w}
});

5. 辅助操作

5.1 获取ROS话题列表


ros.getTopics((topics) => {
  console.log('📋 当前ROS话题列表:', topics);
});

5.2 获取ROS服务列表


ros.getServices((services) => {
  console.log('📋 当前ROS服务列表:', services);
});

5.3 关闭ROS连接


ros.close(); // 主动关闭WebSocket连接

四、关键注意事项

  1. 跨域问题:如果网页和rosbridge不在同一域名/端口,需配置rosbridge的CORS(跨域),启动时添加参数:

    
    roslaunch rosbridge_server rosbridge_websocket.launch --args " -cors_allowed_origins *"
    
  2. 消息类型匹配:话题/服务的messageType/serviceType必须与ROS端完全一致(如turtlesim/Pose不能写错),否则通信失败。

  3. 错误处理:务必为连接、订阅、服务调用添加错误回调,避免程序静默失败。


总结

  1. roslibjs的核心是ROSLIB.Ros对象,需先建立与rosbridge的WebSocket连接,这是所有操作的基础。

  2. 核心功能分为四类:话题发布/订阅(ROSLIB.Topic)、服务调用(ROSLIB.Service)、参数操作(ROSLIB.Param)、TF变换查询(ROSLIB.TFClient)。

  3. 使用前需启动rosbridge_websocket,并确保消息类型匹配、处理跨域问题,提升代码鲁棒性。

posted @ 2026-01-14 21:02  StarVik  阅读(8)  评论(0)    收藏  举报