如何自定义服务数据

  • 定义srv文件
  • 在package.xml中添加功能包依赖
  • 在CMakeLists.txt添加编译选项
  • 编译生成语言相关文件
cd ~/catkin_ws/src/learning_service
mkdir srv

cd srv
touch Person.srv

Person.srv 文件内容

string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2---
string result

在package.xml中添加功能包依赖

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

在CMakeLists.txt添加编译选项

find_package(catkin REQUIRED COMPONENTS............message_generation
)

add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES learning_topicCATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs turtlesim message_runtime
#  DEPENDS system_lib
)

配置完成后,对工程目录进行编译

cd ~/catkin_ws
catkin_make


编译成功后 ~/catkin_ws/devel/include/learning_service 目录下会有三个头文件。

通过以下代码去调用生成的头文件

在 src 目录下创建 两个 cpp文件

cd ~/catkin_ws/src/learning_service/src

创建 person_client.cpp 文件

touch person_client.cpp

person_client.cpp 文件中的内容
代码功能:请求/show_person服务,服务数据类型learning_service::Person

#include <ros/ros.h>
#include "learning_service/Person.h"int main(int argc, char** argv)
{// 初始化ROS节点ros::init(argc, argv, "person_client");// 创建节点句柄ros::NodeHandle node;// 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的serviceros::service::waitForService("/show_person");ros::ServiceClient person_client = node.serviceClient<learning_service::Person>("/show_person");// 初始化learning_service::Person的请求数据learning_service::Person srv;srv.request.name = "Tom";srv.request.age  = 20;srv.request.sex  = learning_service::Person::Request::male;// 请求服务调用ROS_INFO("Call service to show person[name:%s, age:%d, sex:%d]", srv.request.name.c_str(), srv.request.age, srv.request.sex);person_client.call(srv);// 显示服务调用结果ROS_INFO("Show person result : %s", srv.response.result.c_str());return 0;
};

创建 person_server.cpp 文件

touch person_server.cpp

person_server.cpp 文件中的内容
代码功能:执行/show_person服务,服务数据类型learning_service::Person

#include <ros/ros.h>
#include "learning_service/Person.h"// service回调函数,输入参数req,输出参数res
bool personCallback(learning_service::Person::Request  &req,learning_service::Person::Response &res)
{// 显示请求数据ROS_INFO("Person: name:%s  age:%d  sex:%d", req.name.c_str(), req.age, req.sex);// 设置反馈数据res.result = "OK";return true;
}int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "person_server");// 创建节点句柄ros::NodeHandle n;// 创建一个名为/show_person的server,注册回调函数personCallbackros::ServiceServer person_service = n.advertiseService("/show_person", personCallback);// 循环等待回调函数ROS_INFO("Ready to show person informtion.");ros::spin();return 0;
}

如何配置CMakeLists.txt中编译规则

  • 设置需要编译的代码和生成的可执行文件
  • 设置链接库
  • 添加依赖项

在CMakeLists.txt文件中添加以下代码:

add_executable(person_server src/person_server.cpp)
target_link_libraries(person_server ${catkin_LIBRARIES})
add_dependencies(person_server ${PROJECT_NAME}_gencpp)add_executable(person_client src/person_client.cpp)
target_link_libraries(person_client ${catkin_LIBRARIES})
add_dependencies(person_client ${PROJECT_NAME}_gencpp)
  • add_executable:通过指定的源文件列表构建出可执行目标文件。
  • target_link_libraries:该指令的作用为将目标文件与库文件进行链接。
  • add_dependencies:该指令的作用为链接动态库或依赖项。

编译工程项目

cd ~/catkin_ws
catkin_make

启动ROS Master

roscore

启动自定义的订阅者节点

rosrun learning_service person_server

启动自定义的发布者节点

rosrun learning_service person_client


ROS系统 服务数据的定义与使用相关推荐

  1. 【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用

    目录 自定义服务数据 定义srv文件 在package.xml中添加功能包依赖 在CMakeLists.txt添加编译选项 编译生成语言相关文件 使用 C++ 编写程序 person_server.c ...

  2. ROS入门-13.服务数据的定义与使用

    前面我们已经学习到了spawn和Trigger两种在ROS中已经定义好的服务数据类型的使用方式,当已经定义好的服务数据不能满足我们需求时,就需要根据自己需求来定义一个服务数据的类型并使用 之前在自定义 ...

  3. ROS应用开发入门 服务数据的定义和使用

    ROS是机器人操作系统的简称,本文介绍ROS应用开发入门,服务数据的定义和使用.客户端和服务端 之间通讯都使用服务数据(service data).本文先定义一个服务数据,编译成功后,用一个服务端和一 ...

  4. 【ROS学习笔记】(八)服务数据的定义与使用

    一.目的 Client每Request一次数据请求,Server发送一次数据.数据格式为个人信息,如姓名.性别等. 二.自定义服务数据 此步骤与话题消息的定义与使用过程类似 1. 定义srv文件 再l ...

  5. ROS:服务数据(srv)的定义与使用

    目录 一.服务模型 二.创建功能包 三.自定义服务数据 3.1定义srv文件 3.2在package.xml中添加功能包依赖 3.3在CMakeLists.txt中添加编译选项 3.4编译生成语言相关 ...

  6. 第十三弹 服务数据的定义与使用

    1.服务模型(服务端/客户端) 2.自定义服务数据 2.1定义srv文件 服务是有response的,所以需要上下分割.三个横线以上,是request数据,横线以下,是response数据. 创建一个 ...

  7. 【ROS学习笔记】11.服务数据(srv)的定义与使用

    基于B站ROS公开课:[古月居]古月·ROS入门21讲 基于Ubuntu 20.04.1.Noetic版本 修正错误,并详述Python版本部署 文章目录 1 模型图 2 创建功能包 3 自定义服务数 ...

  8. ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

    ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...

  9. #榜样的力量#内蒙古自治区互联网医疗服务系统丨数据猿新冠战“疫”公益策划...

    "该项目案例由浪潮健康提交申报,参与数据猿推出的<寻找新冠战"疫",中国数据智能产业先锋力量>的公益主题策划活动. 大数据产业创新服务媒体 --聚焦数据 · ...

最新文章

  1. shell任务不受意外中断影响的常见方法
  2. leetcode 122 买卖股票的最佳时机II
  3. 图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】
  4. 【应用】Lambda表达式
  5. 线程中task取消_Rust Async: async-task源码分析
  6. coreldraw x4如何重叠图片_CorelDRAW复制及镜面反转对象
  7. 启动关闭HadoopSpark历史服务
  8. centos7安装MySql(yum方式)
  9. http://www.ajaxload.info/
  10. R语言实战应用精讲50篇(十七)--使用R语言实现时间序列分析
  11. 架构师须知概念:POJO、PO、DTO、DAO、BO、VO
  12. c语言编写矩阵逆置乘法,200个c语言实例的源码
  13. /usr/local/bin/zsh没有文件或目录问题
  14. (生活篇)对恋爱谈心大事件的思考与反思——于五周年纪念日20211225
  15. 计算机网络13--网络应用的体系结构
  16. 谷歌浏览器导出导入插件
  17. 电脑首次安装vue2过程/步骤(vue-cli)
  18. opencv中Mat与vector互转
  19. 送书 | 哈佛大学单细胞课程:笔记汇总前篇
  20. CryptoJS对密文AES解密失败

热门文章

  1. 虚幻填坑004:减少starter content占用空间,只保留使用的assets
  2. MySQL 使用explain查看执行计划
  3. 内存中OLTP(Hekaton)的排序警告
  4. asp.net mvc4 配置数据库连接的相关问题
  5. Linux中LVM(逻辑卷管理)的使用
  6. 有一段时间没来这里了,
  7. 世界编程大赛一等奖作品(转载)
  8. Hibernate 关联映射 之 多对多 关联(二) 之拆分
  9. struts2从action向jsp传参数
  10. .jsp与servlet之间页面跳转及参数传递实例