服务(services)
是节点之间
通讯的另一种方式。服务允许节点发送请求(request) 并获得一个响应(response)。
之前讲的是两个节点如果要通信需要经过话题topic,一个节点需要订阅话题并sub消息,另一个节点订阅话题并发布pub消息。
使用方式:
rosservice list 输出可用服务的信息
rosservice call 调用带参数的服务
rosservice type 输出服务类型
rosservice find 依据类型寻找服务find services by service type
rosservice uri 输出服务的ROSRPC uri
一、消息和服务介绍
消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。
服务(srv): 一个srv文件描述一项服务。它包含两个部分:请求
和响应
。
1、创建msg
$ cd ~/catkin_ws/src/beginner_tutorials
$ mkdir msg
$ echo "int64 num" > msg/Num.msg
查看package.xml, 确保它包含一下两条语句:
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
CMakeLists.txt
## 依赖项,文件可以转为C++
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
## 添加msg、srv文件
add_message_files(FILES Num.msg)
add_service_files( FILES AddTwoInts.srv)
## 生成消息和服务
generate_messages(DEPENDENCIES std_msgs)
## 设置运行依赖项
catkin_package(CATKIN_DEPENDS message_runtime roscpp rospy std_msgs)
使用rosmsg
$ rosmsg show Num
2、创建srv
$ roscd beginner_tutorials
$ mkdir srv
$ roscp rospy_tutorials AddTwoInts.srv srv/AddTwoInts.srv
CMakeLists.txt
add_service_files(
FILES
AddTwoInts.srv
)
使用rossrv
$ rossrv show AddTwoInts
结果:
[beginner_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
[rospy_tutorials/AddTwoInts]:
int64 a
int64 b
---
int64 sum
3、都需要的步骤
CMakeLists.txt
generate_messages(
DEPENDENCIES
std_msgs
)
编译
# In your catkin workspace
$ cd ../..
$ catkin_make
$ cd -
二、创建服务器和客户端
ROS.wiki
创建一个简单的service
节点(“add_two_ints_server”),该节点将接收到两个整形数字,并返回它们的和。
请确保已经按照第一步AddTwoInts.srv
教程的步骤创建了本教程所需要的srv
cd ~/catkin_ws/src/beginner_tutorials/src
在beginner_tutorials包中创建src/add_two_ints_server.cpp文件
touch add_two_ints_server.cpp
并复制粘贴下面的代码:
服务器server节点
#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;
}
beginner_tutorials/AddTwoInts.h是由编译系统自动
根据我们先前创建的srv文件生成的对应该srv文件的头文件
。
客户端Client节点
在beginner_tutorials包中创建src/add_two_ints_client.cpp文件
touch add_two_ints_clients.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;
}
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)
编译
cd ~/catkin_ws
catkin_make
roscore之后,在两个终端分别输入如下指令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)