创建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/testsrvrostopic 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类型及使用的更多相关文章

  1. ROS教程3 ROS自定义msg类型及使用

    1ROS自定义msg类型及使用 http://blog.csdn.net/u013453604/article/details/72903398 首先创建一个空的package单独存放msg类型(当然 ...

  2. ROS教程(一):ROS安装教程(详细图文)

    ros教程:ros安装 目录 前言 一.版本选择 二.开始安装 2.1 软件中心配置 2.2 添加源 2.3 安装 三.验证ROS 前言 关于ROS(Robot OS 机器人操作系统),估计看这个教程 ...

  3. ROS教程

    Learning ROS 学习ROS Depending on your learning style and preferences, you can take two approaches to ...

  4. 入门ROS教程与视频汇总(kinetic)

    参考网址: Richard Wang    3 Shawn Chen 部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg http://i.you ...

  5. ROS Learning-012 beginner_Tutorials (编程) 创建自定义的ROS消息和ROS服务

    ROS Indigo beginner_Tutorials-11 创建自定义的ROS消息和ROS服务 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubunt ...

  6. ROS与深度相机入门教程-在ROS使用kinect v1摄像头

    ROS与深度相机入门教程-在ROS使用kinect v1摄像头 说明: 介绍在ros安装和使用kinect v1摄像头 介绍freenect包 安装驱动 deb安装 $ sudo apt-get in ...

  7. ROS教程(二):创建工作空间(图文)

    ros教程:创建工作空间 目录 前言 一.工作空间? 二.创建一个工作空间 1.创建目录 2.编译 前言 使用catkin创建一个工作空间 一.工作空间? 在ROS系统下,我们所有的项目都放在一个工作 ...

  8. ROS教程2 编写简单的消息发布器和订阅器 (C++ catkin)

    创建工作环境 创建文件夹,创建包 mkdir -p ~/catkin_arduino_ros/src catkin_create_pkg test1_pub_sub std_msgs rospy ro ...

  9. SLAM+语音机器人DIY系列:(二)ROS入门——2.ROS系统整体架构

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

随机推荐

  1. VSCode git Warning LF will be replaced by CRLF

    本文参考自:http://www.yulongjun.com/linux/20170518-08-lf-cr/ 我们打开Visual Studio Code编辑器,可以看到右下角有这个LF,这是VS ...

  2. JAVAEmail工具错误java.lang.ClassNotFoundException: javax.activation.DataSource

    JDK9以上或JDK6以下使用mail.jar包不加JAF的activation.jar包会抛出该错误!JDK6以上不需要加该jar包: 参考原文 https://stackoverflow.com/ ...

  3. C# 位运算详解

    运算符 描述 &(位与) 当两个二进制操作位都为1时,结果就为1 |(位或) 当两个二进制操作位有1个为1时,结果就为1 ^(位异或) 当两个二进制操作位只有1个为1时,结果为1 ~(位非) ...

  4. 将代码从 spark 1.x 移植到 spark 2.x

    1. SparkSession sparkSession可以视为sqlContext和hiveContext以及StreamingContext的结合体,这些Context的API都可以通过spark ...

  5. Docker常用命令(二)

    Docker常用命令 查看Docker所有正在运行的容器 docker ps 查看Docker已退出的容器 docker ps -a 查看Docker所有镜像 docker images 删除镜像 删 ...

  6. Placement of class definition and prototype

    When I create a function, I can put the code for it after main if I put the prototype above main. Fo ...

  7. IDEA项目搭建七——使用Feign简化消费者端操作

    一.简介 我们可以看到上一篇文章的消费者这边调用Service时比较麻烦,所以我们可以使用Feign来简化这部分操作,它底层也是使用Ribbon实现的只是Ribbon支持HTTP和TCP两种通信协议, ...

  8. 自定义控件详解(二):Path类 相关用法

    Path:路径 绘制路径:void drawPath (Path path, Paint paint) Path 可以绘制的路径 一.直线路径 1.基本方法 void moveTo (float st ...

  9. 安卓开发_浅谈Action Bar

    一.Action Bar 导航栏.是3.0之后出现的. 所以注意使用的时候清单文件要设置下 android:minSdkVersion="11"(至少11) 但如果使用v4包,则不 ...

  10. Android6.0源码下载编译刷入真机

    编译环境是Ubuntu12.04.手机nexus 5,编译安卓6.0.1源码并烧录到真机. 源码用的是科大的镜像:http://mirrors.ustc.edu.cn/aosp-monthly/,下载 ...