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

简介: 现在可以直接使用键盘来控制乌龟运动了

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


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


90e54daf9ced4d598c37bb6c0b9dbce8.jpg


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

0. 话题发布


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

首先,先启动 turtlesim这个节点


6b1019ae4c214ac49b8ab588b68213d0.png


rosrun turtlesim    turtlesim_node
rosrun turtlesim turtle_teleop_key


现在可以直接使用键盘来控制乌龟运动了

我们在另一个窗口查看下当前节点关系


rqt_graph

4af88f9733db4adb893d210ec37be606.png


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


rostopic info /turtle1/cmd_vel


可以得到该话题的消息类型为 geometry_msgs/Twist

查看下该消息类型具体有什么参数


rosmsg show geometry_msgs/Twist


其具有两类参数 linear、angular分别为角速度与线速度,对应xyz上的值


7b76fedee5c942c5a7b60379b951d6d3.png


因为乌龟是一个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"


成功出现了新的一只小乌龟


63d2c306c4d24a7ca5c26fde90ccc9de.png


接下来看看代码如何编写


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)对多,同步,适用于偶尔调用的某一特定功能:拍照等

相关实践学习
Docker镜像管理快速入门
本教程将介绍如何使用Docker构建镜像,并通过阿里云镜像服务分发到ECS服务器,运行该镜像。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
9月前
|
存储 缓存 算法
【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍
相较于之前的通信模型,参数服务器是最为简单的。在之前的模型中,ROSMASTER都是扮演一个帮二者连接在一起的桥梁。
194 0
|
1天前
|
机器人 Python Windows
ROS机器人编程技术应用与实践
ROS机器人编程技术应用与实践
7 1
|
1天前
|
机器人 Unix C++
ROS机器人编程技术架构命令应用
ROS机器人编程技术架构命令应用
6 1
|
1天前
|
网络协议 机器人 中间件
单片机和FreeRTOS上跑机器人ROS的应用
单片机和FreeRTOS上跑机器人ROS的应用
91 0
|
1天前
|
机器人 C++ Python
[ROS2] --- 通信接口
[ROS2] --- 通信接口
[ROS2] --- 通信接口
|
7月前
|
弹性计算 运维 持续交付
基于资源编排服务(ROS)实现存量资源的IaC化
如果您需要一种简单而有效的方法来管理大量云资源并实现自动化部署,推荐使用阿里云的资源编排服务ROS(Resource Orchestration Service)。ROS能够将存量资源转化为IaC(基础设施即代码),通过资源场景创建、模版生成和资源栈导入等功能,实现资源的统一管理和自动化部署。这不仅提高了资源管理的效率,还降低了成本。如果您想了解如何更轻松地管理云资源并加速部署流程,ROS是一个值得深入了解的工具。
82 1
|
9月前
|
算法 中间件 C语言
【ROS】如何让ROS中节点实现数据交换Ⅱ --服务通信
在ros中,一个节点想要获取某种服务(例如:一个节点想要获取此时的相机数据,节点就需要向相机发送一个请求,而相机接收到请求后可以根据消息类型将数据类型返回),这就是基本的服务通信使用场景。
102 0
|
9月前
|
消息中间件 算法 机器人
【ROS】如何让ROS中节点实现数据交换Ⅰ--ROS话题通信
比较常用的目前就这一些,之后的命令现用现学就好了
179 1
|
9月前
|
机器学习/深度学习 机器人 决策智能
ubuntu16.04下ROS操作系统学习笔记(三 / 三)ROS基础-实现分布式通信
ubuntu16.04下ROS操作系统学习笔记(三 / 三)ROS基础-实现分布式通信
|
9月前
|
机器学习/深度学习 监控 机器人
ubuntu16.04下ROS操作系统学习笔记(三 / 二)ROS基础-ROS通信编程(下)
ubuntu16.04下ROS操作系统学习笔记(三 / 二)ROS基础-ROS通信编程(下)

推荐镜像

更多