1. 程式人生 > 其它 >Web+ROS之1--通訊篇

Web+ROS之1--通訊篇

技術標籤:專案學習html

準備工具:

工具包:rosbridge_suite功能包,roslibjs,ros2djs,ros3djs.

rosbridge_suite:實現web瀏覽器與ros之間的資料互動;

roslibjs:實現ros中的部分功能,如Topic,Service,URDF等;

ros2djs:提供了二維視覺化的管理工具,可以用來在web瀏覽器中顯示二維地圖;

ros3djs:提供了三維視覺化的管理工具,可以用來在web端顯示三維模型。

其中rosbridge_suite是最重要的,它是web和ros溝通的橋樑,roslibjs也是必須的,它能實現ros中最基本的功能,下面的例程就是用它來實現的。下載安裝方法如下:

在終端中分別輸入以下指令:

$ sudo apt-get install ros-melodic-rosbridge-suite
$ sudo clone https://github.com/RobotWebTools/roslibjs.git
$ sudo clone https://github.com/RobotWebTools/ros2djs
$ sudo clone https://github.com/RobotWebTools/ros3djs

完成之後回到工作空間catkin_make以及source devel/setup.bash一下,

然後使用touch建立一個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 Example</h1>
    <p>Check your Web Console for output.</p>
    <p id = "output"></p>
    <button onclick = "func()">Publish</button>
    <button onclick = "subscribe()">Subscribe</button>
    <button onclick = "unsubscribe()">Unsubscribe</button><br />
    </body>
    </html>

說明:

var ros = new ROSLIB.Ros({
    url : 'ws://localhost:9090'
});

這段程式碼建立了一個ROSLIB.ros物件,用於連線rosbridge伺服器,如果rosbridge伺服器位於本機,url設定中可用localhost代表IP地址,否則需要修改為rosbridge伺服器對於的IP地址。

var cmdVel = new ROSLIB.Topic({
ros : ros,
name : '/cmd_vel',
messageTpye : 'geometry_msgs/Twist'
});

建立了一個ROSLIB.Topic物件,用於在這個話題上釋出或訂閱訊息。

之後在新的終端中執行:

$ roslaunch rosbridge_server rosbridge_websocket.launch

然後在新的終端中執行:

$ ros run roscpp_tutorials talker

然後在瀏覽器中開啟example.html檔案,並開啟web控制檯,進行測試。

可以在新的終端執行rqt_graph得到當前ROS系統中的計算圖,完成通訊測試。