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

时间:2018-02-16 15:34:11

标签: python publish-subscribe ros rospy

我能够显示来自两个主题的数据,但我无法使用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()

2 个答案:

答案 0 :(得分:1)

您需要message_filter来同步多条消息。阅读此http://wiki.ros.org/message_filters#Example_.28Python.29-1

答案 1 :(得分:0)

可能的解决方案:

#!/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()