2012年1月19日木曜日

rosjavaのパラメータサーバ

(この記事は2011/01/19時点でのものです。すでに古くなっている可能性があります。ご注意ください。)

今回はrosjavaのパラメータサーバを使ってみます。
ROSは一応Pub/Sub、サービス、パラメータが3種の神器だと思うので、
これでひと通りそろったことになります。


http://ros.org/wiki/rosjava/Overview/Parameters


まずnodeからParameterTreeを作ります。
ここからparameterにアクセスします。

ParameterTree params = node.newParameterTree();

で、実際に使うには以下のようにします。rosjavaではパラメータの型ごとに関数が異なります。型が合わないと例外が投げられます。

  boolean foo = params.getBoolean("/foo");
  int bar = params.getInteger("/bar", 42 /* default value */);
  double baz = params.getDouble("/foo/baz");

  params.set("/bloop", "Hello, world!");
  String helloWorld = params.getString("/bloop");

  List<Integer> numbers = params.getList("/numbers");
  Map<String, String> strings = params.getMap("/strings");

また、パラメータの変更を監視するParameterListenerを作ることができます。


params.addParameterListener("/foo/bar", new ParameterListener() {
  @Override
  public void onNewValue(Object value) {
    ...
  }
});



以上で説明は終わりです。

前回のServiceClientのサンプルをちょっと変更してパラメータを取得するようにしてみました。

/*
 * rosjava service client sample
 */

package org.ros.tutorials.service;

import org.apache.commons.logging.Log;
import org.ros.node.Node;
import org.ros.node.NodeMain;
import org.ros.node.service.ServiceClient;
import org.ros.node.service.ServiceResponseListener;
import org.ros.exception.RemoteException;
import org.ros.service.test_ros.AddTwoInts;
import org.ros.namespace.GraphName;

// add for parameter
import org.ros.node.parameter.ParameterTree;

/*
 * @author OTL
 */
public class Client implements NodeMain {

  @Override
  public GraphName getDefaultNodeName() {
    return new GraphName("rosjava_tutorial_service/client");
  }

  @Override
  public void onStart(Node node) {
    try {
      ServiceClient<AddTwoInts.Request, AddTwoInts.Response> client =
          node.newServiceClient("/add_two_ints", "test_ros/AddTwoInts");
      Thread.sleep(100);
      AddTwoInts.Request srv = new AddTwoInts.Request();

      // add for parameter
      ParameterTree params = node.newParameterTree();
      srv.a = params.getInteger("/a", 1);
      srv.b = params.getInteger("/b", 5);
     
      client.call(srv, new ServiceResponseListener<AddTwoInts.Response>() {
            @Override
                public void onSuccess(AddTwoInts.Response res) {
              log.info("call service success! " + res.sum);
            }
            @Override
                public void onFailure(RemoteException arg) {
              log.info("call service fail");
            }
        });
    } catch (Exception e) {
      if (node != null) {
        node.getLog().fatal(e);
      } else {
        e.printStackTrace();
      }
    }
  }

  @Override
  public void onShutdown(Node node) {
  }

  @Override
  public void onShutdownComplete(Node node) {
  }
}

重要なのは以下のところです。ParameterTreeをnodeから作って、getIntegerでint型のパラメータを取得しています。
rosparam set /a 100
rosparam set /b 200
などとしてから実行するとそれらを加えた結果を返してくれます。

      ParameterTree params = node.newParameterTree();
      srv.a = params.getInteger("/a", 1);
      srv.b = params.getInteger("/b", 5);

0 件のコメント:

コメントを投稿