[ROS]PublisherとSubscriberを1つのノードに書く方法

ROS(Robot Operating System)

ロボット・アプリケーション作成を支援するライブラリとツールを提供しているミドルウェアです.
これによりロボット同士の通信が簡易にできるようになります.

Pub & Sub通信

ROSでは,ROSのネットワークにつながった実行可能なものを"ノード"とよび,ノード間で"トピック"とよばれるメッセージをやり取りします.
メッセージを配信するノードをPublisher(配信者),メッセージを受信するノードをSubscriber(購読者)と呼びます.

PubSub通信

実行環境

Publisherのプログラム

import rospy
from std_msgs.msg import String

def talker():
    # Publisher('Topic Name', Type, Size)
    pub = rospy.Publisher('chatter', String, queue_size=10)
    # Init Nonde
    rospy.init_node('talker', anonymous=True)
    # Roop Period
    rate = rospy.Rate(10) # 10hz
    
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        # Publish Data
        pub.publish(hello_str)
        rate.sleep()

  if __name__ == '__main__':
       try:
         talker()
     except rospy.ROSInterruptException:
         pass

Subscriberのプログラム

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
     
def listener():
    # Init Nonde
    rospy.init_node('listener', anonymous=True)
    # Subscriber('Topic Name', Type, Callback function)
    rospy.Subscriber("chatter", String, callback)
    rospy.spin()

 if __name__ == '__main__':
    listener()

PublisherとSubscriberのプログラム

PublisherとSubscriberを1つのノードで書くと以下のようになる。

import rospy
from std_msgs.msg import String

def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
      
def controller():
    # Init Node
    rospy.init_node('controller', anonymous=True)
    # Subscriber
    sub = rospy.Subscriber('listener', String, callback)
    # Publisher
    pub = rospy.Publisher('talker', String, queue_size=1)
    # Roop Period
    rate = rospy.Rate(10)
    
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        # Publish Data
        pub.publish(hello_str)
        rate.sleep()
    
if __name__ == '__main__':
    try:
        controller()
    except rospy.ROSInitException:
        pass

参考

Tags: