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

在这里插入图片描述

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


在这里插入图片描述

本章将来学习如何利用话题通信,服务通信两种种方式对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)对多,同步,适用于偶尔调用的某一特定功能:拍照等

  • 37
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
ROS(Robot Operating System)是一个用于机器人开发的开源软件平台,它提供了一套完整的工具链,包括硬件驱动、通信中间件、算法库等,方便开发者快速构建机器人应用。 在ROS中,话题(Topic)是一种常用的通信机制,它可以用于不同节点之间的消息传递。下面是ROS话题通信的基本流程: 1. 编写发布节点(Publisher Node):发布节点负责向特定话题发送消息。通常情况下,发布节点会通过ROS API接口来实现消息的发布。 2. 编写订阅节点(Subscriber Node):订阅节点负责从特定话题接收消息。与发布节点类似,订阅节点也会通过ROS API接口来实现消息的订阅。 3. 创建话题(Topic):话题是发布节点和订阅节点之间的通信媒介。在ROS中,话题是通过ROS Master进行管理的。发布节点需要告诉ROS Master它将要发布的话题名和消息类型,而订阅节点需要告诉ROS Master它将要订阅的话题名和消息类型。 4. 运行发布节点和订阅节点:发布节点和订阅节点可以在同一台计算机上运行,也可以在不同的计算机上运行。不同计算机上的节点可以通过ROS Master进行连接。 5. 发布消息:发布节点向特定话题发送消息,消息可以是预定义的ROS消息类型,也可以是自定义的消息类型。 6. 接收消息:订阅节点从特定话题接收消息,接收到的消息可以被处理或传递给其他节点。 7. 关闭节点:当发布节点或订阅节点完成任务后,它们应该被正确关闭,以释放资源和关闭与ROS Master的连接。 以上就是ROS话题通信的基本流程。通过话题通信,不同节点之间可以实现实时的消息传递和数据共享,方便机器人应用的开发和调试。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ppeua

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值