在 ROS 中使用来自多个主题的数据 - Python
Use data from multiple topics in 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()
现在您有一个 "stock of data",形式为 self.orientation
和 self.velocity
,您可以将其用于 "compute in real time"。
例如:
#!/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
我能够显示来自两个主题的数据,但我无法在 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()
现在您有一个 "stock of data",形式为 self.orientation
和 self.velocity
,您可以将其用于 "compute in real time"。
例如:
#!/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