ROS的服务

按照别人的教程来一遍!

给出《ROS机器人编程——从基本概念到机器人应用程序编程实战》中关于自定义ROS服务的demo
$ cd ~/catkin_ws/src
$ catkin_create_pkg ros_tutorials_service message_generation std_msgs roscpp
$ cd ros_tutorials_service
$ gedit package.xml

<?xml version="1.0"?>
<package>
<name>ros_tutorials_service</name>
<version>0.1.0</version>
<description>ROS tutorial package to learn the service</description>
<license>Apache License 2.0</license>
<author email="pyo@robotis.com">Yoonseok Pyo</author>
<maintainer email="pyo@robotis.com">Yoonseok Pyo</maintainer>
<url type="bugtracker">https://github.com/ROBOTIS-GIT/ros_tutorials/issues</url>
<url type="repository">https://github.com/ROBOTIS-GIT/ros_tutorials.git</url>
<url type="website">http://www.robotis.com</url>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>roscpp</build_depend>
<build_depend>std_msgs</build_depend>
<build_depend>message_generation</build_depend>
<run_depend>roscpp</run_depend>
<run_depend>std_msgs</run_depend>
<run_depend>message_generation</run_depend>
<export></export>
</package>

$ gedit CMakeLists.txt

cmake_minimum_required(VERSION 2.8.3)
project(ros_tutorials_service)
## 这是进行catkin构建时所需的组件包。
## 依赖包是message_generation、std_msgs和roscpp。如果这些包不存在,在构建过程中会发生错误。
find_package(catkin REQUIRED COMPONENTS message_generation std_msgs roscpp)
## 服务声明:SrvTutorial.srv
add_service_files(FILES SrvTutorial.srv)
## 这是一个设置依赖消息的选项。
## 如果未安装std_msgs,则在构建过程中会发生错误。
generate_messages(DEPENDENCIES std_msgs)
## 这是catkin功能包选项,它描述了库、catkin构建依赖和依赖系统的功能包。
catkin_package(
LIBRARIES ros_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})

$ roscd ros_tutorials_service
$ mkdir srv
$ cd srv
$ gedit SrvTutorial.srv

int64 a
int64 b
---
int64 result

$ roscd ros_tutorials_service/src
$ gedit service_server.cpp

#include "ros/ros.h"					// 如果有服务请求,将执行以下处理
#include "ros_tutorials_service/SrvTutorial.h"	// 将服务请求设置为req,服务响应则设置为res。
// ROS的基本头文件
// SrvTutorial服务头文件(构建后自动生成)
bool calculation(ros_tutorials_service::SrvTutorial::Request &req,ros_tutorials_service::SrvTutorial::Response &res)
{
// 在收到服务请求时,将a和b的和保存在服务响应值中
res.result = req.a + req.b;
// 显示服务请求中用到的a和b的值以及服务响应result值
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: %ld", (long int)res.result);
return true;
}
int main(int argc, char **argv) // 节点主函数
{
ros::init(argc, argv, "service_server"); 	 // 初始化节点名称
ros::NodeHandle nh; 		 // 声明节点句柄

// 声明服务服务器
// 声明利用ros_tutorials_service功能包的SrvTutorial服务文件的
// 服务服务器ros_tutorials_service_server
// 服务名称是ros_tutorial_srv,且当有服务请求时,执行calculation函数。
ros::ServiceServer ros_tutorials_service_server = nh.advertiseService("ros_tutorial_srv",calculation);
ROS_INFO("ready srv server!");
ros::spin(); // 等待服务请求
return 0;
}

$ roscd ros_tutorials_service/src
$ gedit service_client.cpp

#include "ros/ros.h" // ROS的基本头文件
#include "ros_tutorials_service/SrvTutorial.h"	 // SrvTutorial服务头文件(构建后自动生成)
#include <cstdlib> // 使用atoll函数所需的库
int main(int argc, char **argv) // 节点主函数
{
ros::init(argc, argv, "service_client");		
 // 初始化节点名称
if (argc != 3) 						
 // 处理输入值错误
{
ROS_INFO("cmd : rosrun ros_tutorials_service service_client arg0 arg1");
ROS_INFO("arg0: double number, arg1: double number");
return 1;
}
ros::NodeHandle nh; // 声明与ROS系统通信的节点句柄
// 声明客户端,声明利用ros_tutorials_service功能包的SrvTutorial服务文件的
// 服务客户端ros_tutorials_service_client。
// 服务名称是"ros_tutorial_srv"
ros::ServiceClient ros_tutorials_service_client =
nh.serviceClient<ros_tutorials_service::SrvTutorial>("ros_tutorial_srv");
// 声明一个使用SrvTutorial服务文件的叫做srv的服务
ros_tutorials_service::SrvTutorial srv;
// 在执行服务客户端节点时用作输入的参数分别保存在a和b中
srv.request.a = atoll(argv[1]);
srv.request.b = atoll(argv[2]);
// 请求服务,如果请求被接受,则显示响应值
if (ros_tutorials_service_client.call(srv))
{
ROS_INFO("send srv, srv.Request.a and b: %ld, %ld", (long int)srv.request.a, (long int)srv.request.b);
ROS_INFO("receive srv, srv.Response.result: %ld", (long int)srv.response.result);
}
else
{
ROS_ERROR("Failed to call service ros_tutorial_srv");
return 1;
}
return 0;
}

$ cd ~/catkin_ws && catkin_make
运行指令:
$ roscore
$ rosrun ros_tutorials_service service_server
[INFO] [1495726541.268629564]: ready srv server!
$ rosrun ros_tutorials_service service_client 2 3
[INFO] [1495726543.277216401]: send srv, srv.Request.a and b: 2, 3
[INFO] [1495726543.277258018]: receive srv, srv.Response.result: 5

THIS IS SHOW TIME

第二种的比较简单,就是发送一个请求,要求知道某个地方或者物体的位置信息或者发送一个 上传信息的请求
ID
请求类别(全局地图的话是0,语义地址是1,物品地址的话是2)
物品的名称(英文的string)
物品的位置信息:如果是请求上传的话不为空;如果是请求下传的话为空

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值