Only released in EOL distros:
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ディレクトリのファイルを確認することが出来ます。