【Addicted TO ROS】ROS中的通信架构与通讯方式

ROS中的通信架构与通讯方式

  • 关于PR2
  • 通讯架构
    • node(节点)
      • 启动node
    • master(节点管理器)——控制中心
      • 启动master
      • roslaunch
      • *.launch文件书写规则
  • 通讯方式
    • Topic(话题)
      • 概述
      • 常用命令
    • `topic`内容的数据类型——Message(消息)
      • 概要
      • 常用命令
    • Service(服务)
      • 概要
      • Topic VS Service
      • `Service`通信的数据格式——srv
    • Parameter Service(参数服务器)
      • 概要
      • 使用`rosparam`进行参数的读写
      • 使用`.lauch`文件进行参数的读写
    • Action
      • Action通信的数据格式——action
        • action文件

关于PR2

【Addicted TO ROS】ROS中的通信架构与通讯方式_第1张图片

百度百科:

PR2 (Personal Robot 2, 个人机器人2)是威楼加拉吉生产的机器人。它的前身是斯坦福研究生埃里克·伯格和基南·威罗拜克开发的PR1机器人。PR2价格高昂,2011年零售价高达40万美元。PR2现主要用于研究。
PR2有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的钳子。PR2依靠底部的四个轮子移动。在PR2的头部,胸部,肘部,钳子上安装有高分辨率摄像头,激光测距仪,惯性测量单元,触觉传感器等丰富的传感设备。在PR2的底部有两台8核的电脑作为机器人各硬件的控制和通讯中枢。两台电脑安装有Ubuntu和ROS。
依靠强大的ROS平台,PR2已能够独立完成多种复杂的任务。到如今,PR2能够自己开门,找到插头并给自己充电,能打开冰箱取出啤酒,能打简单的台球等等。
由于PR2价格高昂而且能力还达不到商业应用的要求,如今PR2主要用于研究。到2010年底,仅斯坦福,麻省理工学院,卡内基梅隆大学等美国少数大学和一些研究机构拥有PR2。

【Addicted TO ROS】ROS中的通信架构与通讯方式_第2张图片
 对于PR2这种众多功能模块集成的机器人怎么实现各个模块之间的通信呢?怎么实现到一些复杂的动作的呢?这就用到强大的ROS系统;ROS产生于PR2,同时ROS使PR2更加强大~

通讯架构

node(节点)

  • ROS的进程、独立运行的可执行文件
  • pkg里的可执行文件运行的实例
  • 不同的节点可以使用不同的编程语言,可以分布在不同的主机上
  • 节点在系统中的名称必须是唯一的

 例如PR2这种众多功能模块集成的机器人,每个功能模块都是一个node,因此ROS的节点都是一功能来划分的,不同的功能用不同的node来实现;

启动node

  • 启动node
rosrun [node_name]
  • 列出当前运行的node信息
rosnode list
  • 显示某个node的详细信息
rosnode info [node_name]
  • 结束某个node
rosnode kill [node_name]

master(节点管理器)——控制中心

作用:

  • 每个node(节点)启动时都要向master注册,即master为节点提供名和注册服务
  • 管理node(节点)之间的通信;
  • 跟踪结合记录话题、服务通信,辅助节点相互查找、建立连接;
  • 提供参数服务器,节点使用此服务器存储和检索运行时的参数;
    【Addicted TO ROS】ROS中的通信架构与通讯方式_第3张图片
    因此在我们启动ROS程序之前,第一步就是启动master;

启动master

【Addicted TO ROS】ROS中的通信架构与通讯方式_第4张图片

roslaunch

 当我们需要同时启动多个节点,需不需要多次在终端启动node呢?显然没有必要,ros给我们提供了roslaunch命令;

  • 启动多个master和多个node
roslaunch [pkg_name] [file_name.launch]

如下图所示:launch文件的位置在包下面的launch文件里,*.launch文件已经配置好了用户的启动规则,执行launch文件就可以启动相关的master和node;
【Addicted TO ROS】ROS中的通信架构与通讯方式_第5张图片

*.launch文件书写规则

【Addicted TO ROS】ROS中的通信架构与通讯方式_第6张图片

通讯方式

Topic(话题)

概述

  • ROS中的一部通信方式,节点间通过publish-subscrible机制通信来传输数据的重要总线;
  • publish-subscrible机制中,数据由发布者传输到订阅者,同一个话题的订阅者或发布者可以不唯一;

 节点A通过在/Topic上发布消息,节点B通过在相应的/Topic订阅消息,进而实现通信;
在这里插入图片描述
 话题的发布与订阅是一种异步的通讯方式:即发布者无需关注是否有人订阅消息,无需等待消息返回的状态;且订阅者,有自己订阅的消息则去处理,没有则去处理其他事情;
 一个/Topic可以被多个node订阅;

常用命令

  • 列出当前所有topic
rostopic lsit
  • 显示某个topic的属性信息
rostopic info /topic_name
  • 显示某个topic的内容
rostopic echo /topic_name
  • 向某个topic发布内容
rostopic pub /topic_name ...

topic内容的数据类型——Message(消息)

 消息(msg): msg文件就是一个描述ROS中所使用消息类型的简单文本。它们会被用来生成不同语言的源代码。

概要

  • topic内容的数据类型(格式标准,相当于类)包括ROS提供的标准类型和用户自定义类型
  • 定义在*.msg文件中,编译过程中会生成对应的代码文件(msg文件存放在packagemsg目录下,srv文件则存放在srv目录下。)
    【Addicted TO ROS】ROS中的通信架构与通讯方式_第7张图片

 结合面向对象的相关知识,可以做一个简单的类比,这里的message文件相当于是类,类是一种标准和规范,当我们引用这个message(比如publish)的时候,我们相当于new对象,显然,对象必须遵守累的规范;
【Addicted TO ROS】ROS中的通信架构与通讯方式_第8张图片
msg文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:

int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] # 可变长数组
fixed-length array[C] #固定长数组

msgROS中有一个特殊的数据类型:Header,它含有时间戳和坐标系信息。在msg文件的第一行经常可以看到Header header的声明。
 下面是一个msg文件的样例,它使用了Headerstring,和其他另外两个消息类型。

  Header header
  string child_frame_id
  geometry_msgs/PoseWithCovariance pose
  geometry_msgs/TwistWithCovariance twist

常用命令

  • 列出系统上所有msg
rosmsg list
  • 显示某个msg内容
rosmsg show /msg_name

Service(服务)

概要

  • ROS中的同步通信方式
  • Node间可以通过request-reply方式通信,客户端发送请求数据,服务器完成处理后返回应答数据;
     服务的请求与响应是一种同步的通讯方式:当Client发完一个请求之后,Node A会进入阻塞状态,直到服务器返回一个reply之后,Node A才会继续执行;
    在这里插入图片描述

Topic VS Service

Topic Service
通信方式 异步通讯 同步通讯
实现原理 TCP/IP TCP/IP
通信模式 Publish-Subscrible Request-Reply
节点关系 Publisher-Subscribler(多对多) Client-Server(多对一)
接收者收到的数据回调(Callback 远程过程调用(PCR)服务器端的服务
应用场景 连续、高频的数据分布 偶尔调用的功能/具体的任务
举例 激光雷达、里程计发布数据 开关传感器、拍照、逆解计算

Service通信的数据格式——srv

  • Service通信的数据格式
  • 定义在*.srv文件中

srv文件分为请求和响应两部分,由---分隔。下面是srv的一个样例:

int64 A
int64 B
---
int64 Sum

其中AB是请求, 而Sum是响应。

Parameter Service(参数服务器)

概要

  • 存储各种参数的字典
  • 适合存储静态、非二进制的配置参数,不适合存储动态配置的数据;
  • 读写灵活,可用命令行,launch文件和node(API)读写

 参数服务器是可通过网络API访问的共享的多变量字典(字典:即指keyvalue对,就是一种映射关系)。节点在运行时使用此服务器存储和检索参数。由于它不是为高性能而设计的,因此最适合用于静态,非二进制数据,例如配置参数。它意味着可以全局查看,以便工具可以轻松检查系统的配置状态并在必要时进行修改。
 参数服务器使用XMLRPC实现,并在ROS Master内部运行,这意味着可以通过常规XMLRPC库访问其API

使用rosparam进行参数的读写

  • 列出当前所有参数
rosparam list
  • 显示某个参数的值
rosparam get param_key
  • 设置某个参数的值
rosparam set param_key parm_value
  • 保存参数到文件
rosparam dump file_name
  • 从文件读取参数
rosparam load file_name
  • 删除参数参数
rosparam delete param_key

使用.lauch文件进行参数的读写

<lauch>

	<param>param>
	<rosparam>rosparam>
lauch>

Action

  • 类似于Service,带有状态反馈的通信方式
  • 通常用在长时间、可抢占的任务中

【Addicted TO ROS】ROS中的通信架构与通讯方式_第9张图片

  • 类比:
    【Addicted TO ROS】ROS中的通信架构与通讯方式_第10张图片

Action通信的数据格式——action

  • action通信的数据格式
  • 定义在*.action文件中

action文件

 行为规范使用.action文件。.action文件有目标定义,然后是结果定义,然后是反馈定义,每个部分用3个连字符(—)分隔。

 这些文件被放置在包的./action目录,看起来非常类似于服务.srv文件。一个行为规划的摆放可能看起来如下:
./action/DoDishes.action

# 定义目标goal
uint32 dishwasher_id  # Specify which dishwasher we want to use
---
# Define the result
uint32 total_dishes_cleaned
---
# Define a feedback message
float32 percent_complete

 在这个.action的基础上,需要生成6个消息,以便客户端和服务器进行通信。这一代可以在制作过程中自动触发;

你可能感兴趣的:(ROS,notes)