はじめに
ROSでは複数のトピックをSubscribeする場合が多いので、そのときのやり方をメモ
以下の記事がとても参考になりました。
ROSで複数のトピックから同期的にメッセージを受け取る
#方法
複数のメッセージをSubscribeするには、message_filters
を使う。
例えば、ROSのtutorialsのlistenerを拡張すると、
#/usr/bin/env python
import message_filters
import rospy
from std_msgs.msg import Int32
# Define callback
def callback(msg1, msg2):
print(msg1.data)
print(msg2.data)
# Initialize Subscriber node
rospy.init_node('listener')
# Define Subscriber
sub1 = message_filters.Subscriber('listener1', Int32)
sub2 = message_filters.Subscriber('listener2', Int32)
queue_size = 10
fps = 100.
delay = 1 / fps * 0.5
mf = message_filters.ApproximateTimeSynchronizer([sub1, sub2], queue_size, delay)
mf.registerCallback(callback)
rospy.spin()
message_filters.ApproximateTimeSynchronizer()
で複数のsubscriberを同期している。
尚、python2の場合は、fps=100.
のようにfloat型にしなければdelay=0
と計算されてしまうので注意!