ROS系统 服务数据的定义与使用
如何自定义服务数据
- 定义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系统 服务数据的定义与使用相关推荐
- 【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用
目录 自定义服务数据 定义srv文件 在package.xml中添加功能包依赖 在CMakeLists.txt添加编译选项 编译生成语言相关文件 使用 C++ 编写程序 person_server.c ...
- ROS入门-13.服务数据的定义与使用
前面我们已经学习到了spawn和Trigger两种在ROS中已经定义好的服务数据类型的使用方式,当已经定义好的服务数据不能满足我们需求时,就需要根据自己需求来定义一个服务数据的类型并使用 之前在自定义 ...
- ROS应用开发入门 服务数据的定义和使用
ROS是机器人操作系统的简称,本文介绍ROS应用开发入门,服务数据的定义和使用.客户端和服务端 之间通讯都使用服务数据(service data).本文先定义一个服务数据,编译成功后,用一个服务端和一 ...
- 【ROS学习笔记】(八)服务数据的定义与使用
一.目的 Client每Request一次数据请求,Server发送一次数据.数据格式为个人信息,如姓名.性别等. 二.自定义服务数据 此步骤与话题消息的定义与使用过程类似 1. 定义srv文件 再l ...
- ROS:服务数据(srv)的定义与使用
目录 一.服务模型 二.创建功能包 三.自定义服务数据 3.1定义srv文件 3.2在package.xml中添加功能包依赖 3.3在CMakeLists.txt中添加编译选项 3.4编译生成语言相关 ...
- 第十三弹 服务数据的定义与使用
1.服务模型(服务端/客户端) 2.自定义服务数据 2.1定义srv文件 服务是有response的,所以需要上下分割.三个横线以上,是request数据,横线以下,是response数据. 创建一个 ...
- 【ROS学习笔记】11.服务数据(srv)的定义与使用
基于B站ROS公开课:[古月居]古月·ROS入门21讲 基于Ubuntu 20.04.1.Noetic版本 修正错误,并详述Python版本部署 文章目录 1 模型图 2 创建功能包 3 自定义服务数 ...
- ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行
ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...
- #榜样的力量#内蒙古自治区互联网医疗服务系统丨数据猿新冠战“疫”公益策划...
"该项目案例由浪潮健康提交申报,参与数据猿推出的<寻找新冠战"疫",中国数据智能产业先锋力量>的公益主题策划活动. 大数据产业创新服务媒体 --聚焦数据 · ...
最新文章
- shell任务不受意外中断影响的常见方法
- leetcode 122 买卖股票的最佳时机II
- 图的顺序存储(邻接矩阵存储)【摘录自严长生老师的网站】
- 【应用】Lambda表达式
- 线程中task取消_Rust Async: async-task源码分析
- coreldraw x4如何重叠图片_CorelDRAW复制及镜面反转对象
- 启动关闭HadoopSpark历史服务
- centos7安装MySql(yum方式)
- http://www.ajaxload.info/
- R语言实战应用精讲50篇(十七)--使用R语言实现时间序列分析
- 架构师须知概念:POJO、PO、DTO、DAO、BO、VO
- c语言编写矩阵逆置乘法,200个c语言实例的源码
- /usr/local/bin/zsh没有文件或目录问题
- (生活篇)对恋爱谈心大事件的思考与反思——于五周年纪念日20211225
- 计算机网络13--网络应用的体系结构
- 谷歌浏览器导出导入插件
- 电脑首次安装vue2过程/步骤(vue-cli)
- opencv中Mat与vector互转
- 送书 | 哈佛大学单细胞课程:笔记汇总前篇
- CryptoJS对密文AES解密失败