ROS节点间通信(Python)
Communication between nodes ROS (Python)
我想创建两个相互通信的节点。我希望 node1 从 node2 接收信息并执行一些操作(例如,节点 1 和 2 中的信息总和),反之亦然。我该如何实施?到目前为止,这是 Node1 的代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(msg):
print '%s' % msg.data
def nodo():
pub = rospy.Publisher('chatter1', String, queue_size=10)
rospy.init_node('nodo1', anonymous=True)
rospy.Subscriber('chatter2', String, callback)
rate = rospy.Rate(1) # 10hz
x = 5
while not rospy.is_shutdown():
for i in range(0,51):
pos1 = "%s" % (x)
pub.publish(pos1)
rate.sleep()
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass
这是Node2的代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(msg):
print '%s' % msg.data
def nodo():
pub = rospy.Publisher('chatter2', String, queue_size=10)
rospy.init_node('nodo2', anonymous=True)
rospy.Subscriber('chatter1', String, callback)
rate = rospy.Rate(1) # 10hz
x2 = 4
while not rospy.is_shutdown():
for i in range(0,51):
pos2 = "%s" % (x2)
pub.publish(pos2)
rate.sleep()
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass
您的问题是 node1
自己创建了一个 10 的队列,然后 node2
试图将 51 个项目发送到该队列。 node2
将阻塞,直到 node1
处理队列中的某些项目。问题是 node1
同样被阻止,因为它试图将 51 个项目发送到 node2
。
一个廉价而愉快的解决方法是将队列大小设置为 100。更好的解决方案是在队列中有任何内容时不发送。
为了对节点 2 发送的信息进行处理,您必须更改节点 1 中的订阅者回调。只要您调用了 spin
,就会在收到消息时调用回调。 =14=]
您必须更改节点 1,以便:
- 代码调用
spin
(在你的代码中它没有,它卡在 while
)。
- 回调函数处理消息中的信息并发回。
import rospy
from std_msgs.msg import String
pub = None
def callback(msg):
x = int(msg.data)
pub.publish(str(x + 5))
def nodo():
global pub
rospy.init_node('nodo1', anonymous=True)
pub = rospy.Publisher('chatter1', String, queue_size=10)
rospy.Subscriber('chatter2', String, callback)
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass
我想创建两个相互通信的节点。我希望 node1 从 node2 接收信息并执行一些操作(例如,节点 1 和 2 中的信息总和),反之亦然。我该如何实施?到目前为止,这是 Node1 的代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(msg):
print '%s' % msg.data
def nodo():
pub = rospy.Publisher('chatter1', String, queue_size=10)
rospy.init_node('nodo1', anonymous=True)
rospy.Subscriber('chatter2', String, callback)
rate = rospy.Rate(1) # 10hz
x = 5
while not rospy.is_shutdown():
for i in range(0,51):
pos1 = "%s" % (x)
pub.publish(pos1)
rate.sleep()
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass
这是Node2的代码:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
def callback(msg):
print '%s' % msg.data
def nodo():
pub = rospy.Publisher('chatter2', String, queue_size=10)
rospy.init_node('nodo2', anonymous=True)
rospy.Subscriber('chatter1', String, callback)
rate = rospy.Rate(1) # 10hz
x2 = 4
while not rospy.is_shutdown():
for i in range(0,51):
pos2 = "%s" % (x2)
pub.publish(pos2)
rate.sleep()
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass
您的问题是 node1
自己创建了一个 10 的队列,然后 node2
试图将 51 个项目发送到该队列。 node2
将阻塞,直到 node1
处理队列中的某些项目。问题是 node1
同样被阻止,因为它试图将 51 个项目发送到 node2
。
一个廉价而愉快的解决方法是将队列大小设置为 100。更好的解决方案是在队列中有任何内容时不发送。
为了对节点 2 发送的信息进行处理,您必须更改节点 1 中的订阅者回调。只要您调用了 spin
,就会在收到消息时调用回调。 =14=]
您必须更改节点 1,以便:
- 代码调用
spin
(在你的代码中它没有,它卡在while
)。 - 回调函数处理消息中的信息并发回。
import rospy
from std_msgs.msg import String
pub = None
def callback(msg):
x = int(msg.data)
pub.publish(str(x + 5))
def nodo():
global pub
rospy.init_node('nodo1', anonymous=True)
pub = rospy.Publisher('chatter1', String, queue_size=10)
rospy.Subscriber('chatter2', String, callback)
rospy.spin()
if __name__ == '__main__':
try:
nodo()
except rospy.ROSInterruptException:
pass