Only released in EOL distros:
Package Summary
Ros.js provides the core JavaScript API for interacting with ROS via the web. Ros.js supports publishing and subscribing to topics, getting and setting parameters, and calling services in ROS. Ros.js uses rosbridge on the backend and connects to the server with WebSockets.
- Author: Brandon Alexander
- License: BSD
- External website: https://github.com/robotwebtools/rosjs
- Source: git https://github.com/RobotWebTools/rosjs.git (branch: fuerte-devel)
Package Summary
The core JavaScript API for ROS on the web.
- Maintainer: Brandon Alexander <balexander AT willowgarage DOT com>
- Author: Brandon Alexander <balexander AT willowgarage DOT com>
- License: BSD
- Bug / feature tracker: https://github.com/WPI-RAIL/rosjs/issues
- Source: git https://github.com/RobotWebTools/rosjs.git (branch: groovy-devel)
Contents
準備
Ros.jsに必要なのはwebブラウザとJSON形式のROSメッセージを送受信するためのWebSocketサーバのみです。
Rosbridgeのセットアップ
Ros.jsはサーバやロボットで起動するrosbridgeに依存します。RosbridgeはROSのJSONインターフェースを提供し、あらゆるクライアントからJSONを送る事で、ROSトピックのパブリッシュ/サブスクライブ、ROSサービスの呼び出しなどを行うことが出来ます。rosbridgeスタックにはros.jsが接続するためのWebSocketが含まれています。
rosbridgeのインストール・起動方法:
Rosbridge 2.0スタックのインストール
sudo apt-get install ros-fuerte-rosbridge-suite
- ROSを起動(未起動の時)
roscore
- rosapiを起動(topic listなど、ROSに関する情報を返すサービスを提供する)
rosrun rosapi rosapi.py
rosbridge_serverを起動(rosjs接続用WebSocketサーバ)
rosrun rosbridge_server rosbridge.py
以上でrosbridgeとそのWebSocketサーバが起動していることになります。ros.jsを任意のサイトへ追加して、サイトのURLをrosbridgeのWebSocketサーバに設定して下さい。
Ros.jsの使い方
ROSへの接続
// rosbridge WebSocketサーバへ接続する var ros = new ROS('ws://localhost:9090');
または、
// rosbridge WebSocketサーバへ接続する var ros = new ROS(); ros.connect('ws://localhost:9090');
ROSの切断
// rosbridge WebSocketサーバから切断する ros.close();
トピックのパブリッシュ
// ROSトピックのパブリッシュ/サブスクライブはros.Topicを使用する // geometry_msgs/Twist型のトピックを/cmd_velとして作成する var cmdVel = new ros.Topic({ name : '/cmd_vel', messageType : 'geometry_msgs/Twist' }); // ros.Messageはパブリッシュするデータを扱う var twist = new ros.Message({ angular: { x: 1, y: 0, z: 0 }, linear: { x: 0, y: 0, z: 0 } }); // ROSでgeometry_msgs/Twist型メッセージがパブリッシュされる cmdVel.publish(twist);
トピックをサブスクライブする
// std_msgs/String型のトピック'/chatter'を扱うハンドルを作る var chatter = new ros.Topic({ name : '/chatter', messageType : 'std_msgs/String' }); // Any time a message is published to the /chatter topic, // the callback will fire. // トピック'/chatter'にメッセージがパブリッシュされる毎にコールバックが呼ばれる。 chatter.subscribe(function(message) { // message is an instance of ros.Message. console.log('Received message ' + message.data); });
サービスの呼び出し
// ros.ServiceはROSサービスの呼び出しインターフェースを提供する // /add_two_intsというrospy_tutorials/AddTwoIntsサービスクライアントを作る var addTwoInts = new ros.Service({ name : '/add_two_ints', serviceType : 'rospy_tutorials/AddTwoInts' }); // ros.ServiceRequestはサービス呼び出し時に送るデータが含まれている var request = new ros.ServiceRequest({ A: 1, B: 2}); // コールバックとしてrospy_tutorials/AddTwoIntsサービスとその結果を呼び出す。 addTwoInts.callService(request, function(result) { console.log('Result for service call on ' + addTwoInts.name + ': ' + result.sum); });
パラメータ設定
// ros.ParamはROSパラメータサーバとのインターフェース var maxVelX = new ros.Param({ name: 'max_vel_x' }); // ROSパラメータの値を設定する maxVelX.set(0.75);
パラメータ取得
var maxVelX = new ros.Param({ name: 'max_vel_x' }); コールバックとしてパラメータの値を取得し、返す maxVelX.get(function(value) { console.log('Value of ' + maxVelX.name + ' is ' + value); });
ROS Timeを使う
// Creates a ROS timestamp, which defaults to 0 seconds and 0 nanoseconds. // ROSタイムスタンプをつくる。デフォルトでは0秒0ナノ秒 var time = new ros.Time();
// ROSタイムスタンプを任意の時間で作る var time = new ros.Time({ secs : 1345158610, nsecs : 25000000 });
// ROSタイムスタンプをユーザの現在時刻に設定して作成 var time = new ros.Time().now();
ROSシステム情報の取得
// 現在のROSトピックの一覧を取得する ros.getTopics(function(topics) { console.log('Current topics in ROS: ' + topics); });
// ROSのアクティブなサービスの一覧を取得する ros.getServices(function(services) { console.log('Current services in ROS: ' + services); });
// パラメータ名の一覧を取得する ros.getParams(function(params) { console.log('Current params in ROS: ' + params); });
イベントについて
Ros.jsはオブザーバ パターンにしたがってイベントをパブリッシュ、リスンします。 EventEmitter2がros.jsのイベント機能を提供します。ROSやTopic、Service、Paramオブジェクトに至るまで全てがEventEmitter2を継承し、イベントを送出しています。例えば、ROSオブジェクトがサーバに接続されるとき、'connection'イベントが送出されます。またあるトピックのメッセージを受信すると、'message'イベントが該当トピックのオブジェクトに送られます。
イベントリスナーをつくるには、以下の例のように on() を使いましょう。
var ros = new ROS('ws://localhost:9090'); ros.on('connection', function() { // このコードはROSがサーバに接続された状態でのみ動作します。 }); ros.on('close', function() { // This code will be executed when the connection to ROS disconnects. // このコードはROSへの接続が切断されたときに実行されます。 });
エラー処理
前項「イベントについて」で説明された通り、全てのros.jsのクラスはイベントを送出します。エラーは'error'イベントとしてやりとりされます。例えばrosオブジェクトはROSに問題が発生する毎に'error'イベントを送ります。また、topicオブジェクトはトピックのパブリッシュ/サブスクライブのエラーがあるとイベントを送出します。
最低でも以下のようにrosオブジェクトからのエラーをリスンしておくことを強く推奨します。
var ros = new ROS('ws://localhost:9090'); ros.on('error', function(error) { console.log('There was an error with ROS: ' + error); });
ビルド
Grunt.jsは文法チェック、テスト、結合、軽量化(minimize)を含んだrosjsのJavascriptビルドユーティリティです。プロジェクトルートディレクトリにあるgrunt.jsにはビルドしたファイルの場所(distディレクトリ)などの設定情報が含まれています。
grunt.jsのインストールが完了したら、ビルドするプロジェクトのルート直下でコマンドラインを開き、gruntコマンドを実行することが出来ます。distディレクトリのファイルを確認することが出来ます。