今回は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
などとしてから実行するとそれらを加えた結果を返してくれます。
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 件のコメント:
コメントを投稿