2012年1月16日月曜日

rosjavaのチュートリアル(Subscriber)

(この記事は2011/01/19現在のものです。rosjavaは開発が激しいため、すでにここに書いてあることは正しくない可能性が高いです。1週間で全く変わる可能性もあります。ご注意ください)

前回はrosjavaでPublisherを作りました。
今回はrosjava_tutorial_pubsubの続きで、Subscriber(Listener.java)を見て行きます。
とりあえずソース貼ります。


  1. /* 
  2.  * Copyright (C) 2011 Google Inc. 
  3.  *  
  4.  * Licensed under the Apache License, Version 2.0 (the "License"); you may not 
  5.  * use this file except in compliance with the License. You may obtain a copy of 
  6.  * the License at 
  7.  *  
  8.  * http://www.apache.org/licenses/LICENSE-2.0 
  9.  *  
  10.  * Unless required by applicable law or agreed to in writing, software 
  11.  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 
  12.  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 
  13.  * License for the specific language governing permissions and limitations under 
  14.  * the License. 
  15.  */  
  16.   
  17. package org.ros.tutorials.pubsub;  
  18.   
  19. import org.apache.commons.logging.Log;  
  20. import org.ros.message.MessageListener;  
  21. import org.ros.namespace.GraphName;  
  22. import org.ros.node.Node;  
  23. import org.ros.node.NodeMain;  
  24. import org.ros.node.topic.Subscriber;  
  25.   
  26. /** 
  27.  * This is a simple rosjava {@link Subscriber} {@link Node}. It assumes an 
  28.  * external roscore is already running. 
  29.  *  
  30.  * @author damonkohler@google.com (Damon Kohler) 
  31.  */  
  32. public class Listener implements NodeMain {  
  33. @Override  
  34.   public GraphName getDefaultNodeName() {  
  35.     return new GraphName("rosjava_tutorial_pubsub/listener");  
  36.   }  
  37.   
  38.   @Override  
  39.   public void onStart(Node node) {  
  40.     final Log log = node.getLog();  
  41.     Subscriber<org.ros.message.std_msgs.string> subscriber =  
  42.         node.newSubscriber("chatter""std_msgs/String");  
  43.     subscriber.addMessageListener(new MessageListener<org.ros.message.std_msgs.string>() {  
  44.       @Override  
  45.       public void onNewMessage(org.ros.message.std_msgs.String message) {  
  46.         log.info("I heard: \"" + message.data + "\"");  
  47.       }  
  48.     });  
  49.   }  
  50.   
  51.   @Override  
  52.   public void onShutdown(Node node) {  
  53.   }  
  54.   
  55.   @Override  
  56.   public void onShutdownComplete(Node node) {  
  57.   }  
  58. }  

今回重要なのは以下の2つですね。

1.まずSubscriberの作成は以下です。Publisherのときと同じで文字列で型を入れてますね。
Subscriber<org.ros.message.std_msgs.String> subscriber =
      node.newSubscriber("chatter", "std_msgs/String");

2.メッセージリスナーの登録。C++でのコールバック関数登録ですね。
関数を定義をそのまま引数に入れています。
subscriber.addMessageListener(new MessageListener<org.ros.message.std_msgs.String>() {
      @Override
      public void onNewMessage(org.ros.message.std_msgs.String message) {
        log.info("I heard: \"" + message.data + "\"");
      }
});

MessageListenerは以下のような定義です。
  1. public interface MessageListener<t> {  
  2.   void onNewMessage(T message);  
  3. }  
  4. </t>  


ログはnode.getLog().info("hogehoge")という形式ですね。

これでPubSubができました。実行方法は過去記事を参照ください。

0 件のコメント:

コメントを投稿