[ROS]PublisherとSubscriberを1つのノードに書く方法
ROS(Robot Operating System)
ロボット・アプリケーション作成を支援するライブラリとツールを提供しているミドルウェアです.
これによりロボット同士の通信が簡易にできるようになります.
Pub & Sub通信
ROSでは,ROSのネットワークにつながった実行可能なものを"ノード"とよび,ノード間で"トピック"とよばれるメッセージをやり取りします.
メッセージを配信するノードをPublisher(配信者),メッセージを受信するノードをSubscriber(購読者)と呼びます.
実行環境
- ROS kinetic
- Ubuntu 16.04 LTS
- Python 3.8.5
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: