準備

Ros.jsに必要なのはwebブラウザとJSON形式のROSメッセージを送受信するためのWebSocketサーバのみです。

Rosbridgeのセットアップ

Ros.jsはサーバやロボットで起動するrosbridgeに依存します。RosbridgeはROSのJSONインターフェースを提供し、あらゆるクライアントからJSONを送る事で、ROSトピックのパブリッシュ/サブスクライブ、ROSサービスの呼び出しなどを行うことが出来ます。rosbridgeスタックにはros.jsが接続するためのWebSocketが含まれています。

rosbridgeのインストール・起動方法:

  1. Rosbridge 2.0スタックのインストール

    •     sudo apt-get install ros-fuerte-rosbridge-suite
  2. ROSを起動(未起動の時)
    •     roscore
  3. rosapiを起動(topic listなど、ROSに関する情報を返すサービスを提供する)
    •     rosrun rosapi rosapi.py
  4. 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ディレクトリのファイルを確認することが出来ます。

Wiki: ja/rosjs (last edited 2013-01-17 13:33:18 by Furushchev)