2016-05-22 20 views
1

私は問題があります。私は2つのノード、ノード1とノード2を持っています。ここで、node1はnode2に浮動小数点数を送り、node2はnode1に浮動小数点数を送ります。関数コールバックでは、受け取った情報を他の値と合計し、変数を更新したい。しかし、問題は、私はノード1とノード2Rospyのグローバル変数を更新

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 

ため これらのコード出力のみ最初のアップデートで、端末のプリントが(2 2.0をノード1のために私は2.9を取得し、ノード)ので、送信された情報を成功していないということです

答えて

0

問題はx1x2global変数と宣言していることです。各繰り返しで、その値は1.52.4にそれぞれリセットされます。従って、公表された値は、これらの値に0.5(すなわち2.0および2.9)を足した値です。

私が正しく理解している場合は、2つのノードが連続して値(x1x2)を更新するようにします。

ノード1:

#!/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() 

ノード2:私はインスタンス変数でグローバル変数を代わりにクラスとして、あなたのノードを書いて交換

#!/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() 

コンソール出力これら2つのノードが実行されています

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 

これが役に立ちます。

関連する問題