【ROS】服务通信、话题通信的应用

news2024/12/26 23:20:29

在这里插入图片描述

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法…感兴趣就关注我吧!你定不会失望。

服务通信、话题通信的应用

  • 0. 话题发布
  • 1.话题订阅
  • 2.服务调用
  • 3.话题通信与服务通信的比较

在这里插入图片描述

本章将来学习如何利用话题通信,服务通信两种种方式对turtlesim进行一个控制

0. 话题发布

利用话题通信发布一个位姿信息,让乌龟一直做圆周运动

首先,先启动 turtlesim这个节点
在这里插入图片描述

rosrun turtlesim    turtlesim_node
rosrun turtlesim turtle_teleop_key

现在可以直接使用键盘来控制乌龟运动了
我们在另一个窗口查看下当前节点关系

rqt_graph

在这里插入图片描述

键盘节点通过 turtle1/cmd_vel这个话题向turtlesim发送速度控制消息,我们查看一下这个话题所使用的消息类型,方便进行下一步的修改

rostopic info /turtle1/cmd_vel

可以得到该话题的消息类型为 geometry_msgs/Twist
查看下该消息类型具体有什么参数

rosmsg show geometry_msgs/Twist

其具有两类参数 linear、angular分别为角速度与线速度,对应xyz上的值
请添加图片描述

因为乌龟是一个2d的,所以linear中z值为0,而angular中只有z值是有效的,其余都为0

geometry_msgs/Vector3 linear
  float64 x
  float64 y
  float64 z
geometry_msgs/Vector3 angular
  float64 x
  float64 y
  float64 z

知道了乌龟的消息类型与控制节点我们可以直接使用命令来控制乌龟的运动

rostopic pub /turtle1/cmd_ geometry_msgs/Twist "linear:
  x: 0.0
  y: 0.0
  z: 0.0
angular:
  x: 0.0
  y: 0.0
  z: 0.0

当然我们不想要这样,还可以通过python代码的方式来实现这段功能

import rospy

from geometry_msgs.msg import Twist

rospy.init_node("twist_pub")

pub=rospy.Publisher("/turtle1/cmd_vel",Twist,

queue_size=10)

rate=rospy.Rate(10)

twist=Twist()

twist.linear.x=1

twist.angular.z=1

while not rospy.is_shutdown():

    pub.publish(twist)

    rate.sleep()

这段代码创建了一个节点 twist_pub,实例化消息对象为twist,将其中的值设置后调用pub.publish发出即可。与之前所讲的没有什么差别。
引用msg消息时格式为:主消息包.msg/Twist
接下来,乌龟就会进行一个圆周运动。

1.话题订阅

实时订阅乌龟的位姿信息
先查看下当前话题下有什么话题与这个功能相关

rostopic list

会找到一个这样的话题 turtle1/pose,很明显,其就为发布乌龟位姿的话题。
我们可以直接订阅来看看

rostopic echo /turtle1/pose

就会在屏幕上显示出来乌龟的实时位姿。 说明我们找的方向是没有错的

接下来就是看看他的消息类型与消息内容了

rostopic info /turtle1/pose 

其消息类型为:turtlesim/Pose

rosmsg show turtlesim/Pose

其由五个数据组成

float32 x
float32 y
float32 theta
float32 linear_velocity
float32 angular_velocity

接下来就是编写接收方节点即可

import rospy

from turtlesim.msg import Pose

def doMsg(msg):

    rate.sleep()

    rospy.loginfo("乌龟x:%fm乌龟y:%f,乌龟角度:%f,乌龟线速度:%f,乌龟角速度:%f",msg.x,msg.y,msg.theta,msg.linear_velocity,msg.angular_velocity)

rospy.init_node("sub_turtle")

sub=rospy.Subscriber("turtle1/pose",Pose,
queue_size=10,callback=doMsg)

rate=rospy.Rate(1)

rospy.spin()

2.服务调用

利用代码生成新的乌龟
首先先查看下当前的服务列表。

rosservice list

会出现一个 /spawn 的节点其中文翻译为产卵,所以很明显就是我们需要的service

利用

rosservice type /spawn

查看下其srv类型 为: turtlesim/Spawn
在查看下具体参数

rossrv show turtlesim/Spawn

传入参数为坐标与名字,服务器返回值为名字

float32 x
float32 y
float32 theta
string name
---
string name

我们直接进行调用试试

rosservice call /spawn "x: 0.0 
y: 4.0
theta: 0.0
name: 'dsa'" 
name: "dsa"

成功出现了新的一只小乌龟
在这里插入图片描述

接下来看看代码如何编写

import rospy

from turtlesim.srv import *

rospy.init_node("tospawn")

client=rospy.ServiceProxy("/spawn",Spawn)

request=SpawnRequest()

request.x=5

request.y=4

request.theta=50

request.name="dfg"

#client.wait_for_service()
rospy.wait_for_service("spawn")

try:
    response=client.call(request)

    rospy.loginfo("乌龟的名字%s",response.name)

except:

    rospy.loginfo("异常")

3.话题通信与服务通信的比较

  1. Topic:多对多,异步,适用于连续高频发布消息与接受:雷达等

  2. Service: 一(service)对多,同步,适用于偶尔调用的某一特定功能:拍照等

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

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

相关文章

【软件分析/静态分析】学习笔记02——中间表示Intermediate Representation

🔗 课程链接:李樾老师和谭天老师的:南京大学《软件分析》课程02(Intermediate Representation)_哔哩哔哩_bilibili 目录 第二章 Intermediate Representation 2.1 编译器与静态分析器的关系(Compilers & Static …

SpringCloudAlibaba(简介及核心组件使用)

微服务架构常见的问题 一旦采用微服务系统架构,就势必会遇到这样几个问题: 这么多小服务,如何管理他们?服务发现/服务注册---》注册中心 这么多小服务,他们之间如何通讯?Feign -> 基于 http 的微服务调…

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言:Python3.x IDE:安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境,path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows,官网地址 Redirecting 点击下载按钮会到GitHub的…

使用golang 基于 OpenAI Embedding + qdrant 实现k8s本地知识库

使用golang 基于 OpenAI Embedding qdrant 实现k8s本地知识库 文章博客地址:套路猿-使用golang 基于 OpenAI Embedding qdrant 实现k8s本地知识库 流程 将数据集 通过 openai embedding 得到向量组装payload,存入 qdrant用户进行问题搜索,通过 openai embedding 得到向量,从…

“Jmeter WebSocket协议压测”,助你轻松应对高并发场景!

目录 引言 背景说明 步骤1:安装插件JMeter WebSocket Samplers 步骤2:采集器使用 步骤3:脚本执行 结语 引言 在当今高并发的网络环境下,WebSocket协议已经成为了最受欢迎的实时通信技术之一。然而,对于开发人员来…

CorelDRAW2023序列号及下载安装条件

始于1989年并不断推陈出新,致力为设计工作者提供更高效的设计工具!CorelDRAW滋养并见证了一代设计师的成长!在最短的时间内交付作品,CorelDRAW的智能高效会让你一见钟情!CorelDRAW 全称“CorelDRAW Graphics Suite“,也…

Linux:命令tar、zip、unzip对文件或文件夹进行压缩与解压

Linux:命令tar、zip、unzip对文件或文件夹进行压缩与解压 .tar压缩操作: 创建要进行压缩的文件: 对文件进行压缩: 将三个文件压缩成text.tar文件,压缩到当前路径下(默认也是在当前路径) 对比体积: 发现&…

关于f-stack转发框架的几点分析思考

使用DPDK收包,想要用到TCP协议栈,可选的方案有linux原生的tun/tap口以及DPDK自带的KNI驱动,这两种都是通过将DPDK收到的报文注入到linux内核来使用TCP协议栈的功能,然后,用户态协议栈可以考虑开源的f-stack&#xff0c…

在页面使用富文本编译器

富文本编译器的选择 Editor.mdTinyMCESimpleMDECKEditor 还有一些,这里讲的是我用的TinyMCE 1、下载 下载地址:下载tiny | TinyMCE中文文档中文手册 下载开发版本,我下载的最新版 tinymce_6.4.2_dev.zip 将压缩包解压后可以看到下面目录&…

(哈希表 ) 202. 快乐数——【Leetcode每日一题】

❓202. 快乐数 难度:简单 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到…

Groovy系列一 Groovy基础语法

目录 为什么要学习Groovy Groovy 介绍 Groovy 特点 Groovy 实战 动态类型 简单明了的list,map类型 在groovy世界任何东西都是对象 属性操作变得更容易 GString 闭包 委派:delegate Switch变得更简洁 元编程 强制类型检查 Elvis Operator 安全访问 为…

【五】设计模式~~~创建型模式~~~单例模式(Java)

【学习难度:★☆☆☆☆,使用频率:★★★★☆】 5.1. 模式动机 对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;一…

一波三折,终于找到 src 漏洞挖掘的方法了【建议收藏】

0x01 信息收集 1、Google Hack 实用语法 迅速查找信息泄露、管理后台暴露等漏洞语法,例如: filetype:txt 登录 filetype:xls 登录 filetype:doc 登录 intitle:后台管理 intitle:login intitle:后台管理 inurl:admin intitle:index of /查找指定网站&…

C++:征服C指针:指针(二)

指针二 1. 指向数组的指针2. 多维数组三级目录 上一篇文章我们介绍了:什么是指针,指针常见的问题,本篇我们主要介绍 :指针与数组。 1. 指向数组的指针 int *p[n] : 指针数组, 它包括 n 个成员,每个成员都是…

探索Maven创建项目全过程(超详细~~~)

文章目录 1.Maven介绍2.Servlet介绍2.1 Servlet定义2.2 Servlet的主要任务 3.创建Servlet程序步骤3.1 创建项目3.2 引入依赖3.3 创建目录3.4编写代码3.5 打包程序3.6 部署程序3.7 验证结果 4.更方便的部署方式4.1.下载Tomcat插件4.2 配置Tomcat插件4.3运行项目 1.Maven介绍 Ma…

认识Tomcat

hi,大家好,今天为大家带来Tomcat的相关知识 🍭1.Tomcat是什么 🍭2.Tomcat的下载安装 🍭3.Tomcat的目录结构 🍭4.启动Tomcat 🍭5.部署博客系统到Tomcat 🍉1.Tomcat是什么 我们之前也已经学了http,http…

【JAVAWEB】HTML的常见标签

目录 1.HTML结构 1.1认识HTML标签 1.2HTML文件基本结构 1.3标签层次结构 1.4快速生成代码框架 2.HTML常见标签 注释标签 标题标签:h1-h6 段落标签:p 换行标签:br 格式化标签 图片标签 超链接标签:a 表格标签 列表标签 表单标…

Windows 同时安装 MySQL5 和 MySQL8 版本

👏作者简介:大家好,我是Rockey,不知名企业的不知名开发着 🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦 📝联系方式:he18339193956,…

MySQL 00 : MySQL_数据库shell登录时遇到的问题

问题1描述:输入链接数据块的命令提示 sh:mysgl:command not found 解决:第一步配置环境变量来解决 1、vim /etc/profile 2、末尾写入export PATH$PATH:/usr/local/mysql/bin 3、保存 4、执行 source /etc/profile 第二部 问题描述 Mac通过MAMP安装MySQL时&#…

K8s之Replicaset控制器详解

文章目录 一、ReplicaSet 控制器介绍二、ReplicaSet案例1、Pod副本扩缩容案例2、Pod更新版本案例 一、ReplicaSet 控制器介绍 官方中文参考文档: ReplicaSet是k8s中一种资源对象,简写 rs,用于管理Pod副本数量和健康状态,在spec.…