今回は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 件のコメント:
コメントを投稿