我有问题。我有两个节点,节点1和node2,其中node1在node2中发送一个浮点数,node2在node1中发送一个浮点数。在函数回调中,我想要将收到的信息与其他值相加并更新变量。但问题是我没有成功发送信息,因为终端只在输出中打印第一次更新(对于节点1我得到2.9,节点2 2.0) 这些代码用于node1和node2
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
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
答案 0 :(得分:3)
问题是您将x1
和x2
声明为global
个变量。在每次迭代时,它们的值分别重置为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()
<强>节点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()
运行这两个节点时,控制台输出如下:
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
希望这有帮助。