使用来自ROS -Python中多个主题的数据



我能够显示两个主题的数据,但我无法实时使用和计算数据,从ROS中的这两个主题(用Python代码编写(。

您有任何想法库存这些数据并实时计算吗?

谢谢;(

#!/usr/bin/env python
import rospy
import string
from std_msgs.msg import String 
from std_msgs.msg import Float64MultiArray
from std_msgs.msg import Float64
import numpy as np

class ListenerVilma:
    def __init__(self):
        self.orientation = rospy.Subscriber('/orientation', Float64MultiArray , self.orientation_callback)
        self.velocidade = rospy.Subscriber('/velocidade', Float64MultiArray, self.velocidade_callback)
    def orientation_callback(self, orientation):
        print orientation
    def velocidade_callback(self, velocidade):
        print velocidade

if __name__ == '__main__':
   rospy.init_node('listener', anonymous=True)
   myVilma = ListenerVilma()
   rospy.spin()

可能的解决方案:

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float64MultiArray

class Server:
    def __init__(self):
        self.orientation = None
        self.velocity = None
    def orientation_callback(self, msg):
        # "Store" message received.
        self.orientation = msg
    def velocity_callback(self, msg):
        # "Store" the message received.
        self.velocity = msg

if __name__ == '__main__':
    rospy.init_node('listener')
    server = Server()
    rospy.Subscriber('/orientation', Float64MultiArray , server.orientation_callback)
    rospy.Subscriber('/velocity', Float64MultiArray, server.velocity_callback)
    rospy.spin()

现在,您拥有self.orientationself.velocity形式的"数据库存",您可以使用它来实时计算。

例如:

#!/usr/bin/env python
import rospy
from std_msgs.msg import Float64MultiArray

class Server:
    def __init__(self):
        self.orientation = None
        self.velocity = None
    def orientation_callback(self, msg):
        # "Store" message received.
        self.orientation = msg
        # Compute stuff.
        self.compute_stuff()
    def velocity_callback(self, msg):
        # "Store" the message received.
        self.velocity = msg
        # Compute stuff.
        self.compute_stuff()
    def compute_stuff(self):
        if self.orientation is not None and self.velocity is not None:
            pass  # Compute something.

if __name__ == '__main__':
    rospy.init_node('listener')
    server = Server()
    rospy.Subscriber('/orientation', Float64MultiArray , server.orientation_callback)
    rospy.Subscriber('/velocity', Float64MultiArray, server.velocity_callback)
    rospy.spin()

您需要Message_Filter来同步多个消息。阅读此http://wiki.ros.org/message_filters#example_.28python.29-1

最新更新