Writing a Simple Service and Client (C++)
来源:互联网 发布:csgostartrak数据互换 编辑:程序博客网 时间:2024/05/20 02:26
Writing a Simple Service and Client (C++)
Description: This tutorial covers how to write a service and client node in C++.Tutorial Level: BEGINNER
Next Tutorial:Examining the simple service and client
目录
- Writing a Service Node
- The Code
- The Code Explained
- Writing the Client Node
- The Code
- The Code Explained
- Building your nodes
Writing a Service Node
Here we'll create the service ("add_two_ints_server") node which will receive two ints and return the sum.
Change directory into the beginner_tutorials package, you created in the earlier tutorial,creating a package::
roscd beginner_tutorials
Please make sure you have followed the directions in the previous tutorial for creating the service needed in this tutorial,creating the AddTwoInts.srv.
The Code
Create the src/add_two_ints_server.cpp file within the beginner_tutorials package and paste the following inside it:
1 #include "ros/ros.h" 2 #include "beginner_tutorials/AddTwoInts.h" 3 4 bool add(beginner_tutorials::AddTwoInts::Request &req, 5 beginner_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"); 16 ros::NodeHandle n; 17 18 ros::ServiceServer service = n.advertiseService("add_two_ints", add); 19 ROS_INFO("Ready to add two ints."); 20 ros::spin(); 21 22 return 0; 23 }
The Code Explained
Now, let's break the code down.
1 #include "ros/ros.h" 2 #include "beginner_tutorials/AddTwoInts.h" 3
beginner_tutorials/AddTwoInts.h is the header file generated from the srv file that we created earlier.
4 bool add(beginner_tutorials::AddTwoInts::Request &req, 5 beginner_tutorials::AddTwoInts::Response &res )
This function provides the service for adding two ints, it takes in the request and response type defined in the srv file and returns a boolean.
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 }
Here the two ints are added and stored in the response. Then some information about the request and response are logged. Finally the service returns true when it is complete.
18 ros::ServiceServer service = n.advertiseService("add_two_ints", add);
Here the service is created and advertised over ROS.
Writing the Client Node
The Code
Create the src/add_two_ints_client.cpp file within the beginner_tutorials package and paste the following inside it:
1 #include "ros/ros.h" 2 #include "beginner_tutorials/AddTwoInts.h" 3 #include <cstdlib> 4 5 int main(int argc, char **argv) 6 { 7 ros::init(argc, argv, "add_two_ints_client"); 8 if (argc != 3) 9 { 10 ROS_INFO("usage: add_two_ints_client X Y"); 11 return 1; 12 } 13 14 ros::NodeHandle n; 15 ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints"); 16 beginner_tutorials::AddTwoInts srv; 17 srv.request.a = atoll(argv[1]); 18 srv.request.b = atoll(argv[2]); 19 if (client.call(srv)) 20 { 21 ROS_INFO("Sum: %ld", (long int)srv.response.sum); 22 } 23 else 24 { 25 ROS_ERROR("Failed to call service add_two_ints"); 26 return 1; 27 } 28 29 return 0; 30 }
The Code Explained
Now, let's break the code down.
15 ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
This creates a client for theadd_two_ints service. The ros::ServiceClient object is used to call the service later on.
16 beginner_tutorials::AddTwoInts srv; 17 srv.request.a = atoll(argv[1]); 18 srv.request.b = atoll(argv[2]);
Here we instantiate an autogenerated service class, and assign values into its request member. A service class contains two members, request and response. It also contains two class definitions, Request andResponse.
19 if (client.call(srv))
This actually calls the service. Since service calls are blocking, it will return once the call is done. If the service call succeeded, call() will return true and the value insrv.response will be valid. If the call did not succeed,call() will return false and the value in srv.response will be invalid.
Building your nodes
Again edit the beginner_tutorials CMakeLists.txt:
$ rosed beginner_tutorials CMakeLists.txt
and add the following at the end:
rosbuild_add_executable(add_two_ints_server src/add_two_ints_server.cpp)rosbuild_add_executable(add_two_ints_client src/add_two_ints_client.cpp)
This will create two executables, "add_two_ints_server" and "add_two_ints_client", which by default will go into the "bin" directory.
For more information on using CMake with ROS, seeCMakeLists Now run make:
$ make
If your build fails for some reason:
make sure you have followed the directions in the previous tutorial:creating the AddTwoInts.srv.
type rosls beginner_tutorials/srv_gen/cpp/include/beginner_tutorials/ and check that the.h file matches the include in the client and server .cpp files.
- Writing a Simple Service and Client (C++)
- Writing a Simple Publisher and Subscriber (C++)
- Writing a Simple Action Client
- Writing and Compiling A Simple Program For OpenWrt
- C code for a simple HTTP client
- Writing a SmartObject Service
- Writing a Simple USB Driver
- Writing a simple C++ Program
- Writing a Simple USB Driver
- A Beginner Tutorial for Writing Simple COM/ATL DLL and Using it with .NET
- Writing a boot loader in Assembly and C
- Writing a Simple …
- 1.1 Writing a Simple C++ Program
- Simple UDP server and client
- Creation of an Axis Web Service and a gSOAP client
- a simple memcached client Demo
- A simple FTP update client
- Writing and Hosting a Web Service in the SharePoint 2010 Demo Virtual Machine
- hdu线段树专题训练
- 集成FusionCharts图表,可实现同比环比
- 拓扑排序
- 正确解析dojo的子小部件
- Shell排序算法
- Writing a Simple Service and Client (C++)
- SurfaceView双缓冲Demo
- TPMS-1 -
- 四周
- [Linux]: 关于coLinux的几个启动错误
- LeetCode: Add Two Numbers
- 汽车的TPMS智能胎压监测系统 -
- win7下office2007新建2003版本
- TPMS-2 -