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

目录

  • 自定义服务数据
    • 定义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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400276.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

iBATIS存储过程

使用iBATIS配置来调用存储过程。为了理解这一章&#xff0c;首先需要了解我们是如何在MySQL中创建一个存储过程。 在继续对本章学习之前&#xff0c;可以通过MySQL存储过程。 我们已经在MySQL下有EMPLOYEE表&#xff1a; 123456CREATE TABLE EMPLOYEE (id INT NOT NULL auto_i…

WordPress 如何通过ID获取文章标题、内容等信息

原文链接&#xff1a;http://www.isyeo.com/wordpress/wordpress-getpost.html# 在非single.php页面中我们有时候想要调用当前文章的标题、内容等信息&#xff0c;而Wordpress在生成文章页的时候在各个页面中唯一不变的只有当前的文章ID&#xff0c;那么如何这个ID获取到当前文…

Windows server 2012 之路由功能

今天给大家介绍的是Windows服务器的软路由功能&#xff0c;那么什么事软路由呢&#xff1f;软路由&#xff1a;就是将Windows 系统配置成一个路由器下面我们通过一个示例来给大家介绍软路由先说一下实验环境&#xff0c;三台服务器&#xff0c;server02&#xff08;ip地址为192…

【51单片机快速入门指南】8:看门狗定时器(WDT)

目录硬知识测试程序main.c现象普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 适用型号: STC89C51,STC89C52,STC89C53,STC89C14,STC89LE51,STC89LE52,STC89LE53,STC89LE14,STC89C54,…

java 的 == 和equals()区别

先看一个列子&#xff1a; public class Equivalence {public static void main(String[] args) {Integer n1 new Integer(47);Integer n2 new Integer(47);System.out.println(n1 n2);System.out.println(n1 ! n2);} } 通常我们都以为结果是 第一个true第二个false&#xf…

wordpress 文章页面 (single.php)

<?php $id get_the_ID();// 文章当前的 id $title get_post($id)->post_title; $my_data get_the_time(Y-m-d);$my_content get_post($id)->post_content;?>

[转]带花树,Edmonds's matching algorithm,一般图最大匹配

看了两篇博客&#xff0c;觉得写得不错&#xff0c;便收藏之。。 首先是第一篇&#xff0c;转自某Final牛 带花树……其实这个算法很容易理解&#xff0c;但是实现起来非常奇葩&#xff08;至少对我而言&#xff09;。 除了wiki和amber的程序我找到的资料看着都不大靠谱 比如昨…

linux下cat命令详解

简略版&#xff1a; cat主要有三大功能&#xff1a;1.一次显示整个文件。$ cat filename2.从键盘创建一个文件。$ cat > filename 只能创建新文件,不能编辑已有文件.3.将几个文件合并为一个文件&#xff1a; $cat file1 file2 > file参数&#xff1a;-n 或 --number 由 …

firstVue

这是生成的第一个VUE的列子&#xff0c;目录如上所示。config目录里主要表示配置目录&#xff0c;包括端口号等&#xff0c;其中配置文件中dev.env.js&#xff0c;出现了webpack-merge模块&#xff0c;可以把分开配置的config合并&#xff0c;分开生产环境和调试环境 node_modu…

【51单片机快速入门指南】9:省电模式(低功耗)

目录硬知识实验正常工作掉电模式空闲模式普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK51 Prof.Developers Kit Version:9.60.0.0 硬知识 摘自《STC89C52系列单片机器件手册》 仅支持掉电模式&#xff0c;不支持空闲模式 STC89C52系列单片机可以运行2种省…

怎样为wordpress主题的文章列表添加无插件分页?

测试时间 2019.04.05 测试版本: wordpress 5.1.1 中文版 测试步骤&#xff1a;共 4 1. 在主题的 functions.php 中&#xff0c;添加分页函数&#xff0c;代码如下 /** * 数字分页函数 * 因为wordpress默认仅仅提供简单分页 * 所以要实现数字分页&#xff0c;需要自定义函数…

datatable DataRow

foreach (DataRow dr in dt.Rows) { ss ss dr["活动名称"].ToString() ","; }转载于:https://www.cnblogs.com/yuluhuang/p/3272237.html

HAproxy部署配置

HAproxy部署配置 拓扑图 说明&#xff1a; haproxy服务器IP&#xff1a;172.16.253.200/16 &#xff08;外网&#xff09;、192.168.29.140/24&#xff08;内网&#xff09; 博客服务器组IP&#xff1a;192.168.29.130/24、192.168.29.131/24 网站服务器组IP&#xff1a;192.16…

Javascript验证上传图片大小[前台处理]

2019独角兽企业重金招聘Python工程师标准>>> 需求分析&#xff1a; 在做上传图片的时候&#xff0c;如果不限制上传图片大小&#xff0c;后果非常的严重。那么我们怎样才可以解决一个棘手的问题呢&#xff1f;有两种方式&#xff1a; 1)后台处理&#xff1a; 也就是…

【RK3399Pro学习笔记】十二、ROS参数的使用与编程方法

目录创建功能包参数命令行使用YAML参数文件rosparamC编写程序配置CMakeLists.txt编译并运行python编写程序运行平台&#xff1a;华硕 Thinker Edge R 瑞芯微 RK3399Pro 固件版本&#xff1a;Tinker_Edge_R-Debian-Stretch-V1.0.4-20200615 记录自【古月居】古月ROS入门21讲 | …

在Ubuntu下如何压缩一个文件夹

.gz 解压1&#xff1a;gunzip FileName.gz 解压2&#xff1a;gzip -d FileName.gz 压缩&#xff1a;gzip FileName .tar.gz 解压&#xff1a;tar zxvf FileName.tar.gz 压缩&#xff1a;tar zcvf FileName.tar.gz DirName --------------------------------------------…

Cocos2D 添加 UIView

cocos2d是使用继承于ccnode的结点类型的层。但是我想用一个opengl来绘制&#xff0c;就简单的情况来说必须得加一个uiview。现转载如下&#xff1a; 第一部分&#xff1a;&#xff1a; 使用Cocos2D开发游戏和应用程序的时候&#xff0c;时常有些功能用系统控键很容易就实现&…

Mac terminal下解压缩命令大全

sudo tar zxvf wordpress-p1.tar.tgz tar 解包&#xff1a;tar xvf FileName.tar 打包&#xff1a;tar cvf FileName.tar DirName &#xff08;注&#xff1a;tar是打包&#xff0c;不是压缩&#xff01;&#xff09; ——————————————— .gz 解压1&#xff1a;g…

JS JAVASCRIPT 判断两个日期相隔多少天

var days daysBetween(2016-11-01,2016-11-02);/*** 根据两个日期&#xff0c;判断相差天数* param sDate1 开始日期 如&#xff1a;2016-11-01* param sDate2 结束日期 如&#xff1a;2016-11-02* returns {number} 返回相差天数*/function daysBetween(sDate1,sDate2){//Dat…

Yii2.0 ActiveForm Input Fields

2019独角兽企业重金招聘Python工程师标准>>> 之前5月学习Yii2的时候发现的一个不错的博客内容&#xff0c;这里转载保存。 Use the namespace For ActiveForm Active Form Begin And End Text Input Field TextArea Field Password Input Field HTML5 Email I…