ROS

ROS tutorials 系列(10) – Writing a Simple Publisher and Subscriber

原文: (因為C++版本跟Python版本的內容差不多,還有Examine那篇也只有幾個指令,所以乾脆一併寫,不過我主要只會就C++那篇的內容來說明,因為其他東西大同小異)

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29

http://wiki.ros.org/ROS/Tutorials/ExaminingPublisherSubscriber

這一篇教學總算cover到比較需要寫程式的部分,主要就是教大家怎麼寫兩個node,並透過topic傳輸。接下來就來看看這個程式要怎麼寫。
————————————————————————————

1.1 Writing the Publisher Node

這邊提到的publisher就是負責把資料丟到topic的那個node。這一小節的重點實際上是在1.1.2小節的詳細解釋裡面,我就比較重要的地方增加一點說明。

基本上,include “ros/ros.h”這一步就是讓你的程式可以成為ROS Node的一個起點,因為要成為ROS Node,你的程式就必須呼叫ROS提供的API,所以你必須先include ros.h,才能開始使用ROS的API。

接下來的問題就是,怎麼使用ROS的API?

原本的tutorial裡面已經講得滿清楚了,其實就是用ros::init()跟ros::NodeHandle來初始化你的node,然後你就可以用NodeHandle初始化publisher的物件,之後再呼叫publisher物件的publish()就可以把資料丟出去了。

看到後面大家可能會有個疑惑,就是不知道為什麼要注意發佈的頻率? 我自己的經驗是,如果publisher跟subscriber指定的頻率不一致,就會漏收很多資料,導致機器人的行為怪怪的(這個bug曾經卡了我一天,因為怎麼看都覺得程式碼沒問題,但機器人都不會按照我要的路徑行走,後來才發現送trajectory跟收trajectory的node頻率不一致)

1.2 Writing the Subscriber Node

這一小節應該比較好理解,程式主要要做的事情就是讓subscriber收到資料之後,呼叫callback function把收到的資料印出來,之所以要這樣設計也很單純,因為你在寫程式的時候根本不可能知道什麼時候會收到資料,所以你當然也就不可能先在main裡面指定好什麼時候要收資料。

Again,1.2.2才是重點,這邊比較要注意的是ros::spin()這個函式,如果你的listener程式裡面沒有這一行,那你一執行listener,程式就會立刻跑完,因為程式該執行的東西都已經執行完了。為了避免這件事情,就需要ros::spin(),他在做的事情有點像是while(ros::ok()),但還是讓你的callback function可以被呼叫。

1.3 Building your nodes

這一小節只是在教大家怎麼進行編譯的步驟,應該就不太需要再多說明了。

最後,第三篇的原文有cover到怎麼執行剛剛編譯完成的執行檔,我想這個應該就不需要再多加註解了。

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s