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のサンプルをちょっと変更してパラメータを取得するようにしてみました。

  1. /* 
  2.  * rosjava service client sample 
  3.  */  
  4.   
  5. package org.ros.tutorials.service;  
  6.   
  7. import org.apache.commons.logging.Log;  
  8. import org.ros.node.Node;  
  9. import org.ros.node.NodeMain;  
  10. import org.ros.node.service.ServiceClient;  
  11. import org.ros.node.service.ServiceResponseListener;  
  12. import org.ros.exception.RemoteException;  
  13. import org.ros.service.test_ros.AddTwoInts;  
  14. import org.ros.namespace.GraphName;  
  15.   
  16. // add for parameter  
  17. import org.ros.node.parameter.ParameterTree;  
  18.   
  19. /* 
  20.  * @author OTL 
  21.  */  
  22. public class Client implements NodeMain {  
  23.   
  24.   @Override  
  25.   public GraphName getDefaultNodeName() {  
  26.     return new GraphName("rosjava_tutorial_service/client");  
  27.   }  
  28.   
  29.   @Override  
  30.   public void onStart(Node node) {  
  31.     try {  
  32.       ServiceClient<AddTwoInts.Request, AddTwoInts.Response> client =  
  33.           node.newServiceClient("/add_two_ints""test_ros/AddTwoInts");  
  34.       Thread.sleep(100);  
  35.       AddTwoInts.Request srv = new AddTwoInts.Request();  
  36.   
  37.       // add for parameter  
  38.       ParameterTree params = node.newParameterTree();  
  39.       srv.a = params.getInteger("/a"1);  
  40.       srv.b = params.getInteger("/b"5);  
  41.        
  42.       client.call(srv, new ServiceResponseListener<AddTwoInts.Response>() {  
  43.             @Override  
  44.                 public void onSuccess(AddTwoInts.Response res) {  
  45.               log.info("call service success! " + res.sum);  
  46.             }  
  47.             @Override  
  48.                 public void onFailure(RemoteException arg) {  
  49.               log.info("call service fail");  
  50.             }  
  51.         });  
  52.     } catch (Exception e) {  
  53.       if (node != null) {  
  54.         node.getLog().fatal(e);  
  55.       } else {  
  56.         e.printStackTrace();  
  57.       }  
  58.     }  
  59.   }  
  60.   
  61.   @Override  
  62.   public void onShutdown(Node node) {  
  63.   }  
  64.   
  65.   @Override  
  66.   public void onShutdownComplete(Node node) {  
  67.   }  
  68. }  

重要なのは以下のところです。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 件のコメント:

コメントを投稿