本教程介绍如何使用C ++编写Service and Client 节点。
1、编写 Service Node
在这里,将创建服务(“add_two_ints_server”)节点,该节点将接收两个整数并返回总和。将目录更改为catkin工作区之前的教程中创建的beginner_tutorials包:
$roscd beginner_tutorials
请确保已按照之前教程中的说明创建本教程所需的服务,创建AddTwoInts.srv。
1.1代码
在beginner_tutorials包中创建src / add_two_ints_server.cpp文件,内容为:
#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("sending back 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("Ready to add two ints.");
ros::spin();
return 0;
}
1.2代码解释
#include "ros/ros.h"
#include "beginner_tutorials/AddTwoInts.h"
beginner_tutorials / AddTwoInts.h是从之前创建的srv文件生成的头文件。
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("sending back response: [%ld]", (long int)res.sum);
return true;
}
此函数提供添加两个int的服务,它接受srv文件中定义的请求和响应类型并返回一个布尔值。
这里添加了两个整数并存储在响应中。然后记录有关请求和响应的一些信息。最后,服务在完成后返回true
ros::ServiceServer service = n.advertiseService("add_two_ints", add);
这里的服务是通过ROS创建和宣传的。
2、编写 Client Node
2.1代码
在beginner_tutorials包中创建src / add_two_ints_client.cpp文件,内容如下:
#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");
return 1;
}
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("Failed to call service add_two_ints");
return 1;
}
return 0;
}
2.2代码解释
ros::ServiceClient client = n.serviceClient<beginner_tutorials::AddTwoInts>("add_two_ints");
这将为add_two_ints服务创建一个客户端。ros :: ServiceClient对象稍后用于调用服务。
beginner_tutorials::AddTwoInts srv;
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
这里我们实例化一个自动生成的服务类,并将值分配给它的请求成员。服务类包含两个成员,即请求和响应。它还包含两个类定义,Request和Response。
if (client.call(srv))
这实际上是调用服务。由于服务调用是阻塞的,因此一旦调用完成,它将返回。如果服务调用成功,则call()将返回true,并且srv.response中的值将有效。如果调用未成功,则call()将返回false,并且srv.response中的值将无效。
3、编译 nodes
再次编辑位于〜/ catkin_ws / src / beginner_tutorials / CMakeLists.txt的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)
这将创建两个可执行文件add_two_ints_server和add_two_ints_client,它们默认将进入devel空间的包目录,默认位于〜/ catkin_ws / devel / lib / <package name>。您可以直接调用可执行文件,也可以使用rosrun来调用它们。它们不会放在'<prefix> / bin'中,因为在将软件包安装到系统时会污染PATH。如果您希望在安装时将可执行文件放在PATH上,可以设置安装目标,请参阅:catkin/CMakeLists.txt
现在运行catkin_make:
# In your catkin workspace
$cd ~/catkin_ws
$catkin_make
如果您的构建因某些原因失败:确保您已按照之前教程中的说明进行操作:
4、运行nodes
运行节点需要启动ROS核心。打开一个新shell,然后键入:
roscore
如果一切顺利,应该看到如下所示的输出:
... logging to /u/takayama/.ros/logs/83871c9c-934b-11de-a451-
001d927076eb/roslaunch-ads-31831.log
... loading XML file
[/wg/stor1a/rosbuild/shared_installation/ros/tools/roslaunch/roscore.xml]
Added core node of type [rosout/rosout] in namespace [/]
started roslaunch server http://ads:54367/
SUMMARY
======
NODES
changing ROS_MASTER_URI to [http://ads:11311/] for starting master locally
starting new master (master configured for auto start)
process[master]: started with pid [31874]
ROS_MASTER_URI=http://ads:11311/
setting /run_id to 83871c9c-934b-11de-a451-001d927076eb
+PARAM [/run_id] by /roslaunch
+PARAM [/roslaunch/uris/ads:54367] by /roslaunch
process[rosout-1]: started with pid [31889]
started core service [/rosout]
+SUB [/time] /rosout http://ads:33744/
+SERVICE [/rosout/get_loggers] /rosout http://ads:33744/
+SERVICE [/rosout/set_logger_level] /rosout http://ads:33744/
+PUB [/rosout_agg] /rosout http://ads:33744/
+SUB [/rosout] /rosout http://ads:33744/
现在一切都设置为运行服务器和客户端。
4.1 运行 Server
首先运行服务器。打开一个新shell并输入:
$rosrun beginner_tutorials add_two_ints_server
Ready to add two ints.
4.2 运行 Client
shell中使用必要的参数运行客户端:
$ rosrun beginner_tutorials add_two_ints_client 1 3
在客户端的shell中,看到类似于:
Sum: 4
相反,在服务器的shell中,看到类似于:
request: x=1, y=3
sending back response: [4]