1. 程式人生 > >Rospy的官方教程程式碼講解(一)釋出與訂閱

Rospy的官方教程程式碼講解(一)釋出與訂閱

https://blog.csdn.net/seeseeatre/article/details/79178408

Rospy是什麼
Rospy官方wiki

Rospy是ROS對python的主要介面,通過Rospy API程式猿能夠快速的進行ROS topic,service和param的操作,其主要優勢(對比C++)在於其開發速度,當然執行效率會在一定程度上下滑。


Rospy官方教程(一)
Rospy官方教程

今天先看看官方教程的第一部分,釋出與訂閱

釋出器:

import rospy
from std_msgs.msg import String
 
def talker():
    pub = rospy.Publisher('chatter', String, queue_size=10)
    rospy.init_node('talker', anonymous=True)
    rate = rospy.Rate(10) # 10hz
    while not rospy.is_shutdown():
        hello_str = "hello world %s" % rospy.get_time()
        rospy.loginfo(hello_str)
        pub.publish(hello_str)
        rate.sleep()
 
if __name__ == '__main__':
    try:
        talker()
    except rospy.ROSInterruptException:
        pass
直接劃重點:
匯入std_msgs中的String訊息型別


from std_msgs.msg import String
定義釋出器pub,釋出的題目是chatter,訊息型別是String,然後queue_size是在訂閱者接受訊息不夠快的時候保留的訊息的數量,如果對qos要求低的話可以設為0,不設定的話會出個報警,不過不會出錯
pub = rospy.Publisher('chatter', String, queue_size=10)
接下來這裡初始化了一個名為talker的節點,節點的名字不能以‘/’開頭,因為之後會自動給你加一個。anonymous引數在為True的時候會在原本節點名字的後面加一串隨機數,來保證可以同時開啟多個同樣的節點,如果為false的話就只能開一個。

rospy.init_node('talker', anonymous=True)
這裡初始化一個Rate物件,通過後面的sleep()可以設定迴圈的頻率

rate = rospy.Rate(10) # 10hz
這裡把hello_str釋出出去了
pub.publish(hello_str)
沒了,釋出器就這樣,很簡單吧。。。
執行的時候只要python+檔名.py就好
接下來我們看訂閱器
訂閱器:
#!/usr/bin/env python
import rospy
from std_msgs.msg import String
 
def callback(data):
    rospy.loginfo(rospy.get_caller_id() + "I heard %s", data.data)
    
def listener():
 
    rospy.init_node('listener', anonymous=True)
 
    rospy.Subscriber("chatter", String, callback)
 
    # spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
 
if __name__ == '__main__':
    listener()
重點只有兩句:
這裡初始化了一個訂閱器,訂閱了‘chatter’這個主題,接收的訊息型別為String,每次接收到訊息,就會開一個新執行緒來呼叫callback,每個訂閱器只能有一個callback,另外似乎可以做到通過一個訂閱器訂閱多個主題或多個型別不同的訊息,但我認為應該儘量避免這麼做,尤其是涉及時間敏感度比較高的主題的時候,訊息時間同步這類的事情很難處理。

rospy.Subscriber("chatter", String, callback)
spin()的功能是讓程式在手動停止前一直迴圈,但我其實還不能很好的理解這個語句的用法,總之就是保持主程序一直迴圈吧,我這種微控制器出身的渣渣經常靠while(1)解決問題(~ ̄▽ ̄)~
# spin() simply keeps python from exiting until this node is stopped
    rospy.spin()
執行的方法和上面一樣,python+檔名.py就好

記得要先開啟roscore,否則。。。會報錯。。。

這是第一篇正式的部落格呢。。。

特地去搜了怎麼插入程式碼。。。版面做得也不怎麼漂亮,之後再努努力吧

總之這幾天先隨便穿點自己寫的簡單程式碼上來,其實重點是記錄自己的學習過程,而不是翻譯和轉載已經有的東西