7.3创建和运行服务服务器与客户端节点
介绍
服务由服务服务器(service server)和服务客户端(service client)组成,其中服务服务器仅在收到请求(request)时才会响应(response),而服务客户端则会发送请求并接收响应。与话题不同,服务是一次性消息通信。因此,当服务的请求和响应完成时,两个节点的连接会被断开。
这种服务通常在让机器人执行特定任务时用到。或者用于需要在特定条件下做出反应的节点。
优点:由于是一次性的通信方式,因此对网络的负载很小,所以是一种非常有用的通信手段,例如被用作一种代替话题的通信手段
创建功能包
$cd ~/catkin_ws/src
$catkin_create_pkg ros_tutorials_service message_generation std_msgs roscpp
其中:
message_generation是用于创建新消息的功能包;
std_msgs是ROS的标准消息功能包;
roscpp是在ROS中使用C/C++的客户端程序库。
这些依赖包必须在提前安装好;可以选择在创建功能包是指定依赖关系,也可以在创建功能包之后在package.xml中进行修改。
修改功能包配置文件
在创建功能包的时候,会在“~/catkin_ws/src”目录中生成ros_tutorials_service功 能 包 目 录 , 在 这 个 功 能 包 目 录 中 会 生 成 RO S 功 能 包 所 要 配 备 的 默 认 目 录 , 以 及CMakeLists.txt和package.xml文件。下面使用ls命令检查内容。
$cd ros_tutorials_service
$ls
include →头文件目录
CMakeLists.txt →构建配置文件
src →源代码目录
package.xml →功能包配置文件
修改构建配置文件
ROS所必需的配置文件之一package.xml是一个包含功能包信息的XML文件,它描述了功能包名称、作者、许可证和依赖包。使用以下命令使用编辑器(gedit、vim、emacs等)打开文件,并修改它,以匹配当前节点。推荐使用subl,嘿嘿。
ROS的构建系统catkin以CMake为基础,它在功能包目录中的CMakeLists.txt文件里描述了构建环境。该文件设置可执行文件的创建、依赖包优先构建、链接生成等。与上述ros_tutorials_topic不同,如果添加了发布者节点、订阅者节点和msg文件,则ros_tutorials_service功能包将添加新的服务服务器节点、服务客户端节点和服务文件(*.srv)。
$ subl CMakeLists.txt
##这是进行catkin构建时所需的组件包。
##依赖包是message_generation、std_msgs和roscpp。如果这些包不存在,在构建过程中会发生错误。
find_package(catkin REQUIRED COMPONENTS message_generation std_msgs roscpp)
##服务声明:SrvTutorial.srv
add_service_files(FILESS rvTutorial.srv)
##这是一个设置依赖消息的选项。
##如果未安装std_msgs,则在构建过程中会发生错误。
generate_messages(DEPENDENCIESstd_msgs)
##这是catkin功能包选项,它描述了库、catkin构建依赖和依赖系统的功能包。
catkin_package(
LIBRARIESros_tutorials_service
CATKIN_DEPENDS std_msgs roscpp
)
##设置包含目录。
include_directories(${
catkin_INCLUDE_DIRS})
##这是service_server节点的构建选项。
##设置可执行文件、目标链接库和附加依赖项。
add_executable(service_server src/service_server.cpp)
add_dependencies(service_server${
${
PROJECT_NAME}_EXPORTED_TARGETS}${
catkin_EXPORTED_TARGETS})
target_link_libraries(service_server${
catkin_LIBRARIES})
##这是节点的构建选项。
add_executable(service_client src/service_client.cpp)
add_dependencies(service_client${
${
PROJECT_NAME}_EXPORTED_TARGETS}${
catkin_EXPORTED_TARGETS})
target_link_libraries(service_client${
catkin_LIBRARIES})<