2016-05-22 5 views
0

Я хочу создать два узла, которые обмениваются данными друг с другом. Я хочу, чтобы node1 получал информацию от узла2 и выполнял некоторые операции (например, сумму информации в узлах 1 и 2) и наоборот. Как я могу это реализовать? Это код Node1 до сих пор:Связь между узлами ROS (Python)

#!/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 
+0

ROS имеет назначенный [QA форум] (http://answers.ros.org/), где вы можете получить довольно хороший отклик. Почему бы вам не открыть там вопрос и вставить ссылку сюда? – IsaacS

ответ

0

Ваша проблема заключается в том, что node1 создает себя с очередью 10, но затем node2 пытается отправить 51 элементов в эту очередь. node2 будет блокироваться до node1 обрабатывает некоторые элементы в очереди. Беда в том, что node1 аналогичным образом заблокирован, потому что он пытается отправить 51 товар в node2.

Дешевый и жизнерадостный рабочий стол - установить размер очереди до 100. Лучшее решение подразумевает не отправку, если в очереди есть что-то.

+0

Спасибо, но моя цель - передать информацию, отправленную узлом2, и выполнить сумму с информацией в узле1. – oigna

0

Чтобы сделать что-то с информацией, отправленной узлом 2, вам необходимо изменить обратный вызов абонента в узле 1. Обратный вызов вызывается всякий раз, когда вы получаете сообщение при условии, что вы вызвали spin.

Вы должны изменить узел 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