ROS入门21讲笔记(七)自定义消息消息类型和使用

2023-05-16

这一节主要是学习如何自定义一个服务类型并使用它。

一、如何自定义服务消息?

服务数据是以.srv结尾的文件,是一个用于描述ROS服务信息简单文本文件,用于生成不同语言消息的源代码。srv文件存放在package文件夹下srv文件夹中。

二、自定义服务数据的一般步骤

经过下面四个步骤,返回到workspace目录进行catkin_make,ROS就能根据你的srv文件产生C++需要的源文件定义。

2.1 Step1 创建一个srv文件

srv文件每一行用段类型和段名组成,段类型有:

  • int8, int16, int32, int64 (plus uint*)
  • float32, float64
  • string
  • time, duration
  • other msg files
  • variable-length array[] and fixed-length array[C]

此外,因为服务信息内容由三横线分为上下两部分,分别是请求(request)和回应(response)。如:

int64 A
int64 B
---
int64 Sum

上面A B是请求数据,下面Sum是回应数据,数据类型都是int64。

2.2 Step2 修改package.xml

确保package内package.xml文件以下内容已经被解注释:

 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

这是为了保证msg文件能够转换成C+,Python和其他语言的源文件代码,第一行是编译的时候的依赖,第二行是执行时依赖。

2.3 Step3 修改CMakeLists.txt

确保find_package命令存在message_generation模块。

find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)

确保generate_messages语句已经加入依赖(要在catkin_package前):

generate_messages(
  DEPENDENCIES
  std_msgs
)

确保catkin_package语句已经有了运行时依赖message_runtime

catkin_package(
  ...
  CATKIN_DEPENDS message_runtime ...
  ...)

确保add_service_file语句已经增加了想要的srv文件:

add_service_files(
  FILES
  Service1.srv
  Service2.srv
)

CMakeLists.txt一共要进行四处确认find_package generate_messages catkin_packageadd_service_files

三、例子:创建一个服务器使用自定义服务通信数据

在这个例子中,客户端将两个int64数据发送到服务器,服务器对这两个数据求和后返回他们的总和。

3.1 创建srv文件

在package目录创建一个srv文件夹,并创建自己的自定义消息:

mkdir srv
cd srv
touch TwoIntsSum.srv

消息格式如下(TwoIntsSum.srv):

int64 a
int64 b
---
int64 sum

3.2 修改package.xml描述

package.xml添加固定的片段:

 <build_depend>message_generation</build_depend>
 <exec_depend>message_runtime</exec_depend>

一个用于编译时信息产生依赖<build_depend>message_generation</build_depend>;
另一个用于执行时信息依赖<exec_depend>message_runtime</exec_depend>
在这里插入图片描述

3.3 修改package的CMakeLists.txt

find_package中增加message_generation
在这里插入图片描述

在generate_messages语句已经加入依赖:(不可以缺少!)

generate_messages(
  DEPENDENCIES
  std_msgs
)

catkin_package命令增加message_runtime
在这里插入图片描述

message_runtime对于msgsrv都有效果,虽然名字叫做message_*

add_service_files命令增加TwoIntsSum.srv
在这里插入图片描述

回到工作空间根目录,使用catkin_make进行编译,如果出现以下打印,说明一切正常:
在这里插入图片描述
此时,ros已经根据你的配置生成了C++编程所需要的头文件了和msg一样放在workspace/devel/include/package/里面:


service_test/
├── TwoIntsSum.h
├── TwoIntsSumRequest.h
└── TwoIntsSumResponse.h

0 directories, 3 files
  

四、编写客户端和服务端程序

客户端代码程序代码:

#include <ros/ros.h>
#include "service_test/TwoIntsSum.h"

int main(int argc,char**argv)
{
    ros::init(argc,argv,"twoNumberClient");
    ros::NodeHandle n;

    ros::service::waitForService("/sumupTwo");
    ros::ServiceClient client=n.serviceClient<service_test::TwoIntsSum>("/sumupTwo");

    service_test::TwoIntsSum srv;
    srv.request.a=1;
    srv.request.b=2;

    ROS_INFO("Call service to add numbers up request [a:%d,b:%d]",srv.request.a,srv.request.b);
    client.call(srv);

    ROS_INFO("Get result from server ,the sum is : %d",srv.response.sum);

    return 0;
}

服务器程序代码:

#include <ros/ros.h>
#include "service_test/TwoIntsSum.h"

bool Callback(service_test::TwoIntsSum::Request &req,service_test::TwoIntsSum::Response &res)
{
    ROS_INFO("Receieve two number from client a=[%d],b=[%d]",req.a,req.b);

    res.sum=req.a+req.b;

    return true;
    
}

int main(int argc,char ** argv)
{
    ros::init(argc,argv,"Sumserver");
    ros::NodeHandle n;

    ros::ServiceServer server=n.advertiseService("/sumupTwo",Callback);

    ROS_INFO("Server ready");
    ros::spin();

    return 0;
}

OK,最后一步,往这个包对应的CMakeLists.txt中添加:

add_executable(clientGiveTwonum src/clientTwonumber.cpp)
target_link_libraries(clientGiveTwonum ${catkin_LIBRARIES})
add_dependencies(clientGiveTwonum ${PROJECT_NAME}_gencpp)

add_executable(serverCal src/serverSumup.cpp)
target_link_libraries(serverCal ${catkin_LIBRARIES})
add_dependencies(serverCal ${PROJECT_NAME}_gencpp)

注意相比于msg这里多了一个add_dependencies。

回到workspace目录,catkin_make!看到如下情况说明一切顺利:
在这里插入图片描述

你使用sensor.msg,最后会产生一个sensor.h。代码中表现是package::sensor

五、运行起来!

开启第一个终端,用来启动roscore核心:

roscore

这个指令再复习一下:


Usage: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS]
  rosrun will locate PACKAGE and try to find
  an executable named EXECUTABLE in the PACKAGE tree.
  If it finds it, it will run it with ARGS.
  

第二个终端,启动service_test中的应用serverCal

rosrun service_test serverCal

第三个终端,启动service_test中的应用clientGiveTwonum

rosrun service_test clientGiveTwonum

结果如下:
(客户端)


junwu@Room:~/Desktop/myWS$ rosrun service_test clientGiveTwonum 
[ INFO] [1648649460.485700436]: Call service to add numbers up request [a:1,b:2]
[ INFO] [1648649460.486496542]: Get result from server ,the sum is : 3
  

(服务端)


junwu@Room:~/Desktop/myWS$ rosrun service_test serverCal 
[ INFO] [1648649458.228923550]: Server ready
[ INFO] [1648649460.486441702]: Receieve two number from client a=[1],b=[2]
  

[1] https://wiki.ros.org/ROS/Tutorials/CreatingMsgAndSrv#Common_step_for_msg_and_srv

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS入门21讲笔记(七)自定义消息消息类型和使用 的相关文章

  • ROS:开机自启动

    Ubuntu14 04 网上很多资料说在 etc rc local中添加脚本 实验之后完全没用 可能是系统版本不对 解决 Ubuntu14 04 开机项命令 gnome session properties 点击 add name 名字 c
  • ros 样例代码和教程

    中国大学MOOC 机器人操作系统入门 课程代码示例 代码 https github com DroidAITech ROS Academy for Beginners 书 https legacy gitbook com book sych
  • Python 实现 Dijkstar 路径规划算法

    Dijstar 最短路径算法 用于计算起始点到最终点的最短路径 一般采用的是贪心算法策略 原理可以参考 图解 Open list 和 close list 环境 Terminal 需要预先安装两个库 matplotlib 和 math pi
  • ROS中使用VLP16激光雷达获取点云数据

    ROS中使用VLP16激光雷达获取点云数据 个人博客地址 本文测试环境为 Ubuntu20 04 ROS Noetic 需要将激光雷达与PC连接 然后在设置 gt 网络 gt 有线中将IPv4改为手动 并且地址为192 168 1 100
  • Webots小车与Gampping建图仿真与ORB3算法实践

    此篇博客转自本作者在古月居的博客 https www guyuehome com 34537 前言 在研一的时候 由于XXX项目的需要 其中一项就是需要测试Gmapping建图 自然也要求使用ROS系统 由于之前经常在webots中进行仿真
  • ros 中ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdist

    ros 中ERROR cannot download default sources list from https raw githubusercontent com ros rosdistro master rosdep sources
  • V-REP安装

    小知识 是当前目录 是父级目录 是根目录 1 下载V REP 官网地址 http www v rep eu downloads html 我用ubuntu16 04下载V REP PRO EDU V3 5 0 Linux tar 2 解压安
  • 关于相机与激光雷达数据采集与标定

    最近在做一个关于车路协同的项目 需要做一个路侧系统 传感器有摄像头和激光雷达 相机和激光雷达联合标定费了老半天劲 在此记录一下 雷达时间戳不对 导致摄像头和雷达的数据无法对齐 解决办法 修改雷达驱动发布点云消息时的时间戳 相机内参标定可以使
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • Hypervisor介绍及在智能驾驶的应用

    转自Hypervisor 智能座舱和智能驾驶融合的关键技术 腾讯新闻
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 程序“catkin_init_workspace”尚未安装。 您可以使用以下命令安装: sudo apt install catkin

    程序 catkin init workspace 尚未安装 您可以使用以下命令安装 sudo apt install catkin 问题如图 先贴上解决后的效果 运行环境 ubuntu 16 04 ros版本 kinetic 问题解释 这个
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 如何将视频或图像序列转换为包文件?

    我是 ROS 新手 我需要转换预先存在的视频文件 或者large可以连接到视频流中的图像数量 bagROS 中的文件 我在网上找到了这段代码 http answers ros org question 11537 creating a ba
  • 从 pcl::PointCloud 中删除点

    我是 PCL 新手 我正在使用 PCL 库 并且正在寻找一种从点云中提取点或将特定点复制到新点的方法 我想验证每个点是否符合条件 并且我想获得仅包含优点的点云 谢谢 使用 ExtractIndices 类 将要删除的点添加到 PointIn
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except

随机推荐

  • Hadoop_1 入门WordCount

    记录踩得坑以及部署环境流程 搭建的是伪分布Hadoop 首先环境需要安装zookeeper 这个好装 xff0c 不多说其次比较复杂的是安装openssh 我的Linux系统是centos 7 mini版本 安装openssh之前的准备工作
  • PX4无人机控制

    PX4无人机控制 向话题 mavros setpoint raw local发布无人机目标位置 43 偏航 xff0c 或者目标速度 43 偏航 发布目标位置 43 偏航 xff1a mission span class token pun
  • npm install 报错:gyp verb `which` failed Error: not found: python

    今天新启动一个项目 xff0c 在 npm install 安装依赖项时出现报错 npm install span class token operator gt span husky 64 span class token number
  • 24_ZYNQ7020开发板_SPI与Qflash芯片读写

    内核中使用spi master表示一个SPI主机控制器 一 SPI控制器驱动 1 xff09 spi master申请与释放 SPI申请 span class token keyword struct span spi master spa
  • python3的input函数实现回车换行,而不是结束输入

    span class token comment 实现回车换行 xff0c 而不是结束 span endstr span class token operator 61 span span class token string 34 34
  • rviz-Ros Wiki官网教程学习笔记(1)-用户指南

    0 rviz介绍 rviz是ROS自带的图形化工具 xff0c 可以很方便的让用户通过图形界面开发调试ROS 参考官网 rviz UserGuide 1 安装 根据自己的版本号 xff0c 在下面选择对应的命令执行 以ROS melodic
  • 轻松搭建CAS 5.x系列(6)-在CAS Server上增加OAuth2.0协议

    概述说明 CAS Server默认搭建出来 xff0c 客户端程序只能按照CAS自身的协议接入 CAS的强大在于 xff0c 有官方的插件 xff0c 可以支持其他的协议 本章节就让CAS Server怎么增加OAuth2 0的登录协议 安
  • 一起DIY四轴飞行器(二)初识飞控大脑

    系统 xff1a Windows 硬件 xff1a xff08 1 xff09 STM32F103C8T6最小系统板 某宝上搜索 STM32F103最小系统 xff0c 如上图所示这样的 xff08 2 xff09 ST LINK v2下载
  • STM32CubeMX基于HAL库点亮LED灯

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 cubeMX的基本配置 1 选择MCU 2 配置时钟 查看电路图 xff0c 8MHz的高速外部晶振接到 OSCIN
  • 一起DIY四轴飞行器(三)添加实时操作系统--freeRTOS

    开发环境 xff1a Windows 软件 xff1a 1 STM32CubeMX 6 3 0 2 MDK 5 14 一 初识freeRTOS系统 1 什么是FreeRTOS xff1f Free 即免费的 xff0c RTOS 全称是 R
  • ESP8266 初次使用

    一 工具 1 ESP8266 01S 淘宝上搜索ESP8266 01S 引脚说明 xff1a 2 USB转串口 给设备供电3 3V xff08 官方说不要用USB转串口的3 3V xff0c 需要单独供电 xff09 xff0c USB转串
  • ubuntu安装boost

    ubuntu安装boost 系统 Ubuntu 18 04 boost中 xff0c 用到了别的函数库 xff0c 所以为了使用boost中相应的功能 xff0c 需要先安装系统中可能缺失的库 1 卸载已经安装的boost 删除 usr l
  • 简单的状态机图

    一 什么是状态机 xff1f 做产品的时候 xff0c 我们总能遇到一些比较复杂的逻辑问题 比如状态的转换 xff0c 字段状态的确认 xff0c 权限的控制 xff0c 状态的对应 而普通的流程图 xff0c 或时序图 xff0c 更侧重
  • js-对象转基本类型

    起因是收到朋友发的一道题 xff0c 如下 xff1a span class token comment 请在问号处填写你的答案 使下方等式成立 span span class token keyword let span a span c
  • 局域网内wakeonlan远程唤醒其它计算机

    背景 xff1a 需要管理多台计算机 xff0c 所有计算机在一个局域网内 xff0c 并且有的安装了Windows系统 xff0c 有的安装了Linux系统 我们想远程关闭和启动所有计算机 关闭计算机直接通过网络发生操作系统关机命令即可实
  • D3D中的三种Buffer

    在D3D中 针对视窗有三种Buffer 它们分别是 Color Buffer Depth Buffer和Stencil Buffer Color Buffer在D3D中又称为Render Target 意思是最后着色的目标Buffer 就是
  • 创建镜像(更新与构建镜像)

    创建镜像 有时从Docker镜像仓库中下载的镜像不能满足我们的要求 xff0c 此时可以基于这个镜像 xff08 基础镜像 xff09 封装一个自 己的镜像 两种方式 xff1a 更新镜像 xff1a 使用docker commit命令构建
  • (十)CMake链接已有的动态库

    使用一个已经存在的动态库 xff0c 需要用到CMake中两个命令 xff0c 分别是 xff1a link directoriestarget link libraries 下面先介绍以下两个命令的格式及其含义 xff0c 最后是一个使用
  • ROS入门21讲笔记(四)自定义话题消息类型和使用

    除了ROS内置消息外 xff0c 我们还能自定义消息 这一次我们不再与海龟较劲 xff0c 而是自定义一个订阅消息类型 xff0c 让订阅者和发布者通过这个结构进行数据通信 一 如何自定义话题消息 xff1f 话题消息是以 msg结尾的文件
  • ROS入门21讲笔记(七)自定义消息消息类型和使用

    这一节主要是学习如何自定义一个服务类型并使用它 一 如何自定义服务消息 xff1f 服务数据是以 srv结尾的文件 xff0c 是一个用于描述ROS服务信息简单文本文件 xff0c 用于生成不同语言消息的源代码 srv文件存放在packag