iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 18
1
自我挑戰組

ROS自學筆記系列 第 18

Day 18 - 使用C++撰寫Server Node

  • 分享至 

  • xImage
  •  

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.txtpackage.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啦! 這個函式吃兩個參數,分別是RequestResponse的物件,這兩個物件分別代表輸入和輸出。從client端收到req後,在第7行做一個加總的動作,把加總結果存在ressum屬性中。

第18行的advertiseService函式定義如下:

template<class MReq, class MRes>
ros::ServiceServer nh.advertiseService(const std::string& service, <callback>);

基本上就是吃一個service namecallback function囉!

好啦現在程式的部分結束了,接下來就是編譯的部分了。
剛剛上面提到因為我們新增了一個package,所以要去修改CMakeList.txtpackage.xml檔的相依模組的部分:

  • In CMakeList.txt:
    在find_package底下新增一個rospy_tutorial package:
    CMakeList修改畫面
  • In package.xml:
    在build_depend、build_export_depend和exec_depend底下都各新增一個rospy_tutorial:
    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 server執行畫面
可以看到如果我沒給參數的話是沒辦法執行的,一定要給兩個參數他才會進行加總的動作囉!

參考資料

ROS Tutorials - service in cpp
ROS wiki - roscpp Services


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

尚未有邦友留言

立即登入留言