2016-05-22 8 views
1

Ich habe das Problem. Ich habe zwei Knoten, Knoten 1 und Knoten2, wobei Knoten1 eine Gleitkommazahl in Knoten2 sendet und Knoten2 eine Gleitkommazahl in Knoten1 sendet. Im Funktionsrückruf möchte ich die empfangene Information mit anderem Wert summieren und die Variable aktualisieren. Aber das Problem ist, dass ich es nicht schaffen, die Informationen gesendet werden, weil die Anschluss druckt in Ausgabe nur erste Update (für den Knoten 1 i 2.9 bekommen, und Knoten 2 2.0) Diese Code für node1 und Knoten2Aktualisieren Sie die globale Variable in Rospy

Node1 
    !/usr/bin/env python 
    import rospy 
    import time 
    from std_msgs.msg import Float64 
    global x1 
    global a 
    x1 = 1.5 
    def callback(msg): 
     #print 'Sto ricevendo informazioni da %s nel tempo %s' % (msg.data, time.ctime()) 
     #print "%f"%msg.data 
     a = msg.data 
     info_nodo2 = a + 0.5 
     x1 = info_nodo2 
     print "%f"%x1 
    def nodo(): 
     pub = rospy.Publisher('chatter1', Float64) 
     rospy.init_node('nodo1', anonymous=True) 
     rospy.loginfo("In attesa") 
     rospy.Subscriber('chatter2', Float64, callback) 
     rate = rospy.Rate(1) # 10hz 
     while not rospy.is_shutdown(): 
      for i in range(1,51): 
       #rospy.loginfo(num) 
       pub.publish(x1) 
       rate.sleep() 
      rospy.spin() 
    if __name__ == '__main__': 
     try: 
      nodo() 
     except rospy.ROSInterruptException: 
      pass 

Node2 

    import rospy 
    import time 
    from std_msgs.msg import Float64 
    global x2 
    global a 
    x2 = 2.4 
    def callback(msg): 
     #print 'Sto ricevendo informazioni da %s nel tempo %s' % (msg.data, time.ctime()) 
     #print "%f"%msg.data  
     a = msg.data 
     info_nodo1 = a + 0.5 
     x2 = info_nodo1 
     print "%f"%x2 
    def nodo(): 
     pub = rospy.Publisher('chatter2', Float64) 
     rospy.init_node('nodo2', anonymous=True) 
     rospy.loginfo("In attesa") 
     rospy.Subscriber('chatter1', Float64, callback) 
     rate = rospy.Rate(1) # 10hz 
     while not rospy.is_shutdown(): 
      for i in range(1,51): 
       # num = "%s" % (x2) 
       #rospy.loginfo(num) 
       pub.publish(x2) 
       rate.sleep() 
      rospy.spin() 
    if __name__ == '__main__': 
     try: 
      nodo() 
     except rospy.ROSInterruptException: 
      pass 

Antwort

0

Das Problem ist, dass Sie x1 und x2 als global Variablen deklarieren. Bei jeder Iteration werden ihre Werte auf 1.5 bzw. 2.4 zurückgesetzt. Somit sind die veröffentlichten Werte jene Werte plus 0.5 (d. H. 2.0 und 2.9).

Wenn ich richtig verstanden habe, möchten Sie, dass die beiden Knoten ihre Werte gegenseitig aktualisieren (für x1 und x2). Ich schrieb die Knoten als Klassen statt und ersetzt die globalen Variablen von Instanzvariablen:

Node1:

#!/usr/bin/env python 
# -*- encoding: utf-8 -*- 
import rospy 
import std_msgs.msg 


class Nodo(object): 
    def __init__(self): 
     # Params 
     self.x1 = 1.5 
     self.a = None 

     # Node cycle rate (in Hz). 
     self.loop_rate = rospy.Rate(10) 

     # Publishers 
     self.pub = rospy.Publisher("~chatter1", std_msgs.msg.Float64, queue_size=10) 

     # Subscribers 
     rospy.Subscriber("~chatter2", std_msgs.msg.Float64, self.callback) 

    def callback(self, msg): 
     self.a = msg.data 
     self.x1 = self.a + 0.5 
     rospy.loginfo("x1: {}".format(self.x1)) 

    def start(self): 
     rospy.loginfo("In attesa") 

     while not rospy.is_shutdown(): 
      for ii in xrange(1, 51): 
       self.pub.publish(self.x1) 
       self.loop_rate.sleep() 

if __name__ == '__main__': 
    rospy.init_node("nodo1", anonymous=True) 
    my_node = Nodo() 
    my_node.start() 

Knoten2:

#!/usr/bin/env python 
# -*- encoding: utf-8 -*- 
import rospy 
import std_msgs.msg 


class Nodo(object): 
    def __init__(self): 
     # Params 
     self.x2 = 2.4 
     self.a = None 

     # Node cycle rate (in Hz). 
     self.loop_rate = rospy.Rate(10) 

     # Publishers 
     self.pub = rospy.Publisher("~chatter2", std_msgs.msg.Float64, queue_size=10) 

     # Subscribers 
     rospy.Subscriber("~chatter1", std_msgs.msg.Float64, self.callback) 

    def callback(self, msg): 
     self.a = msg.data 
     self.x2 = self.a + 0.5 
     rospy.loginfo("x2: {}".format(self.x2)) 

    def start(self): 
     rospy.loginfo("In attesa") 

     while not rospy.is_shutdown(): 
      for ii in xrange(1, 51): 
       self.pub.publish(self.x2) 
       self.loop_rate.sleep() 

if __name__ == '__main__': 
    rospy.init_node("nodo2", anonymous=True) 
    my_node = Nodo() 
    my_node.start() 

Wenn diese beiden Knoten die Konsolenausgabe läuft ist wie folgt:

process[nodo_1-1]: started with pid [7688] 
process[nodo_2-2]: started with pid [7689] 
[INFO] [WallTime: 1478865725.627418] In attesa 
[INFO] [WallTime: 1478865725.627904] In attesa 
[INFO] [WallTime: 1478865725.725064] x2: 2.0 
[INFO] [WallTime: 1478865725.725512] x1: 2.5 
[INFO] [WallTime: 1478865725.825050] x2: 3.0 
[INFO] [WallTime: 1478865725.825448] x1: 3.5 
[INFO] [WallTime: 1478865725.925056] x2: 4.0 
[INFO] [WallTime: 1478865725.925608] x1: 4.5 
[INFO] [WallTime: 1478865726.025061] x2: 5.0 
[INFO] [WallTime: 1478865726.025617] x1: 5.5 
[INFO] [WallTime: 1478865726.125045] x2: 6.0 
[INFO] [WallTime: 1478865726.125605] x1: 6.5 
[INFO] [WallTime: 1478865726.225033] x2: 7.0 
[INFO] [WallTime: 1478865726.225586] x1: 7.5 
[INFO] [WallTime: 1478865726.325013] x2: 8.0 
[INFO] [WallTime: 1478865726.325606] x1: 8.5 
[INFO] [WallTime: 1478865726.425041] x2: 9.0 
[INFO] [WallTime: 1478865726.425608] x1: 9.5 
[INFO] [WallTime: 1478865726.525057] x2: 10.0 
[INFO] [WallTime: 1478865726.525545] x1: 10.5 
[INFO] [WallTime: 1478865726.625054] x2: 11.0 

Hoffe das hilft.