2016-11-09 71 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的速率發佈您的消息。

希望有幫助!

相關問題