ROS 懶人筆記 3 — 以C++撰寫Publisher與Subscriber

Raymond Chen
6 min readJun 21, 2018

--

Publisher 的撰寫 (C++)

src/talker.cpp

總結所有步驟:

  • 加入ROS公用的header與使用的的message header
#include "ros/ros.h"
#include "std_msgs/String.h"
  • 初始化並指定node名稱
ros::init(argc, argv, "talker");
  • 建立node的”握把“ (handle) 與 Publisher物件
ros::NodeHandle n;
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  • 設定publish頻率
ros::Rate loop_rate(10);
  • 撰寫publish區段
while(ros::ok())
{
std_msgs::Strings msg;
//...
chatter_pub.publish(msg);
ros::spinOnce();loop_rate.sleep();
}

Subscriber 的撰寫 (C++)

src/listener.cpp

總結所有步驟:

  • 加入ROS公用的header與使用的的message header
#include "ros/ros.h"
#include "std_msgs/String.h"
  • 初始化並指定node名稱
ros::init(argc, argv, "listener");
  • 建立node的”握把“ (handle) 、Subscribe物件與對應的回呼函式名
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  • 使用ros::spin()或ros::spinOnce()進行回呼函式呼叫
ros::spin()
  • 於主函式外,撰寫subscribe的回呼函式,參數設定為訂閱message的常數指標參考
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
// do anything you want ...
ROS_INFO("I heard: [%s]", msg->data.c_str());
}

最後記得要修改package.xml與CMakeLists.txt

  • package.xml 中uncomment以下兩行
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
  • CMakeLists.txt 中,記得先加入message相關的指令(參考連結),之後在於最底下加入建立執行檔、連結函式庫與新增相依項目的指令

執行publisher與subscriber (使用rosrun)

  • 先啟動master node
roscore
  • 以source指令設定環境
# In your catkin workspace
$ cd ~/catkin_ws
$ source ./devel/setup.bash
  • 以rosrun執行beginner_tutorials package中的publisher (在此名稱為talker)
$ rosrun beginner_tutorials talker[INFO] [WallTime: 1314931831.774057] hello world 1314931831.77 [INFO] [WallTime: 1314931832.775497] hello world 1314931832.77 [INFO] [WallTime: 1314931833.778937] hello world 1314931833.78 [INFO] [WallTime: 1314931834.782059] hello world 1314931834.78 [INFO] [WallTime: 1314931835.784853] hello world 1314931835.78 [INFO] [WallTime: 1314931836.788106] hello world 1314931836.79
...
  • 以rosrun執行beginner_tutorials package中的subscriber (在此名稱為listener)
$ rosrun beginner_tutorials listener[INFO] [WallTime: 1314931969.258941] /listener_17657_1314931968795I heard hello world 1314931969.26 [INFO] [WallTime: 1314931970.262246] /listener_17657_1314931968795I heard hello world 1314931970.26 [INFO] [WallTime: 1314931971.266348] /listener_17657_1314931968795I heard hello world 1314931971.26 [INFO] [WallTime: 1314931972.270429] /listener_17657_1314931968795I heard hello world 1314931972.27 [INFO] [WallTime: 1314931973.274382] /listener_17657_1314931968795I heard hello world 1314931973.27 [INFO] [WallTime: 1314931974.277694] /listener_17657_1314931968795I heard hello world 1314931974.28 [INFO] [WallTime: 1314931975.283708] /listener_17657_1314931968795I heard hello world 1314931975.28
...

Reference :

--

--

Raymond Chen
Raymond Chen

Written by Raymond Chen

AI enthusiast passionate about Data Science, Machine Learning, Deep Learning, Self-Driving Car and Robotics

No responses yet