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