目录

  • 自定义服务数据
    • 定义srv文件
    • 在package.xml中添加功能包依赖
    • 在CMakeLists.txt添加编译选项
    • 编译生成语言相关文件
  • 使用
    • C++
      • 编写程序
        • person_server.cpp
        • person_client.cpp
      • 配置CMakeLists.txt
      • 编译并运行
    • python
      • 编写程序
        • person_server.py
        • person_client.py
      • 运行

平台:华硕 Thinker Edge R 瑞芯微 RK3399Pro
固件版本:Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615


记录自【古月居】古月·ROS入门21讲 | 一学就会的ROS机器人入门教程 —— 古月居GYH P15 15.服务数据的定义与使用

自定义服务数据

定义srv文件

cd ~/catkin_workspace/src/learning_service
mkdir srv
nano ~/catkin_workspace/src/learning_service/srv/Person.srv
string name
uint8  age
uint8  sexuint8 unknown = 0
uint8 male    = 1
uint8 female  = 2
---
string result

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

nano ~/catkin_workspace/src/learning_service/package.xml
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>

在CMakeLists.txt添加编译选项

...
find_package(... message_generation)
...
add_service_files(FILES Person.srv)
generate_messages(DEPENDENCIES std_msgs)
...
catkin_package(... message_runtime)
...
nano ~/catkin_workspace/src/learning_service/CMakeLists.txt



编译生成语言相关文件

cd ~/catkin_workspace
catkin_make

结果

cd ~/catkin_workspace/devel/include/learning_service
ls

可见已生成如下文件:

使用

C++

编写程序

person_server.cpp

nano ~/catkin_workspace/src/learning_service/src/person_server.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将执行/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;
}

person_client.cpp

nano ~/catkin_workspace/src/learning_service/src/person_client.cpp
/***********************************************************************
Copyright 2020 GuYueHome (www.guyuehome.com).
***********************************************************************//*** 该例程将请求/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;// 发现/show_person服务后,创建一个服务客户端,连接名为/show_person的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;
}

配置CMakeLists.txt

nano ~/catkin_workspace/src/learning_service/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)
  1. 设置需要编译的代码和生成的可执行文件;
  2. 设置链接库;
  3. 添加依赖项。

编译并运行

cd ~/catkin_workspace
catkin_make# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
roscore
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_service person_server
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_service person_client

python

编写程序

person_server.py

nano ~/catkin_workspace/src/learning_service/scripts/person_server.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
######################################################################### 该例程将执行/show_person服务,服务数据类型learning_service::Personimport rospy
from learning_service.srv import Person, PersonResponsedef personCallback(req):# 显示请求数据rospy.loginfo("Person: name:%s  age:%d  sex:%d", req.name, req.age, req.sex)# 反馈数据return PersonResponse("OK")def person_server():# ROS节点初始化rospy.init_node('person_server')# 创建一个名为/show_person的server,注册回调函数personCallbacks = rospy.Service('/show_person', Person, personCallback)# 循环等待回调函数print "Ready to show person informtion."rospy.spin()if __name__ == "__main__":person_server()

person_client.py

nano ~/catkin_workspace/src/learning_service/scripts/person_client.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-########################################################################
####          Copyright 2020 GuYueHome (www.guyuehome.com).          ###
######################################################################### 该例程将请求/show_person服务,服务数据类型learning_service::Personimport sys
import rospy
from learning_service.srv import Person, PersonRequestdef person_client():# ROS节点初始化rospy.init_node('person_client')# 发现/spawn服务后,创建一个服务客户端,连接名为/spawn的servicerospy.wait_for_service('/show_person')try:person_client = rospy.ServiceProxy('/show_person', Person)# 请求服务调用,输入请求数据response = person_client("Tom", 20, PersonRequest.male)return response.resultexcept rospy.ServiceException, e:print "Service call failed: %s"%eif __name__ == "__main__":#服务调用并显示调用结果print "Show person result : %s" %(person_client())

运行

sudo chmod +x ~/catkin_workspace/src/learning_service/scripts/person_server.py
sudo chmod +x ~/catkin_workspace/src/learning_service/scripts/person_client.py# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
roscore
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_service person_server.py
# 新建一个终端
source ~/catkin_workspace/devel/setup.bash
rosrun learning_service person_client.py

【RK3399Pro学习笔记】十一、ROS服务数据的定义与使用相关推荐

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

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

  2. Go语言学习笔记十一--面向接口-接口的定义与实现

    上一篇我们介绍了duck typing概念,主要讲述GO语言中,如何解决duck typing中编译器不提示错误,和没有duck typing的Java灵活性不够问题. 如何定义一个接口 GO中定义接 ...

  3. 吴恩达《机器学习》学习笔记十一——神经网络代码

    吴恩达<机器学习>学习笔记十一--神经网络代码 数据准备 神经网络结构与代价函数· 初始化设置 反向传播算法 训练网络与验证 课程链接:https://www.bilibili.com/v ...

  4. ROS学习笔记十一:ROS中数据的记录与重放

    ROS学习笔记十一:ROS中数据的记录与重放 本节主要介绍如何记录一个正在运行的ROS系统中的数据,然后在一个运行的系统中根据记录文件重新产生和记录时类似的运动情况.本例子还是以小海龟例程为例. 记录 ...

  5. 吴恩达《机器学习》学习笔记十一——应用机器学习的建议

    吴恩达<机器学习>学习笔记十一--应用机器学习的建议 一.训练完模型后下一步要做什么 二.评估算法与模型选择 1.训练集与测试集 2.训练/测试步骤 3.模型选择 4.数据集新的划分--验 ...

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

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

  7. Vue学习笔记(十一)

    1.Vue学习笔记(十一) 文章目录 1.Vue学习笔记(十一) 1.1Vue_配置代理_方式 1.1.0演示问题 1.1.1运行node server1 1.1.2运行node server2 1. ...

  8. Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程)

    Linux C/C++ 开发(学习笔记十一 ):TCP服务器(并发网络网络编程 一请求一线程) 一.TCP服务器(一请求一线程) 的原理 二.完整代码 三.测试 四.补充 一.TCP服务器(一请求一线 ...

  9. Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数

    Polyworks脚本开发学习笔记(十一)-玩转获取参数(GET)与设置参数 Polyworks采用了脚本语言作为二次开发的工具,因此语言格式上非常规范和统一.其中一个重要的特点就是,几乎所有的对象都 ...

最新文章

  1. C#隐藏手机号中间四位为*
  2. pycharm提示:Usually first parameter of a method is named 'self'
  3. 嵌入式C语言之位运算 ..|.~.
  4. SAP UIVeri5 跳过检查 Google Chrome driver 版本检查的方法
  5. 分享几个拉钩网的前端页面
  6. PHP Token(令牌)设计
  7. P4151 [WC2011]最大XOR和路径(线性基应用)
  8. std::dynamic_pointer_cast细节用法
  9. Program to reverse the digits of a number
  10. 03-07 APP 控件交互
  11. Kotlin入门(22)适配器的简单优化
  12. 【文献阅读】Augmenting Supervised Neural Networks with Unsupervised Objectives-ICML-2016
  13. cvc-complex-type.2.4.c: The matching wildcard is strict, but no declaration
  14. 《不要一辈子靠技术生存》
  15. 安全基础-防火墙四种登录方式 SSH Telnet SSH
  16. java论文word_java毕设论文参考文献.doc
  17. php 批量 挂马,php下批量挂马和批量清马代码
  18. ROS on DDS
  19. Java实现pdf文件转图片
  20. java计算机毕业设计流行病调查平台源码+数据库+系统+lw文档+mybatis+运行部署

热门文章

  1. 多款优秀的 JS MVC 框架对比
  2. 2009年上半年网络工程师考试下午试卷参考答案(二)
  3. 面向Tableau开发人员的Python简要介绍(第2部分)
  4. plsql中导入csvs_在命令行中使用sql分析csvs
  5. leetcode1277. 统计全为 1 的正方形子矩阵(dp)
  6. 了解如何通过Python使用SQLite数据库
  7. apache mesos_试用Apache Mesos HTTP API获得乐趣和收益
  8. Elastic Stack 安装
  9. linux 高可用----keepalived+lvs
  10. vue-resource跨域问题