接下來兩篇又回到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_tutorials
的CMakeList.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
實際執行畫面長這樣:
使用rostopic echo
這個指令就可以監聽該topic
收到的訊息囉!