ROS教程4 ROS自定义srv类型及使用
创建srv文件
在上一节单独为自定义的消息和服务的包 test_msgs 里面
创建 srv文件夹
进入创建 testsrv.srv 文件 ,内容为;
(srv文件和msg文件类似,唯一不同的是它包含两个部分——request和response。两部分用---分隔:)
int64 A
int64 B
---
int64 Sum


(1)打开 test_msgs 包里的 package.xml文件,确保里面存在这两行且去掉它们的注释:(上节已做过)
<build_depend>message_generation</build_depend>
<run_depend>message_runtime</run_depend>
(2)打开包目录下的CMakeLists.txt文件,在find_message调用中添加message_generation依赖,让你可以生成ROS信息。(上节已经做过)
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
message_generation
)
(3) 添加srv文件
去掉注释且修改为:
add_service_files(
FILES
testsrv.srv
)
(4)然后是generate_messages,指定生成消息文件时的依赖项,比如上面嵌套了其他消息类型geometry_msgs,那么必须注明
#generate_messages必须在catkin_package前面
generate_messages(
DEPENDENCIES
geometry_msgs
)
(4)然后是catkin_package设置运行依赖
catkin_package( CATKIN_DEPENDS message_runtime )
编译
回到test_msgs文件夹下
catkin_make
查看是否成功
rossrv show test_msgs/testsrv

使用自定义的srv (testsrv.srv)
要使用自定义的消息类型必须source自定义消息所在的工作空间,否则rosmsg show test_msgs/testsrv和rostopic echo /test_msg(/test_msg是节点中使用自定义消息类型test_msgs/Test的topic)都会报错,因为没有source的情况下自定义消息类型是不可见的,被认为是未定义类型
1 调用自定义srv类型
(1)如果是在test_msgs包内的节点中调用test_msgs/testsrv类型,只需要在.cpp文件中如下调用即可
#include <test_msgs/testsrv.h> test_msgs::testsrv mysrv;
( 2 ) 如果是在其他包调用test_msgs/testsrv类型则还需要修改package.xml和CMakeLists.txt,
比如同样在工作空间catkin_arduino_ros内有一个名为test1_pub_sub包,在它的src文件夹下,有两个节点add_two_ints_client和add_two_ints_server,

调用test_msgs包下面的srv文件夹中的自定义的srv类型testsrv.srv,完成一个请求加法的服务。


add_two_ints_client.cpp
#include "ros/ros.h"
#include <test_msgs/testsrv.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<test_msgs::testsrv>("add_two_ints");
test_msgs::testsrv 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;
}
add_two_ints_server.cpp
#include "ros/ros.h"
#include <test_msgs/testsrv.h> bool add(test_msgs::testsrv::Request &req,
test_msgs::testsrv::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 头文件调用
#include <test_msgs/testsrv.h>
2 实例化自定义srv
test_msgs::testsrv srv; (根据创建的包名test_msgs和文件名testsrv)

3 srv 分两部分
请求部分
test_msgs::testsrv::Request &req
req.a
req.a 响应部分
test_msgs::testsrv::Response &res
res.sum

2为编译添加依赖项
修改调用包test1_pub_sub的编译文件,来调用包test_msgs里面的自定义服务 testsrv.srv

(1)修改package.xml (创建msg时已经添加)
<build_depend>roscpp</build_depend>
<run_depend>roscpp</run_depend> <build_depend>test_msgs</build_depend>
<run_depend>test_msgs</run_depend>
(2)修改CMakeLists.txt :
1 find_package中需要声明查找包含该消息类型的包test_msgs;
find_package(catkin REQUIRED COMPONENTS
roscpp
rospy
std_msgs
geometry_msgs // 上节自定义的msg中使用 跟srv没关系
test_msgs // 使用自定义testsrv.srv 重点调用
# message_generation
)
2 add_dependencies要注明该消息的依赖 [包名]_gencpp (test_msgs_gencpp)其他地方和普通节点一样
add_dependencies(add_two_ints_server test_msgs_gencpp) add_dependencies(add_two_ints_client test_msgs_gencpp)
如果缺少add_dependencies中对test_msgs_gencpp的依赖声明,在编译的时候如果先编译test包再编译test_msgs包则会出现如下报错(ROS工作空间各个软件包的编译顺序是随机的),因为头文件test_msgs/Test.h还未生成
测试
roscore
ROS教程4 ROS自定义srv类型及使用的更多相关文章
- ROS教程3 ROS自定义msg类型及使用
1ROS自定义msg类型及使用 http://blog.csdn.net/u013453604/article/details/72903398 首先创建一个空的package单独存放msg类型(当然 ...
- ROS教程(一):ROS安装教程(详细图文)
ros教程:ros安装 目录 前言 一.版本选择 二.开始安装 2.1 软件中心配置 2.2 添加源 2.3 安装 三.验证ROS 前言 关于ROS(Robot OS 机器人操作系统),估计看这个教程 ...
- ROS教程
Learning ROS 学习ROS Depending on your learning style and preferences, you can take two approaches to ...
- 入门ROS教程与视频汇总(kinetic)
参考网址: Richard Wang 3 Shawn Chen 部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg http://i.you ...
- ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务
ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...
- ROS与深度相机入门教程-在ROS使用kinect v1摄像头
ROS与深度相机入门教程-在ROS使用kinect v1摄像头 说明: 介绍在ros安装和使用kinect v1摄像头 介绍freenect包 安装驱动 deb安装 $ sudo apt-get in ...
- ROS教程(二):创建工作空间(图文)
ros教程:创建工作空间 目录 前言 一.工作空间? 二.创建一个工作空间 1.创建目录 2.编译 前言 使用catkin创建一个工作空间 一.工作空间? 在ROS系统下,我们所有的项目都放在一个工作 ...
- ROS教程2 编写简单的消息发布器和订阅器 (C++ catkin)
创建工作环境 创建文件夹,创建包 mkdir -p ~/catkin_arduino_ros/src catkin_create_pkg test1_pub_sub std_msgs rospy ro ...
- SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
随机推荐
- 使用 libjpeg 库解压数据示例
static int MjpegDecompress( *** ) { struct jpeg_decompress_struct tDInfo; struct jpeg_error_mgr jerr ...
- ES6+ 开发 React 组件
在这里简要的说一下这些语言新特性对 React 应用的开发有什么影响,这些 ES6+ 特性使得 React 开发更简单更有趣. 类 迄今为止,最能体现我们使用 ES6+ 来编写 React 组件的就是 ...
- canvas-arc.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- returnFunc.js
var cyn = function(){ console.log("one") return function(){ console.log("two") } ...
- 【工具相关】Web-ionic-ionicLab的使用
一,下载地址为:http://lab.ionic.io/,下载后直接安装即可.图标如下图所示: 二,打开ionicLab,如下图所示: 三,打开一个已有的文件,File-->Open Exist ...
- Power BI 与 Azure Analysis Services 的数据关联:2、Azure Analysis Services与 本地版本的 SQL Analysis Services 连接
Power BI 与 Azure Analysis Services 的数据关联:2.Azure Analysis Services与 本地版本的 SQL Analysis Services ...
- ASP.NET MVC WebAPI 资源整理
注:这是收集给公司同事学习的资料,入门级别的. 使用ASP.Net WebAPI构建REST服务(一)——简单的示例 http://blog.csdn.net/mengzhengjie/article ...
- loadrunner 运行场景-常见Graph简介
运行场景-常见Graph简介 by:授客 QQ:1033553122 A. Web Resource Graphs 1. 概述 a) Hits per Second Graph Hits ...
- tensorflow 文件队列
使用文件队列,防止爆内存 # # 通过队列打开图片文件 file_queue = tf.train.string_input_producer(paths) img_reader = tf.Whole ...
- The packaging and installation process of Android programs
D:\android\adt-bundle-windows-x86-20131019\sdk\platform-tools工具的路径. 安卓工程经过eclipse编译然后通过aapt工具打包生成一个. ...