iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 13
1
自我挑戰組

ROS自學筆記系列 第 13

Day 13 - 使用C++撰寫Subscriber

  • 分享至 

  • xImage
  •  

這篇應該是topic系列的最後一篇了,最近居然被催文章進度說太慢了,我只是想驗證node之間可以用不同語言也能溝通,才會寫了這麼多篇用不同語言寫的node嘛 QQ

好吧所以我們一樣先從官網範例中拿到listener.cpp的資料:

$ roscd beginner_tutorials/src
$ wget https://raw.github.com/ros/ros_tutorials/kinetic-devel/roscpp_tutorials/listener/listener.cpp

接著就可以來解析程式碼啦:

  1  #include "ros/ros.h"
  2  #include "std_msgs/String.h"
  3
  4  void chatterCallback(const std_msgs::String::ConstPtr& msg)
  5  {
  6    ROS_INFO("I heard: [%s]", msg->data.c_str());
  7  }
  8
  9  int main(int argc, char **argv)
 10  {
 11    ros::init(argc, argv, "listener");
 12    ros::NodeHandle n;
 13    ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
 14    ros::spin();
 15    return 0;
 16  }

其實好像就...跟之前差不多 XD
subscriber一樣就是持續監聽某個topic,並且在收到訊息的時候呼叫一個callback function,對該訊息執行相對應的動作,方法subscribe的定義如下:

template<class M>
ros::Subscriber subscribe(const std::string& topic, uint32_t queue_size, <callback>, const ros::TransportHints& transport_hints = ros::TransportHints());

這個函式底下有四個參數,第一個和第二個我們應該講到爛了就是topic的名稱和訊息佇列的大小,第三個參數是callback function,第四個則是關於傳輸的一些指令,關於三跟四的參數我會在底下一一介紹。

Callback function

callback的參數在C++裡面可以吃不一樣的型別,但基本上都是用指標在存這個變數,大概有下面這六種變化:

   1 void callback(boost::shared_ptr<std_msgs::String const>);
   2 void callback(std_msgs::StringConstPtr);
   3 void callback(std_msgs::String::ConstPtr);
   4 void callback(const std_msgs::String&);
   5 void callback(std_msgs::String);
   6 void callback(const ros::MessageEvent<std_msgs::String const>&);

基本上都是std_msgs底下的指標,應該內部有不同的方法可以呼叫,這個就用到的時候再去察看吧!

Transport Hints

這個參數雖然在我們的主程式裡面沒有用到,但是因為API文件裡面有提到,我就還是一起拿出來講吧~
這個參數大概就是設定傳輸層在收到訊息的時候要怎麼過濾訊息的方法,大概有以下幾種,可以用.串接:

ros::TransportHints()
        .reliable()
        .unreliable()
        .maxDatagramSize(1000)
        .tcpNoDelay();

reliable()unreliable()是指定要接收的訊息是透過TCP還是UDP傳輸的;maxDatagramSize()就是限制收到的訊息大小,tcpNoDelay()就是可以提高傳輸速度啦,預設是true這樣。


終於解析完code啦,接著就是編譯跟執行囉!
編譯的話一樣要去package底下的CMakelist.txt新增執行檔跟設定相依的函式庫:

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})

make完以後就可以執行啦,既然現在我們有兩組publisher和兩組subscriber,就可以來玩看看nodenode之間的溝通囉!
ROS node 多對多執行畫面
可以看出右邊的兩個subscriber都可以接收的到左邊publisher發送出去的訊息囉!

參考資料

ROS API - TransportHints Class Reference


上一篇
Day 12 - 使用C++撰寫Publisher
下一篇
Day 14 - ROS Topic 常用指令 & ROS Graph
系列文
ROS自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言