【古月居《ros入门21讲》学习笔记】12_服务端Server的编程实现

目录

说明:

1. 服务模型

说明

2. 实现过程(C++)

创建服务器代码(C++)

配置服务器代码编译规则

编译

运行

3. 实现过程(Python)

创建服务器代码(Python)

运行效果


说明:

1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;

虚拟机版本Linux系统版本ROS系统版本
VMware WorkStation Pro 16Ubuntu18.04Melodic

2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);

3. 本节是整个笔记的第12节,对应视频课程的第14节,请自行对应学习;

4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注,      创作不易,感谢支持!


1. 服务模型

image-20230530103127331

说明

客户端通过服务给服务端发送一个任务请求,服务端完成任务后给客户端一个回应,但这个任务是通过话题实现的,也就是Client通过服务给Server发送一个让海龟运动或停止的请求Request,Server则创建topic,通过topic传递的消息来控制控制海龟运动或停止,然后再给Client一个是否完成请求的回应Rosponse,Client就能知道海龟此时的运动状态了。

/turtle_command:自定义的服务名

std_srvs::Trigger:触发,针对服务的一个标准数据类型的定义

2. 实现过程(C++)

创建服务器代码(C++)

cd ~/catkin_ws/src/learning_service/src
touch turtle_command_server.cpp

  • 初始ROS化节点;

  • 创建Server实例;

  • 循环等待服务器请求,进入回调函数;

  • 在回调函数中完成服务功能的处理,并反馈应答数据

/*** 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger*/#include <ros/ros.h>
#include <geometry_msgs/Twist.h>
#include <std_srvs/Trigger.h>
​
ros::Publisher turtle_vel_pub;
bool pubCommand = false;
​
// service回调函数,输入参数req,输出参数res
bool commandCallback(std_srvs::Trigger::Request  &req,std_srvs::Trigger::Response &res)
{pubCommand = !pubCommand;
​// 显示请求数据ROS_INFO("Publish turtle velocity command [%s]", pubCommand==true?"Yes":"No");
​// 设置反馈数据res.success = true;res.message = "Change turtle command state!"
​return true;
}
​
int main(int argc, char **argv)
{// ROS节点初始化ros::init(argc, argv, "turtle_command_server");
​// 创建节点句柄ros::NodeHandle n;
​// 创建一个名为/turtle_command的server,注册回调函数commandCallbackros::ServiceServer command_service = n.advertiseService("/turtle_command", commandCallback);
​// 创建一个Publisher,发布名为/turtle1/cmd_vel的topic,消息类型为geometry_msgs::Twist,队列长度10turtle_vel_pub = n.advertise<geometry_msgs::Twist>("/turtle1/cmd_vel", 10);
​// 循环等待回调函数ROS_INFO("Ready to receive turtle command.");
​// 设置循环的频率ros::Rate loop_rate(10);
​while(ros::ok()){// 查看一次回调函数队列ros::spinOnce();// 如果标志为true,则发布速度指令if(pubCommand){geometry_msgs::Twist vel_msg;vel_msg.linear.x = 0.5;vel_msg.angular.z = 0.2;turtle_vel_pub.publish(vel_msg);}
​//按照循环频率延时loop_rate.sleep();}
​return 0;
}

image-20230531124435875

配置服务器代码编译规则

add_executable(turtle_command_server src/turtle_command_server.cpp)
target_link_libraries(turtle_command_server ${catkin_LIBRARIES})

image-20230602110423494

编译

cd ~/catkin_ws
​
catkin_make
​
source devel/setup.bash(如已配置 **.bashrc**文件,则此步不需要,配置方法在publisher的章节里)

image-20230602111516931

运行

roscore
rosrun turtlesim turtlesim_node
rosrun learning_service turtle_command_server
rosservice call /turtle_command "{}" 

image-20230602140928489

3. 实现过程(Python)

创建服务器代码(Python)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将执行/turtle_command服务,服务数据类型std_srvs/Trigger
​
import rospy
import thread,time
from geometry_msgs.msg import Twist
from std_srvs.srv import Trigger, TriggerResponse
​
pubCommand = False;
turtle_vel_pub = rospy.Publisher('/turtle1/cmd_vel', Twist, queue_size=10)
​
def command_thread():   while True:if pubCommand:vel_msg = Twist()vel_msg.linear.x = 0.5vel_msg.angular.z = 0.2turtle_vel_pub.publish(vel_msg)time.sleep(0.1)
​
def commandCallback(req):global pubCommandpubCommand = bool(1-pubCommand)
​# 显示请求数据rospy.loginfo("Publish turtle velocity command![%d]", pubCommand)
​# 反馈数据return TriggerResponse(1, "Change turtle command state!")
​
def turtle_command_server():# ROS节点初始化rospy.init_node('turtle_command_server')
​# 创建一个名为/turtle_command的server,注册回调函数commandCallbacks = rospy.Service('/turtle_command', Trigger, commandCallback)
​# 循环等待回调函数print "Ready to receive turtle command."
​thread.start_new_thread(command_thread, ())rospy.spin()
​
if __name__ == "__main__":turtle_command_server()

cd ~/catkin_ws/src/learning_service/scripts
touch turtle_command_server.py

image-20230602142738701

给turtle_command_server.py文件赋作为可执行文件权限

image-20230602142850189

运行效果

image-20230602144244406

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

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

相关文章

解决electron-build打包后运行app报错:cannot find module xxx

现象&#xff1a; 关于这个问题查了很多资料&#xff0c;也问了chatgpt都没有找到答案。 最后只能靠自己了。 于是冷静下来回想一下细节。突然发现了一个特别点。 eletron-builder打包时&#xff0c;强制要求eletron-builder和eletron必须都放在devDependencies 否则&#…

echarts图表滚动条带动页面窗口滚动条的问题

网上搜了很多方法不管用&#xff0c;后来发现每次滚动echarts或者左右滑动echarts下方都会报错&#xff0c;报错提示如下&#xff0c;看看你们的图表是否这样报错&#xff1a; 报错信息如下&#xff1a;Unable to preventDefault inside passive event listener invocation 原…

基于隐马尔可夫模型的一种流水印

文章信息 论文题目&#xff1a;An Invisible Flow Watermarking for Traffic Tracking: A Hidden Markov Model Approach 期刊&#xff08;会议&#xff09;&#xff1a;ICC 2019 - 2019 IEEE International Conference on Communications (ICC) 时间&#xff1a;2019 级别&am…

Elsevier的latex模板

1.关于Elsevier的letex模板&#xff08; version 2.3 2021-05-11)一开始直接编辑出现The key ‘stm/author/&#xff1c;options&#xff1e;‘ is unknown and 的问 LaTeX Error: The key stm/author/<options> is unknown and is being ignored. 关于Elsevier的letex…

居家适老化设计第三十四条---卫生间之照明

居家适老化卫生间照明设计需要考虑以下几个方面&#xff1a;1. 光源选择&#xff1a;选择适合老年人眼睛的柔和光源&#xff0c;避免刺眼和眩光的发生。可以选择LED灯具&#xff0c;因为它们具有节能、寿命长和可调光的特点。2. 光线布置&#xff1a;在不同区域设置不同的光线&…

极智芯 | 解读国产AI算力算能产品矩阵

欢迎关注我的公众号 [极智视界],获取我的更多经验分享 大家好,我是极智视界,本文分享一下 解读国产AI算力 华为昇腾产品矩阵。 邀您加入我的知识星球「极智视界」,星球内有超多好玩的项目实战源码和资源下载,链接:https://t.zsxq.com/0aiNxERDq 算能属于自研 TPU 阵营,…

使用docker命令_进入容器_登录mysql服务_并执行sql语句---Docker工作笔记005

今天就用到了,不得不说用docker用到的还是少,记录一下,常用的也就这些吧. 首先执行: docker ps [root@localhost dataease-1.18.9]# docker ps CONTAINER ID IMAGE COMMAND CREATED …

数据分享 I 全国各市城镇化率,shapeflie格式,附数据可视化

基本信息. ​数据名称: 城镇化率 数据格式: shapeflie 数据时间: 2006-2020年 数据几何类型: 面 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据可视化. 安徽省各市2015年城镇化率 广东省各市2015年城镇化率 江西省各市2015年城镇化率

【Redis6快速深入学习04】Redis字符串(String)的使用和原理

Redis字符串(String) 4.1 Redis 中 String 的简介 String 是Redis五种最基本的类型之一&#xff0c;在使用时可以理解成与Memcached一模一样的类型&#xff0c;一个key对应一个value。 String 类型是二进制安全的。意味着 Redis 的 string 可以包含任何数据。比如 jpg 图片或…

【开源】基于Vue+SpringBoot的学校热点新闻推送系统

项目编号&#xff1a; S 047 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S047&#xff0c;文末获取源码。} 项目编号&#xff1a;S047&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新…

ros发布订阅超声波数据,c++举例

在ROS中&#xff0c;可以使用sensor_msgs/Range消息类型来发布和订阅超声波数据。sensor_msgs/Range消息类型包含以下字段&#xff1a; header&#xff1a;消息头&#xff0c;包含时间戳和帧ID。radiation_type&#xff1a;辐射类型&#xff0c;对于超声波传感器通常是"u…

贪心算法策略实现

贪心算法 贪心算法&#xff1a;基于某种情况进行一个排序。 贪心算法得到的是优良解&#xff0c;而非全局最优解。需要证明局部最优解 全局最优解 经典贪心算法 —— 会议问题 对于这个问题 &#xff0c;我们提出贪心策略&#xff1a; 策略1&#xff1a;按照会议的持续时间长…

第六届“强网”拟态防御国际精英挑战赛——特邀战队篇

第六届“强网”拟态防御国际精英挑战赛即将于2023年12月6日在南京盛大开赛&#xff01;本届挑战赛再次为全球顶尖战队提供实战机会&#xff0c;向多类拟态防御设备系统发起挑战&#xff0c;在众测实战中持续检验中国制造内生安全数字产品所具有的中国力量。 本届挑战赛参赛战队…

Spring的创建

文章目录 前言 一、创建一个Maven项目 二、添加spring框架支持 2.1在项目的pom.xml添加spring框架支持&#xff0c;xml配置如下  2.2添加包 总结 前言 我们通常所说的 Spring 指的是 Spring Framework&#xff08;Spring 框架&#xff09;&#xff0c;它是⼀个开源框架&a…

深入理解虚拟 DOM:提升前端性能的关键技术

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

windows定时任务命令工具schtasks

1.Schtasks概述 schtasks 是 Windows 操作系统中用于调度任务的命令行工具。它允许你在指定的时间或事件触发时运行程序或脚本。通过 schtasks 命令&#xff0c;你可以创建、修改、查询和删除计划任务。 2.Schtasks常用命令 查看帮助文档 schtasks /? 设定每月1号执行数据…

Kubernetes Dashboard 涉及的一些常规技巧

Kubernetes Dashboard 提供了一个GUI形式的K8S集群管理工具&#xff0c;通过它我们能很容易的观察到集群资源消耗情况、服务器运行状态以及针对Pod的相关观察与操作&#xff1b; Dashboard 的相关配置 Dashboard 提供了通过配置启动命令行参数来控制其相关行为的能力&#xf…

SeaTunnel引擎下的SQL Server CDC解决方案:构建高效数据管道

在快速发展的数据驱动时代&#xff0c;实时数据处理已经成为企业决策和运营的关键因素。特别是在处理来自各种数据源的信息时&#xff0c;如何确保数据的及时、准确和高效同步变得尤为重要。本文着重介绍了如何利用 SqlServer CDC 源连接器在 SeaTunnel 框架下实现 SQL Server …

React-hook-form-mui(五):包含内嵌表单元素的表单

前言 在上一篇文章中&#xff0c;我们介绍了react-hook-form-mui如何与与后端数据联调。在实际项目中&#xff0c;从后端获取的数据可能是复杂的数据对象&#xff0c;本文将介绍&#xff0c;如何通过react-hook-form-mui实现一个包含内嵌表单元素的表单 Demo 以下代码实现了…

利用Spring Boot构建restful web service的详细流程

本文档构建一个简单的restful webservice&#xff0c; 在官网原文Getting Started | Building a RESTful Web Service (spring.io)的基础上进行操作 文章目录 一、项目创建流程1.1 创建项目1.2 创建资源表示类1.3 创建资源控制类 二、项目运行参考资料 一、项目创建流程 本文的…