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