2016-11-09 39 views
2

我目前正在尝试在Python中创建一个既有用户又有发布者的ROS节点。与发布者和订阅者一起编写一个ros节点?

我已经看到了其中消息在回调中公布的例子,但我希望它“不断地”发布消息,并进行回调时,它是这样的。

这里是我如何做到这一点现在:

#!/usr/bin/env python 

import rospy 
from std_msgs.msg import Empty 
from std_msgs.msg import String 
import numpy as np 

pub = rospy.Publisher('/status', String, queue_size=1000) 

def callback(data): 
    print "Message received" 

def listener(): 

    rospy.init_node('control', anonymous=True) 

    rospy.Subscriber('control_c', Empty, callback) 
    rospy.spin() 

if __name__ == '__main__': 
    print "Running" 
    listener() 

所以我应该在哪里公布?

+1

我把你的问题的文本缩短为只有真正相关的部分(在一个节点中发布和订阅是非常普遍的,不需要证明你为什么要这么做)。如果您不同意,请随时恢复我的修改。 – luator

回答

1

简单地用下面的循环替换rospy.spin()

while not rospy.is_shutdown(): 
    # do whatever you want here 
    pub.publish(foo) 
    rospy.sleep(1) # sleep for one second 

当然,你可以调整睡眠时间,以任何你想要的值(或者甚至完全删除)。

根据rospy this reference用户在一个单独的线程运行,所以你并不需要主动打电话旋转。

请注意,在roscpp中(即使用C++时),这是不同的处理方式。你必须在while循环中调用ros::spinOnce()

2

嗯,我认为这里有很多解决方案,你甚至可以使用python进程,但是我提议的是使用ros Timer的ROS方法。

我在python中并没有那么高效,但是这段代码可能会让你高兴起来。

#!/usr/bin/env python 

import rospy 
from std_msgs.msg import Empty 
from std_msgs.msg import String 
import numpy as np 

last_data = "" 
started = False 
pub = rospy.Publisher('/status', String, queue_size=1000) 

def callback(data): 
    print "New message received" 
    global started, last_data 
    last_data = data 
    if (not started): 
     started = True 

def timer_callback(event): 
    global started, pub, last_data 
    if (started): 
     pub.publish(last_data) 
     print "Last message published" 


def listener(): 

    rospy.init_node('control', anonymous=True) 

    rospy.Subscriber('control_c', String, callback) 
    timer = rospy.Timer(rospy.Duration(0.5), timer_callback) 

    rospy.spin()  
    timer.shutdown() 

if __name__ == '__main__': 
    print "Running" 
    listener() 

在这里,您的回调会更新消息,您的计时器将每0.5秒触发一次并发布最后收到的数据。

可以通过在“/ contriol_c”每3秒发布数据和配置你定时器以0.5秒的测试此代码。开始回显/状态

$ rostopic echo /status 

而且您将以2 Hz的速率发布您的消息。

希望有帮助!

相关问题