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

news/2024/10/30 17:28:05/

在这里插入图片描述

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 linearfloat64 xfloat64 yfloat64 z
geometry_msgs/Vector3 angularfloat64 xfloat64 yfloat64 z

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

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

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

import rospyfrom geometry_msgs.msg import Twistrospy.init_node("twist_pub")pub=rospy.Publisher("/turtle1/cmd_vel",Twist,queue_size=10)rate=rospy.Rate(10)twist=Twist()twist.linear.x=1twist.angular.z=1while 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 rospyfrom turtlesim.msg import Posedef 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 rospyfrom turtlesim.srv import *rospy.init_node("tospawn")client=rospy.ServiceProxy("/spawn",Spawn)request=SpawnRequest()request.x=5request.y=4request.theta=50request.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.ppmy.cn/news/98734.html

相关文章

Shell脚本while循环语句应用

记录:433 场景:Shell脚本while循环语句应用。Shell脚本while循环语句应用。while do done、while : do done、while true do done。 版本:CentOS Linux release 7.9.2009。 1.while常用格式 1.1格式一:while do done while c…

如何开发背包系统?

UE5 插件开发指南 前言0 背包数据结构1 背包管理组件2 背包UI显示前言 相信大家对于背包系统并不陌生,谁还没有玩过几款游戏呢?游戏中的背包都是大同小异的,朴素的功能就是存放我们获取到的物品,高级一点就是要有物品分类,便于玩家刷选背包中的物品,能够显示玩家拥有的货…

Python GUI:真的只知道PyQt?

B站|公众号:啥都会一点的研究生 有时候我们有需求将程序制作成GUI(图形用户界面)格式,以方便用户通过图形图标与电子设备进行交互,而大多数像我一样的小白基本上只知道PyQt,往往制作出来的界面一眼就可辨别…

apache部署

LAMP架构是目前成熟的企业网站应用模式之一,指的是协同工作的一整套系统和相关软件,能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词,具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP(或Perl、Pyth…

JSP(一) -- 简单入门

目录 1. JSP 简介 2. JSP和HTML以及Servlet的适用场景 3. 简单入门 1. JSP 简介 JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范。 JSP的本质其实就是一个特殊的 Servlet。 JSP的原理:

【2023】某python语言程序设计跟学第八周内容【完】

目录 1.从数据处理到人工智能1.1.python库之数据分析1.2.python库之数据可视化1.3.python库之文本处理1.4.python库之机器学习 2.实例:霍兰德人格分析雷达图3.从web解析到网络空间3.1.python库之网络爬虫3.2.python库之web信息提取3.3.Python库之web网站开发3.4.pyt…

精选100个Python实战项目案例,送给缺乏实战经验的你

前言: 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中。为什么这么多人学 Python ?我要喊出那句话了:“人生苦短,我用 Python!”,正是因为语法简单、容易学习,所以…

攻防世界安卓逆向练习

一.easy-so jadx分析程序逻辑 可以看到关键在于cyberpeace.CheckString()函数 双击跟进之后可以发现是native层函数 ida查看so文件 程序逻辑: 将字符串保存到新的空间buffer中第一个判断是将buffer的前16个字符和后16个字符进行交换第二个判断是将buffer的2个相邻的字符互换位…