天天看點

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

一、基本步驟

和話題通訊的步驟基本一樣

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

二、服務端環境構造

這路我們實作用戶端給服務端發送兩個數字,服務端相加得結果發給用戶端

1.定義srv檔案

在功能包目錄下建立srv目錄

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

在目錄下建立srv檔案:

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

寫檔案内容:

其中三個橫杠 —前面的代表用戶端請求的資料,後面的代表服務端要發送給用戶端的應答資料

int64 a
int64 b
---
int64 sum
           
ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

2.在package.xml中添加功能依賴

<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
           

3.在CMakeList中添加編譯選項

• find_package( ……  message_generation)
• catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
• add_service_files(FILES AddTwoInts.srv)
           

4.編譯,生成相關頭檔案

在工作空間根目錄下編譯:

catkin_make
           
ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

三、實作服務端的代碼實作

1.初始化ROS結點

2.建立結點句柄

//建立結點字柄
  ros::NodeHandle n;
           

3.建立Server執行個體

//建立一個名為add_two_ints的server,注冊回調函數add()
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);
           

4.在回調函數中處理資訊

bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //擷取用戶端的請求參數并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

           

5.完整代碼

#include "ros/ros.h"
//添加服務端檔案 頭檔案
#include "learing_communication/AddTwoints"
 bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //擷取用戶端的請求參數并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

int main(int argc,char **argv)
{
  //初始化ros結點
  ros::init(argc,argv,"add_two_ints_server");
  
  //建立結點字柄
  ros::NodeHandle n;
  
  //建立一個名為add_two_ints的server,注冊回調函數add()
  
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);
  
  //列印日志資訊
  ROS_INFO("Read_two_ints:");
  //循環等待回調函數
  ros::spin();
  return 0;
  
}

           

四、實作一個用戶端

1.初始化Ros結點

2.建立ROS結點句柄

3.建立client

//建立一個client,用于發生資訊
 //server支援的消息類型是learning_communication::AddTwoints
 ros::ServiceClient client = n.serviceClient<learing_communication::AddTwoints

           

4.建立learing_communicationL::AddTwoints類型的資料

learing_communication::AddTwoints data;
 data.request.a = atoll(argc[1]);
 data.request.b = atoll(argc[1]);
           

5.釋出資料,并等待應答結果

if (client.call(data)){
  ROS_INFO("sum is:%d",(long int)srv.response.sum);
 }
           

6.完整代碼

#include "ros/ros.h"
//添加服務端檔案 頭檔案
#include "learing_communication/AddTwoints.h"
 bool add(learing_communication::AddTwoints::Request &req,
           learing_communication::AddTwoints::Response &res

)
{
   //擷取用戶端的請求參數并相加
   res.sum=req.a+req.b;
   ROS_INFO("request:x=%d,y=%d",(long int)req.a,(long int)req.b);
   ROS_INFO("sum:%d",(long int)res.sum);
}

int main(int argc,char **argv)
{
  //初始化ros結點
  ros::init(argc,argv,"add_two_ints_server");
  
  //建立結點字柄
  ros::NodeHandle n;
  
  //建立一個名為add_two_ints的server,注冊回調函數add()
  
  ros::ServiceServer service = n.advertiseService("add_two_ints",add);
  
  //列印日志資訊
  ROS_INFO("Read_two_ints:");
  //循環等待回調函數
  ros::spin();
  return 0;
  
}

           

五、編譯工作空間

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試
add_executable(server src/server.cpp) 
target_link_libraries(server ${catkin_LIBRARIES})
 add_dependencies(server ${PROJECT_NAME}_gencpp)
add_executable(client src/client.cpp) 
target_link_libraries(client ${catkin_LIBRARIES})
 add_dependencies(client ${PROJECT_NAME}_gencpp)

           
ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

回到根目錄開始編譯:

catkin_make

           
ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

六、測試

啟動伺服器

rosrun learing_communication server
           
ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試

結果:

發現發給伺服器的兩個數被相加後傳回

ROS機器人005-ROS通信程式設計(服務程式設計)一、基本步驟二、服務端環境構造三、實作服務端的代碼實作四、實作一個用戶端五、編譯工作空間六、測試