ROS学习笔记10 - 编写编译和检验Service Node
来源:互联网 发布:邪器全集知乐 编辑:程序博客网 时间:2024/06/04 18:05
ROS学习笔记10 - 编写编译和检验Service Node
百度文库:http://wenku.baidu.com/view/e14d5e18dd88d0d232d46a37
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 directories to your beginner_tutorialspackage you created in your catkin workspace previous tutorials:
cd ~/catkin_ws/src/beginner_tutorials
Please make sure you have followed the directions in the previous tutorialfor creating the service needed in this tutorial,creating the AddTwoInts.srv (be sure to choose the rightversion of build tool you're using at the top of wiki page in the link).
The Code
Create the src/add_two_ints_server.cpp file within the beginner_tutorialspackage and paste the following inside it:
切换行号显示
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
bool add(beginner_tutorials::AddTwoInts::Request &req,
beginner_tutorials::AddTwoInts::Response &res)
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sendingback response: [%ld]", (long int)res.sum);
return true;
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_server");
ros::NodeHandle n;
ros::ServiceServer service = n.advertiseService("add_two_ints",add);
ROS_INFO("Readyto add two ints.");
ros::spin();
return 0;
}
The Code Explained
Now, let's break the code down.
切换行号显示
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
beginner_tutorials/AddTwoInts.h is the header file generated fromthe srv file that we created earlier. 位置:~/catkin_ws/include/beginner_tutorials
切换行号显示
bool add(beginner_tutorials::AddTwoInts::Request &req,
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 srvfile(AddTwoInts.srv) and returns a boolean.
切换行号显示
{
res.sum = req.a + req.b;
ROS_INFO("request:x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sendingback response: [%ld]", (long int)res.sum);
return true;
}
Here the two ints are added and stored in theresponse. Then some information about the request and response are logged.Finally the service returns true when it is complete.
切换行号显示
ros::ServiceServerservice = n.advertiseService("add_two_ints", add);
Here the service is created and advertised over ROS.
对比一下前一节publisher nodes的创建:
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); //topic name “chatter”, bufferSize:1000
对比一下后面client相关声明语句:
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
This creates a client for the add_two_ints service. The ros::ServiceClient object is used to call the service later on.
Writing the Client Node
The Code
Create the src/add_two_ints_client.cpp file within the beginner_tutorialspackage and paste the following inside it:
切换行号显示
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
#include <cstdlib>
int main(int argc, char **argv)
{
ros::init(argc, argv, "add_two_ints_client");
if (argc != 3)
{
ROS_INFO("usage:add_two_ints_client X Y");
return1;
}
ros::NodeHandle n;
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
beginner_tutorials::AddTwoInts srv;
srv.request.a= atoll(argv[1]);
srv.request.b= atoll(argv[2]);
if (client.call(srv))
{
ROS_INFO("Sum:%ld", (long int)srv.response.sum);
}
else
{
ROS_ERROR("Failedto call service add_two_ints");
return1;
}
return 0;
}
The Code Explained
Now, let's break the code down.
切换行号显示
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
This creates a client for the add_two_intsservice. The ros::ServiceClient object is used to call the service later on.
切换行号显示
beginner_tutorials::AddTwoInts srv;
srv.request.a= atoll(argv[1]);
srv.request.b= atoll(argv[2]);
Here we instantiate列举 an autogenerated service class, and assignvalues into its request member.Aservice class contains two members,requestand response.It alsocontains two class definitions,Requestand Response.
切换行号显示
if (client.call(srv))
This actually calls the service. Since service calls are blocking, it willreturn once the call is done. If the service call succeeded, call()will return true and the value in srv.response willbe valid. If the call did not succeed, call() willreturn false and the value in srv.response will beinvalid.
Building your nodes
Again edit the beginner_tutorials CMakeLists.txt located at ~/catkin_ws/src/beginner_tutorials/CMakeLists.txt and add the following at the end:
https://raw.github.com/ros/catkin_tutorials/master/create_package_srvclient/catkin_ws/src/beginner_tutorials/CMakeLists.txt
切换行号显示
add_executable(add_two_ints_server src/add_two_ints_server.cpp)
target_link_libraries(add_two_ints_server ${catkin_LIBRARIES})
add_dependencies(add_two_ints_server beginner_tutorials_gencpp)
add_executable(add_two_ints_client src/add_two_ints_client.cpp)
target_link_libraries(add_two_ints_client ${catkin_LIBRARIES})
add_dependencies(add_two_ints_client beginner_tutorials_gencpp)
This will create two executables, add_two_ints_server and add_two_ints_client, which by default will go intopackage directory of yourdevel space, located by default at ~/catkin_ws/devel/lib/share/<package name>. You can invoke executablesdirectly or you can use rosrun to invoke调用 them. They are not placed in '<prefix>/bin' because that would pollute thePATH when installing your package to the system. If you wish for your executableto be on the PATH at installation time, you can setup an install target, see:catkin/CMakeLists.txt
For more detailed discription of the CMakeLists.txt file see: catkin/CMakeLists.txt
Now run catkin_make:
# In your catkin workspace
cd ~/catkin_ws
catkin_make
If your build fails for some reason:
- make sure you have followed the directions in the previous tutorial: creating the AddTwoInts.srv.
Now that you have written a simple service and client, let's examine the simple service and client.
Examining the Simple Service and Client
Running the Service
Let's start by running the service:
$ rosrunbeginner_tutorials add_two_ints_server (C++)
$ rosrunbeginner_tutorials add_two_ints_server.py (Python)
You should see something similar to:
Ready to add two ints.
Running the Client
Now let's run the client with the necessaryarguments:
$ rosrunbeginner_tutorials add_two_ints_client1 3 (C++)
$ rosrunbeginner_tutorials add_two_ints_client.py 1 3 (Python)
You should see something similar to:
Requesting 1+3
1 + 3 = 4
Now that you've successfully run your first serverand client, let's learn how torecord and play back data.
Further examples on Service and Client nodes
If you want to investigate further and get ahands-on example, you can get one here. A simple Client and Servicecombination shows the use of custom message types. The Service node is writtenin C++ while the Client is available in C++, Python and LISP.
- ROS学习笔记10 - 编写编译和检验Service Node
- ROS学习--(十四)编写简单的Service和Client
- ros学习笔记(4)编写服务器和客户端
- ROS学习笔记--清除一些僵尸node
- ros学习笔记(2):编写publisher
- 学习6:编译ROS程序包,和学习ROS节点
- ROS node调用service: ros::service::call/client.call()
- ROS学习笔记十:用C++编写一个简单的服务和客户端
- ROS Service 和 Parameter
- ROS学习笔记六:理解ROS服务和参数
- ROS学习笔记八:创建ROS msg和srv
- ROS学习笔记-2: 编写服务端与客户端
- ros学习笔记(3)编写订阅者
- ROS 进阶学习笔记(15) - Use Service to play ROS-Serial communication
- ROS学习笔记九:用C++编写ROS发布与订阅
- ROS学习(二)server和client的编写总结
- 机器人操作系统ROS Indigo 入门学习(8)——理解ROS service 和parameter
- 机器人操作系统ROS Indigo 入门学习(8)——理解ROS service 和parameter
- Android 判断View属于哪种控件
- Android为Spinner填充数据后设置默认值的问题
- Android 在OnCreate()中获取控件高度与宽度
- Android 解决Android requires compiler compliance level 5.0 or 6.0. Found '1.7'
- Android TextView自动换行文字排版参差不齐的原因
- ROS学习笔记10 - 编写编译和检验Service Node
- Android 在代码中设置打开关闭GPS不必用户操作
- Android 获取手机IMEI
- Android 解决attempt to acquire a reference on a close SQLiteClosable
- Android 设置Dialog不允许返回或搜索键消除
- 我的博文
- Android 如何使用draw9patch,介绍的很详细,图文并茂,收藏下,备忘!
- Android SQLite中表自动生成字段的方法
- Android ScrollView与ListView一起(嵌套)使用解决ListView自动滚动的几点方案