iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 12
0
自我挑戰組

ROS自學筆記系列 第 12

Day 12 - 使用C++撰寫Publisher

  • 分享至 

  • xImage
  •  

接下來兩篇又回到C++的世界啦!
一樣就是先去撈官方網站的範例程式:

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

這樣我們就有一個talker.cpp的程式囉! 裡面的邏輯其實跟之前用python做出來的大同小異:

   1 #include "ros/ros.h"
   2 #include "std_msgs/String.h"
   3 #include <sstream>
   4  
   5 int main(int argc, char **argv)
   6 {
   7   ros::init(argc, argv, "talker");
   8   ros::NodeHandle n;
   9   ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 
  10   ros::Rate loop_rate(10);
  11
  12   int count = 0;
  13   while (ros::ok())
  14   {
  15     std_msgs::String msg;
  16     std::stringstream ss;
  17     ss << "hello world " << count;
  18     msg.data = ss.str();
  19 
  20     ROS_INFO("%s", msg.data.c_str());
  21     chatter_pub.publish(msg);
  22     ros::spinOnce(); 
  23     loop_rate.sleep();
  24     ++count;
  25   }
  26   return 0;
  27 }

其中建立publisher的函式ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);,最主要的就是advertise這個方法,定義長這樣:

template<class M>
ros::Publisher advertise(const std::string& topic, uint32_t queue_size, bool latch = false);

class M 表示的是訊息格式,可以有很多不同的格式。
advertise吃三個參數,第一個參數就是topic的名稱,第二個是訊息佇列的大小,最大可以塞到1000筆,超過的話就會把之前的訊息丟掉,第三個參數latch表示要不要把最後一個訊息留下來傳給下次接收訊息的每個subscriber

接下來就是編譯了,一樣要去beginner_tutorialsCMakeList.txt裡面新增編譯的程式碼:

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

其實本來官方範例裡面還有一行add_dependencies(talker beginner_tutorials_generate_messages_cpp),是用來新增相依的模組的,但是在ROS Groovy以後的版本就只要一行target_link_libraries(talker ${catkin_LIBRARIES}) 就可以囉!

接著回去重新make一次,就可以執行囉!

$ cd ~/catkin_ws
$ catkin_make

實際執行畫面長這樣:
ROS Publisher in C++ 執行畫面
使用rostopic echo這個指令就可以監聽該topic收到的訊息囉!

參考資料

roscpp publisher API


上一篇
Day 11 - 使用Python撰寫Subscriber
下一篇
Day 13 - 使用C++撰寫Subscriber
系列文
ROS自學筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言