上一篇我們學會了如何使用Python寫Node,今天來改用C++囉!
基本上跟Python是做一樣的事情,不過C++會比較麻煩一點,就讓我們繼續看下去吧!
關於ROS的roscpp模組,官網一樣有教學、常用API及文件可以參考,那我們一樣使用C++來寫一個Hello World出來吧!
首先在~/catkin_ws/src/beginner_tutorials/src中新增一個.cpp檔,就可以開始寫程式囉!
$ cd ~/catkin_ws/src/beginner_tutorials/src
$ vim hello.cpp
在hello.cpp中新增以下內容:
#include <ros/ros.h> // 引用 ros.h 檔
int main(int argc, char** argv){
ros::init(argc, argv, "hello_cpp_node"); // 初始化 hello_cpp_node
ros::NodeHandle handler; // node 的 handler
ROS_INFO("Hello World!"); // 印出 Hello World
}
可以看出這個cpp檔跟python檔最大的不同就是多了一個handler,是個用來當作跟node相關的溝通功能如topics, services, parameters 等的介面,其他部分都大同小異,因此就不贅述啦!
cpp檔不像python檔一樣可以直接被執行,需要經過編譯以後才能轉成執行檔,因此我們需要修改beginner_tutorial內的CMakeLists.txt,為其設定好連結的函式庫。
由於他的CMakeLists.txt太長了,在此擷取片段做為參考:
//...上略
## Declare a C++ executable
## ...
## ...
## ...
add_executable(hello.exe src/hello.cpp)
target_link_libraries(hello.exe ${catkin_LIBRARIES})
## Rename C++ executable without prefix
//...下略
修改完CMakeLists.txt後,接著須回到工作區的根目錄,也就是/catkin_ws中再執行一次catkin_make,他就會自己幫我們編譯好hello.cpp的執行檔(hello.exe)囉!

編好的執行檔會放在/catkin_ws/devel/lib/beginner_tutorials裡面,執行後的畫面如下:
記得一樣要有另外一個視窗執行roscore,才有master可以驅動node喔!
接下來修改hello.cpp,一樣新增一個迴圈,讓他在程式執行期間每秒印出一個hello world出來,程式碼如下:
#include <ros/ros.h> // 引用 ros.h 檔
int main(int argc, char** argv){
ros::init(argc, argv, "hello_cpp_node"); // 初始化hello_cpp_node
ros::NodeHandle handler; // node 的 handler
while (ros::ok()){ // 在 ros 順利執行時
ROS_INFO("Hello World!"); // 印出 Hello World
ros::Duration(1).sleep(); // 間隔 1 秒
}
}
修改完hello.cpp後,因為CMakeLists.txt已經改好了,只要再回去執行一次catkin_make,就可以重新編譯出一個新的hello.exe檔囉!
接下來再重新執行一次hello.exe,由於他會一直被執行,因此使用rosnode list這個指令一樣可以看到這個hello_cpp_node正在運行中囉!
到此,我們已經會使用python和c++建立不同的node啦! 小妹在此為大家整理一下撰寫node應該要注意的事項:
CMakeLists.txt才能編譯roscore進行管理的動作rosnode list可以查看有哪些node正在運行中catkin_make只能在該工作區的根目錄才能執行最後,希望大家都可以順利寫出自己的node出來玩一玩囉! 我們明天見~