[Documentation] [TitleIndex] [WordIndex

Only released in EOL distros:  

rosjs

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.

Package Summary

The core JavaScript API for ROS on the web.

準備

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


2023-10-28 12:41