Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 更新Rospy中的全局变量_Python 2.7_Rospy - Fatal编程技术网

Python 2.7 更新Rospy中的全局变量

Python 2.7 更新Rospy中的全局变量,python-2.7,rospy,Python 2.7,Rospy,我有问题。我有两个节点,节点1和节点2,其中节点1在节点2中发送浮点数,节点2在节点1中发送浮点数。在函数回调中,我希望将收到的信息与其他值相加,并更新变量。但问题是我没有成功发送信息,因为终端只在输出中打印第一次更新(对于节点1,我得到2.9,节点2.0) 这些代码用于节点1和节点2 Node1 !/usr/bin/env python import rospy import time from std_msgs.msg import Float64

我有问题。我有两个节点,节点1和节点2,其中节点1在节点2中发送浮点数,节点2在节点1中发送浮点数。在函数回调中,我希望将收到的信息与其他值相加,并更新变量。但问题是我没有成功发送信息,因为终端只在输出中打印第一次更新(对于节点1,我得到2.9,节点2.0) 这些代码用于节点1和节点2

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


问题是您将
x1
x2
声明为
全局变量。在每次迭代中,它们的值分别重置为
1.5
2.4
。因此,公布的值是那些值加上
0.5
(即
2.0
2.9

如果我理解正确,您希望两个节点不断更新彼此的值(对于
x1
x2
)。我将节点编写为类,并将全局变量替换为实例变量:

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

#!/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()
#!/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()
运行这两个节点时,控制台输出如下:

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

希望这能有所帮助。

我对ROS非常陌生,正在尝试将ROS节点构建为订阅者和发布者。通过使用全局
pub
sub
变量来实现这一点是否被认为是不好的做法?或者最好将
pub
作为参数传递给
回调
?还是必须按照你的方式使用课程?