百度百科:
PR2 (Personal Robot 2, 个人机器人2)是威楼加拉吉生产的机器人。它的前身是斯坦福研究生埃里克·伯格和基南·威罗拜克开发的PR1机器人。PR2价格高昂,2011年零售价高达40万美元。PR2现主要用于研究。
PR2有两条手臂,每条手臂七个关节,手臂末端是一个可以张合的钳子。PR2依靠底部的四个轮子移动。在PR2的头部,胸部,肘部,钳子上安装有高分辨率摄像头,激光测距仪,惯性测量单元,触觉传感器等丰富的传感设备。在PR2的底部有两台8核的电脑作为机器人各硬件的控制和通讯中枢。两台电脑安装有Ubuntu和ROS。
依靠强大的ROS平台,PR2已能够独立完成多种复杂的任务。到如今,PR2能够自己开门,找到插头并给自己充电,能打开冰箱取出啤酒,能打简单的台球等等。
由于PR2价格高昂而且能力还达不到商业应用的要求,如今PR2主要用于研究。到2010年底,仅斯坦福,麻省理工学院,卡内基梅隆大学等美国少数大学和一些研究机构拥有PR2。
对于PR2这种众多功能模块集成的机器人怎么实现各个模块之间的通信呢?怎么实现到一些复杂的动作的呢?这就用到强大的ROS系统;ROS产生于PR2,同时ROS使PR2更加强大~
例如PR2
这种众多功能模块集成的机器人,每个功能模块都是一个node
,因此ROS
的节点都是一功能来划分的,不同的功能用不同的node
来实现;
rosrun [node_name]
rosnode list
rosnode info [node_name]
rosnode kill [node_name]
作用:
master
; 当我们需要同时启动多个节点,需不需要多次在终端启动node
呢?显然没有必要,ros
给我们提供了roslaunch
命令;
roslaunch [pkg_name] [file_name.launch]
如下图所示:launch文件的位置在包下面的launch文件里,*.launch文件已经配置好了用户的启动规则,执行launch文件就可以启动相关的master和node;
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
文件存放在package
的msg
目录下,srv
文件则存放在srv
目录下。) 结合面向对象的相关知识,可以做一个简单的类比,这里的message
文件相当于是类,类是一种标准和规范,当我们引用这个message
(比如publish
)的时候,我们相当于new
对象,显然,对象必须遵守累的规范;
msg
文件实际上就是每行声明一个数据类型和变量名。可以使用的数据类型如下:
int8, int16, int32, int64 (plus uint*)
float32, float64
string
time, duration
other msg files
variable-length array[] # 可变长数组
fixed-length array[C] #固定长数组
msg
在 ROS
中有一个特殊的数据类型:Header
,它含有时间戳和坐标系信息。在msg
文件的第一行经常可以看到Header header
的声明。
下面是一个msg
文件的样例,它使用了Header
,string
,和其他另外两个消息类型。
Header header
string child_frame_id
geometry_msgs/PoseWithCovariance pose
geometry_msgs/TwistWithCovariance twist
msg
rosmsg list
msg
内容rosmsg show /msg_name
ROS
中的同步通信方式Node
间可以通过request-reply
方式通信,客户端发送请求数据,服务器完成处理后返回应答数据;Client
发完一个请求之后,Node A
会进入阻塞状态,直到服务器返回一个reply
之后,Node A
才会继续执行;Topic | Service | |
---|---|---|
通信方式 | 异步通讯 | 同步通讯 |
实现原理 | TCP/IP |
TCP/IP |
通信模式 | Publish-Subscrible |
Request-Reply |
节点关系 | Publisher-Subscribler (多对多) |
Client-Server (多对一) |
接收者收到的数据回调(Callback ) |
远程过程调用(PCR )服务器端的服务 |
|
应用场景 | 连续、高频的数据分布 | 偶尔调用的功能/具体的任务 |
举例 | 激光雷达、里程计发布数据 | 开关传感器、拍照、逆解计算 |
Service
通信的数据格式——srvService
通信的数据格式*.srv
文件中srv
文件分为请求和响应两部分,由---
分隔。下面是srv
的一个样例:
int64 A
int64 B
---
int64 Sum
其中A
和 B
是请求, 而Sum
是响应。
launch
文件和node(API)读写
参数服务器是可通过网络API访问的共享的多变量字典(字典:即指key
、value
对,就是一种映射关系)。节点在运行时使用此服务器存储和检索参数。由于它不是为高性能而设计的,因此最适合用于静态,非二进制数据,例如配置参数。它意味着可以全局查看,以便工具可以轻松检查系统的配置状态并在必要时进行修改。
参数服务器使用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>
Service
,带有状态反馈的通信方式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个消息,以便客户端和服务器进行通信。这一代可以在制作过程中自动触发;