c++版本的node一直都比python版的麻煩一點,不過大致上的流程是一樣的,也就是先初始化一個node以後,新增一個service
的名稱,並為其定義呼叫以後應該要做的function,然後就讓這個node持續運行,當作server
使用。
一樣我們先新增一個add_two_ints_server.cpp
的檔案:
$ roscd beginner_tutorials/src
$ vim add_two_ints_server.cpp
程式碼流程大致上跟我上面講的一樣:
1 #include "ros/ros.h"
2 #include "rospy_tutorials/AddTwoInts.h"
3
4 bool add(rospy_tutorials::AddTwoInts::Request &req,
5 rospy_tutorials::AddTwoInts::Response &res)
6 {
7 res.sum = req.a + req.b;
8 ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]", (long int)res.sum);
10 return true;
11 }
12
13 int main(int argc, char **argv)
14 {
15 ros::init(argc, argv, "add_two_ints_server"); //初始化node
16 ros::NodeHandle n; // node handler
17
18 ros::ServiceServer service = n.advertiseService("add_two_ints", add); //定義service server以及callback function
19 ROS_INFO("Ready to add two ints.");
20 ros::spin(); //持續運行此node
21
22 return 0;
23 }
這邊我們在第二行的時候新增了一個rospy_tutorials
package,所以等一下要去修改CMakeList.txt
和package.xml
檔,讓系統在編譯的時候可以順利找到這個package/library。
4 bool add(rospy_tutorials::AddTwoInts::Request &req,
5 rospy_tutorials::AddTwoInts::Response &res)
6 {
7 res.sum = req.a + req.b;
8 ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
9 ROS_INFO("sending back response: [%ld]", (long int)res.sum);
10 return true;
11 }
第4~11行定義了我們這個service
主要會呼叫的函式,也就是add
啦! 這個函式吃兩個參數,分別是Request
和Response
的物件,這兩個物件分別代表輸入和輸出。從client端收到req
後,在第7行做一個加總的動作,把加總結果存在res
的sum
屬性中。
第18行的advertiseService
函式定義如下:
template<class MReq, class MRes>
ros::ServiceServer nh.advertiseService(const std::string& service, <callback>);
基本上就是吃一個service name
和callback function
囉!
好啦現在程式的部分結束了,接下來就是編譯的部分了。
剛剛上面提到因為我們新增了一個package,所以要去修改CMakeList.txt
和package.xml
檔的相依模組的部分:
CMakeList.txt
:package.xml
:這樣就設定好相依模組囉,接著就是一樣要在CMakeList.txt中將add_two_ints_server.cpp加入編譯中:
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
回到根目錄catkin_ws
,執行完catkin_make
就編譯完成囉!
執行畫面會長這樣:
可以看到如果我沒給參數的話是沒辦法執行的,一定要給兩個參數他才會進行加總的動作囉!
ROS Tutorials - service in cpp
ROS wiki - roscpp Services