创建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. 牛刀小试MySQL--GTID

    GTID的概念 何为GITD GTID(global transaction identifier)是全局事务标识符,在MySQL5.6版本中作为一个超级特性被推出.事务标识不仅对于Master(起源 ...

  2. activeX

    对外接口和classid在idl文件中,接口功能实现在ctrl类中实现

  3. Python全栈学习_day007作业

    Day7作业及默写 .把列表中所有姓周的人的信息删掉(升级题:此题有坑, 请慎重): 第一种方法:lst = ['周老二', '周星星', '麻花藤', '周扒皮'] # 结果: lst = ['麻花 ...

  4. js之全选即点击全选标签可选择全部复选框

    目标效果:网页全选功能,即点击全选标签可选择全部复选框 实现代码如下 <!DOCTYPE html> <html lang="en"> <head&g ...

  5. 【c++】删除string中指定的字符

    使用string::iterator(字符串迭代器)从开始 str.begin() 迭代到最后 str.end() ,再使用string.erase(const_iterator p)函数来删除迭代器 ...

  6. web print

    <!doctype html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  7. 开源IDE code blocks黑色主题

    操作系统:Fedora26   IDE版本: Code Blocks16.01 配置文件路径为: ~/.config/codeblocks 而不像一些教程写的在用户根目录下或者在软件安装目录 请将de ...

  8. 移植marvell poncat3 demo板的总结

    1.arm cpu自带的bootrom, 已经初始化好串口.SPI等外设,只要硬件设置好从SPI FLASH启动,则cpu自带的bootrom会自动打印出一些信息,显示出从SPI FLASH启动,驱动 ...

  9. Linux 为linux enterprises 6安装图形桌面教程

    为linux enterprises 6安装图形桌面教程 by:授客 QQ:1033553122 安装系统后发现没图形界面,安装Xwindow[为了避免权限不足,以root登录] 步骤1.启动图形界面 ...

  10. Django基础篇--Models

    在Django中创建与数据库的链接并调用数据库的数据是很关键的步骤,那么怎么实现这个过程呢? 下面这篇文章简单梳理了一下创建Model层的过程和应用 模型-Models 首先需要理解什么是模型? 模型 ...