跳转到内容

Robot Web Tools 机器人Web工具集合

Robot Web Tools 是一套功能强大的开源工具集,专为在 Web 浏览器环境中构建机器人应用程序而设计。它提供了多种 JavaScript 库和工具,使开发者能够轻松地在 Web 页面中实现与机器人操作系统 (ROS) 的通信、可视化和交互功能。

  • 轻量级设计:基于纯 JavaScript 实现,无需安装额外插件
  • 跨平台兼容:支持所有现代浏览器,包括移动设备
  • 完整生态:提供从通信到可视化的全方位工具链
  • 开源社区:活跃的开发者社区,持续更新和改进

Robot Web Tools 由多个相互协作的组件构成,形成完整的机器人 Web 应用开发生态系统。

通信层负责在浏览器与 ROS 系统之间建立桥梁,是整个工具集的基础。

  • rosbridge_suite:ROS 端的 WebSocket 服务器,将 ROS 消息转换为 JSON 格式
  • roslibjs:浏览器端的 JavaScript API,提供与 ROS 通信的核心功能
  • ros2-web-bridge:针对 ROS 2 系统的 Web 桥接器

可视化层提供丰富的 2D 和 3D 可视化组件,用于展示机器人状态和环境信息。

  • ros2djs:二维可视化库,用于显示地图、路径等
  • ros3djs:三维可视化库,用于显示机器人模型、点云数据等
  • tf2-web:坐标变换库,处理机器人系统中的坐标变换

交互层提供用户与机器人进行交互的组件和工具。

  • keyboardteleopjs:键盘控制模块,允许通过键盘控制机器人运动
  • jointstatepublisherjs:关节状态发布器,用于控制机器人关节
  • nav2djs:导航功能组件,提供路径规划和导航界面

在开始使用 Robot Web Tools 之前,需要在 ROS 环境中安装必要的包:

Terminal window
# 安装 rosbridge_suite 包
sudo apt-get install ros-<distro>-rosbridge-suite
# 克隆必要的 JavaScript 库
git clone https://github.com/RobotWebTools/roslibjs.git
git clone https://github.com/RobotWebTools/ros2djs.git
git clone https://github.com/RobotWebTools/ros3djs.git

使用以下命令启动 rosbridge WebSocket 服务器:

Terminal window
roslaunch rosbridge_server rosbridge_websocket.launch

默认情况下,服务器将在 ws://localhost:9090 上运行。

在 HTML 文件中引入所需的 JavaScript 库:

<!-- 引入基础依赖 -->
<script src="http://cdn.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js"></script>
<script src="http://cdn.robotwebtools.org/roslibjs/current/roslib.min.js"></script>
<!-- 引入 2D 可视化库(如需) -->
<script src="http://cdn.robotwebtools.org/EaselJS/current/easeljs.min.js"></script>
<script src="http://cdn.robotwebtools.org/ros2djs/current/ros2d.min.js"></script>
<!-- 引入 3D 可视化库(如需) -->
<script src="http://cdn.robotwebtools.org/threejs/current/three.min.js"></script>
<script src="http://cdn.robotwebtools.org/ros3djs/current/ros3d.min.js"></script>

roslibjs 是 Robot Web Tools 的核心库,提供与 ROS 通信的基础功能。

  • 建立与 rosbridge 的连接
  • 发布和订阅 ROS 话题
  • 调用 ROS 服务
  • 操作 ROS 参数服务器
// 创建 ROS 连接对象
var ros = new ROSLIB.Ros({
url : 'ws://localhost:9090'
});
// 连接事件处理
ros.on('connection', function() {
console.log('成功连接到 ROS 服务器');
});
ros.on('error', function(error) {
console.log('连接错误: ', error);
});
ros.on('close', function() {
console.log('连接已关闭');
});
// 创建一个话题订阅者
var listener = new ROSLIB.Topic({
ros : ros,
name : '/chatter',
messageType : 'std_msgs/String'
});
// 订阅消息回调
listener.subscribe(function(message) {
console.log('接收到消息: ', message.data);
});
// 创建一个话题发布者
var talker = new ROSLIB.Topic({
ros : ros,
name : '/chatter',
messageType : 'std_msgs/String'
});
// 发布消息
talker.publish(new ROSLIB.Message({
data : 'Hello ROS from the browser!'
}));
// 调用服务
var service = new ROSLIB.Service({
ros : ros,
name : '/add_two_ints',
serviceType : 'rospy_tutorials/AddTwoInts'
});
var request = new ROSLIB.ServiceRequest({
a : 1,
b : 2
});
service.callService(request, function(result) {
console.log('服务调用结果: ', result.sum);
});

ros2djs 提供了在浏览器中创建二维可视化界面的功能,特别适合显示机器人地图和路径。

  • 创建二维地图可视化
  • 显示机器人位置和姿态
  • 绘制路径和标记
// 创建 ROS 连接
var ros = new ROSLIB.Ros({ url : 'ws://localhost:9090' });
// 创建 2D 地图视图
var viewer = new ROS2D.Viewer({
divID : 'map',
width : 800,
height : 600
});
// 创建导航地图
var gridClient = new ROS2D.OccupancyGridClient({
ros : ros,
rootObject : viewer.scene,
continuous : true
});
// 设置地图缩放
gridClient.on('change', function() {
viewer.scaleToDimensions(gridClient.currentGrid.width, gridClient.currentGrid.height);
viewer.shift(gridClient.currentGrid.pose.position.x, gridClient.currentGrid.pose.position.y);
});
// 创建机器人模型
var robotMarker = new ROS2D.NavigationArrow({
size : 25,
strokeSize : 1,
fillColor : createjs.Graphics.getRGB(0, 128, 255, 0.66),
pulse : true
});
// 将机器人模型添加到场景中
viewer.scene.addChild(robotMarker);
// 订阅机器人位置信息
var tfClient = new ROSLIB.TFClient({
ros : ros,
fixedFrame : 'map',
angularThres : 0.01,
transThres : 0.01
});
tfClient.subscribe('base_link', function(tf) {
// 更新机器人位置和方向
robotMarker.x = tf.translation.x;
robotMarker.y = -tf.translation.y;
robotMarker.rotation = tf.rotation.z;
});

ros3djs 是一个强大的三维可视化库,基于 Three.js 构建,用于在浏览器中显示机器人的三维模型和环境。

  • 显示机器人 URDF 模型
  • 可视化点云数据
  • 渲染交互式标记
  • 显示相机图像
// 创建 ROS 连接
var ros = new ROSLIB.Ros({ url : 'ws://localhost:9090' });
// 创建 3D 视图
var viewer = new ROS3D.Viewer({
divID : 'robot_view',
width : 800,
height : 600,
background : '#ffffff'
});
// 添加坐标网格
var grid = new ROS3D.Grid({ size : 10, division : 10 });
viewer.scene.add(grid);
// 加载 URDF 机器人模型
var urdfClient = new ROS3D.UrdfClient({
ros : ros,
tfClient : new ROSLIB.TFClient({
ros : ros,
fixedFrame : 'world',
angularThres : 0.01,
transThres : 0.01
}),
path : 'http://resources.robotwebtools.org/',
rootObject : viewer.scene
});
// 添加点云可视化
var pointCloudClient = new ROS3D.PointCloud2({
ros : ros,
topic : '/point_cloud',
rootObject : viewer.scene
});
// 添加相机图像
var imageViewer = new ROS3D.ImageViewer({
divID : 'camera_view',
width : 640,
height : 480
});
var imageClient = new ROS3D.ImageClient({
ros : ros,
topic : '/camera/image_raw',
camera: imageViewer
});

Robot Web Tools 可用于多种机器人应用场景,以下是几个典型示例:

创建基于 Web 的机器人监控界面,实时查看机器人状态和传感器数据。

// 创建监控面板
function createMonitorPanel() {
// 连接 ROS
var ros = new ROSLIB.Ros({ url: 'ws://robot-server:9090' });
// 订阅电池状态
var batteryListener = new ROSLIB.Topic({
ros: ros,
name: '/battery_state',
messageType: 'sensor_msgs/BatteryState'
});
batteryListener.subscribe(function(message) {
document.getElementById('battery-percentage').innerText =
Math.round(message.percentage * 100) + '%';
});
// 订阅温度信息
var tempListener = new ROSLIB.Topic({
ros: ros,
name: '/temperature',
messageType: 'sensor_msgs/Temperature'
});
tempListener.subscribe(function(message) {
document.getElementById('temperature').innerText =
message.temperature.toFixed(1) + '°C';
});
}

开发基于浏览器的机器人远程操作界面,通过键盘或触摸屏控制机器人。

// 创建遥操作界面
function createTeleopInterface() {
var ros = new ROSLIB.Ros({ url: 'ws://robot-server:9090' });
// 创建速度控制话题
var cmdVel = new ROSLIB.Topic({
ros: ros,
name: '/cmd_vel',
messageType: 'geometry_msgs/Twist'
});
var linearSpeed = 0.5; // 线速度 (m/s)
var angularSpeed = 1.0; // 角速度 (rad/s)
var twist = new ROSLIB.Message({
linear: { x: 0, y: 0, z: 0 },
angular: { x: 0, y: 0, z: 0 }
});
// 键盘控制
document.addEventListener('keydown', function(event) {
switch(event.keyCode) {
case 87: // W 键前进
twist.linear.x = linearSpeed;
break;
case 83: // S 键后退
twist.linear.x = -linearSpeed;
break;
case 65: // A 键左转
twist.angular.z = angularSpeed;
break;
case 68: // D 键右转
twist.angular.z = -angularSpeed;
break;
}
cmdVel.publish(twist);
});
document.addEventListener('keyup', function() {
twist.linear.x = 0;
twist.angular.z = 0;
cmdVel.publish(twist);
});
}

构建包含地图显示、路径规划和导航控制的完整自主导航界面。

// 创建导航界面
function createNavigationInterface() {
var ros = new ROSLIB.Ros({ url: 'ws://robot-server:9090' });
// 创建 2D 地图视图
var viewer = new ROS2D.Viewer({
divID: 'nav-map',
width: 800,
height: 600
});
// 加载地图
var navClient = new ROS2D.OccupancyGridClientNav({
ros: ros,
rootObject: viewer.scene,
viewer: viewer
});
// 设置地图缩放
navClient.on('change', function() {
viewer.scaleToDimensions(navClient.currentGrid.width, navClient.currentGrid.height);
});
// 创建导航目标设置功能
viewer.scene.addEventListener('click', function(event) {
// 转换点击坐标为地图坐标
var coords = viewer.scene.globalToRos(event.stageX, event.stageY);
// 发布导航目标
var goalTopic = new ROSLIB.Topic({
ros: ros,
name: '/move_base_simple/goal',
messageType: 'geometry_msgs/PoseStamped'
});
var goal = new ROSLIB.Message({
header: { frame_id: 'map' },
pose: {
position: { x: coords.x, y: coords.y, z: 0 },
orientation: { x: 0, y: 0, z: 0, w: 1 }
}
});
goalTopic.publish(goal);
console.log('已设置导航目标到: ', coords.x, coords.y);
});
}
  • 使用 CDN 加载库:利用 Robot Web Tools 提供的 CDN 服务加速库加载
  • 限制数据更新频率:对高频数据使用节流或防抖技术,减少渲染压力
  • 优化大型模型:对复杂的 URDF 模型进行简化,提高加载和渲染速度
  • 使用 Web Workers:将数据处理逻辑放在 Web Workers 中,避免阻塞主线程
  • 资源预加载:提前加载所需的模型和资源,减少用户等待时间
  • 使用 HTTPS:在生产环境中使用 HTTPS 加密通信
  • 实现访问控制:添加用户认证和授权机制,限制对机器人的访问
  • 设置消息过滤器:根据需要过滤敏感数据,保护机器人和环境安全
  • 定期更新库:及时更新到最新版本,修复已知安全漏洞
  • 连接断开问题:实现自动重连机制,在连接断开时尝试重新连接
  • 跨域请求问题:配置 rosbridge 服务器支持 CORS,允许跨域请求
  • 大型数据处理:对点云等大型数据进行分块处理,避免浏览器崩溃
  • 浏览器兼容性:测试不同浏览器的兼容性,使用 polyfill 解决兼容性问题

Robot Web Tools 为开发者提供了一套完整的解决方案,使机器人应用的 Web 化变得简单高效。随着 Web 技术的不断发展和普及,基于浏览器的机器人控制界面将变得越来越重要。

未来,Robot Web Tools 将继续演进,支持更多的 ROS 功能,提高性能,并拓展更多的应用场景。无论是用于教育、研究还是工业应用,Robot Web Tools 都为机器人技术与 Web 技术的结合提供了强大的支持。

想要了解更多信息或参与贡献,请访问 RobotWebTools GitHub 仓库