rosbridge_suite介绍及应用

rosbridge_suite包是一个包集合,用于实现rosbridge协议和提供WebSocket传输层。

包含如下几个包:

  • rosbridge_library - 核心rosbridge包。rosbridge_library负责获取JSON字符串并将命令发送到ROS,反之亦然。
  • rosapi - 通过服务调用使某些ROS actions可访问。 这包括获取和设置参数,获取主题列表等。
  • rosbridge_server - 虽然rosbridge_library提供了JSON ROS转换,但它将传输层留给其他人。
    • Rosbridge_server提供了一个WebSocket连接,所以浏览器可以“与rosbridge交谈”。
    • Roslibjs是一个浏览器的JavaScript库,可以通过rosbridge_server与ROS交谈。

rosbridge安装

sudo apt install ros-melodic-rosbridge-suite

利用Websocket实现ROS与Web的交互

rosbridge_suite介绍及应用_第1张图片

(1)运行rosbridge_websocket.launch

roslaunch rosbridge_server rosbridge_websocket.launch

(2)发布一个talker话题(后面websocket会订阅这个话题)

rosrun roscpp_tutorials talker

(3)订阅(打印输出)一个cmd_vel话题(后面websocket会发布这个话题)

rostopic echo /cmd_vel

(4)创建一个Websocket客户端example.html

DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
 
<script type="text/javascript" src="http://static.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js">script>
<script type="text/javascript" src="http://static.robotwebtools.org/roslibjs/current/roslib.min.js">script>
 
<script type="text/javascript" type="text/javascript">
  // Connecting to ROS
  var ros = new ROSLIB.Ros({
    url : 'ws://localhost:9090'
  });
 
  //判断是否连接成功并输出相应的提示消息到web控制台
  ros.on('connection', function() {
    console.log('Connected to websocket server.');
  });
 
  ros.on('error', function(error) {
    console.log('Error connecting to websocket server: ', error);
  });
 
  ros.on('close', function() {
    console.log('Connection to websocket server closed.');
  });
 
  // Publishing a Topic
  var cmdVel = new ROSLIB.Topic({
    ros : ros,
    name : '/cmd_vel',
    messageType : 'geometry_msgs/Twist'
  });//创建一个topic,它的名字是'/cmd_vel',,消息类型是'geometry_msgs/Twist'
 
  var twist = new ROSLIB.Message({
    linear : {
      x : 0.1,
      y : 0.2,
      z : 0.3
    },
    angular : {
      x : -0.1,
      y : -0.2,
      z : -0.3
    }
  });//创建一个message
 
  function func()//在点击”Publish”按钮后发布消息,并对消息进行更改
  {
    cmdVel.publish(twist);//发布twist消息
    twist.linear.x = twist.linear.x + 0.1;
    twist.linear.y = twist.linear.y + 0.1;
    twist.linear.z = twist.linear.z + 0.1;
    twist.angular.x = twist.angular.x + 0.1;
    twist.angular.y = twist.angular.y + 0.1;
    twist.angular.z = twist.angular.z + 0.1;
  }
 
  // Subscribing to a Topic
  var listener = new ROSLIB.Topic({
    ros : ros,
    name : '/chatter',
    messageType : 'std_msgs/String'
  });//创建一个topic,它的名字是'/chatter',,消息类型是'std_msgs/String'
 
  function subscribe()//在点击”Subscribe”按钮后订阅'/chatter'的消息,并将其显示到网页中
  {
     listener.subscribe(function(message) {
       document.getElementById("output").innerHTML = ('Received message on ' + listener.name + ': ' + message.data);
     });
  }
 
  function unsubscribe()//在点击”Unsubscribe”按钮后取消订阅'/chatter'的消息
  {
     listener.unsubscribe();
  }
 
script>
head>
 
<body>
  <h1>Simple roslib Exampleh1>
  <p>Check your Web Console for output.p>
  <p id = "output">p>
  <button onclick = "func()">Publishbutton>
  <button onclick = "subscribe()">Subscribebutton>
  <button onclick = "unsubscribe()">Unsubscribebutton><br />
body>
html>

(5)在浏览器中打开example.html文件,并打开Web控制台(鼠标右键->Inspect->Console),将出现以下界面:
rosbridge_suite介绍及应用_第2张图片
在控制台中,可以看到“Connected to websocket server”的提示信息,说明Web端与ROS端成功连接了起来。
点击几次网页中的Publish按钮,会在终端中打印输出cmd_vel的数据。 这说明Web端成功地发布了/cmd_vel话题的消息。

在网页中点击Subscribe按钮,将会在网页中看到如下界面:
rosbridge_suite介绍及应用_第3张图片
这说明Web端成功地订阅了talker节点发布的消息,然后点击Unsubscribe按钮,结束对于该话题的订阅操作。

也可以在新终端中运行rqt_graph命令,得到当前ROS系统中的计算图,类似于下图:
rosbridge_suite介绍及应用_第4张图片
从该图中我们可以看出,rosbridge_websocket节点订阅了名为/chatter的topic,发布了名为/cmd_vel的topic。

参考链接:
[1] 利用Websocket实现ROS与Web的交互

你可能感兴趣的:(室内机器人专栏,自动驾驶,人工智能,机器学习)