ROS
1.什么是ros
ROS 的雏形诞生:
斯坦福大学人工智能实验室的STAIR 机器人项目这个项目希望完成一个服务机器人原型,在视觉的辅助下,可以在复杂环境中运动,还可以通过机械臂操控环境中的物体。
STAIR 机器人配备了一个运动底盘,一个小型机械臂,立体摄像头、激光雷达。
摩根·奎格利(Morgan Quigley)在开发中意识到,各种功能集成在一个机器人上非常不容易,因此那时他就考虑并采用了“分布式”的方式来连接不同的模块。并将这一概念成功应用到机器人软件系统中,取名为Switchyard。
ROS 本尊诞生:
摩根·奎格利的导师吴恩达,帮助柳树车库机器人公司(Willow Garage)开发PR2 机器人
和软件系统,摩根·奎格利则利用在STAIR 项目中积累的经验,成为软件开发框架的负责人。STAIR 项目的软件系统Switchyard 则演变成后来ROS。
Robot Operating System 机器人操作系统
ROS 不是传统意义上的操作系统,不是用于进程管理和调度,而是构建在其它操作系统之上的一种结构化的通讯层;ROS 的主要目标是为机器人研究和开发提供代码复用的支持。
2.ros通讯结构
看一张图它从下往上分别分成了OS 层,中间层,应用层。
OS 层:OS 层是操作系统层也就是我们现在使用的ubuntu,它提供了操作系统这一层的相关东西,对我们ROS 开发来说不需要过多了解。
中间层:这里有TCPROS/UDPROS、Nodelet API、ClientLibrary。
TCPROS/UDPROS 是基于TCP、IP 协议做的二次封装取名为TCPROS 和UDPROS;
Nodelet API 为了弥补TCPROS/UDPROS 使用中的一些不足它是使用一种共享内存的方法而不是网络传输的实现一些数据共享;
ClientLibrary 是客户端的库,这个库就是指把UDPROS 和TCPROS 再继续进行封装成了一些ROS 的具体通信实现方法例如我们后面要提到的话题、服务等等;
应用层:应用层的最左边是一个Master,Master 是跟中间层一起框起来,上面标注了一个Ros。这是因为Master 节点是每一个Ros 进行中必须要有的并且只能唯一有的所以说Master 节点也是Ros 官方提供的。它是用来管理右边这些应用层的Node 等等。而每一个note 就是一个个相互独立的应用。
ROS 的通信是在OS 层之上、基于TCP/IP 协议实现。
node和master
node节点:
一个可执行程序进程,通常一个node 负责者机器人的某一个单独的功能,例如右边图24上的Camera Node 就是一个相机的节点。不同的节点可以使用不同的编程语言C++或python。在同一个ROS 下节点对于编程语言是没有要求的,可以每个节点用互相不同的语言。在右边有一个Image Display Node,它是运行在另一台电脑上的图像处理节点。也就是说Ros 的节点是可以运行在同一局域网下的不同机器人上。
master:每个节点都负责单独的一部分功能,节点跟节点之间要互相发现彼此这就需要master。master 相当于一个管理中心,每一个node 启动的时候先要在Master 处进行一次注册告诉master 自己的基本信息,需要订阅什么话题,需要发布什么话题。node 之间的通信也是先由master进行“牵线”,才能两两的进行点对点通信,一个ROS计算图中有且只有一个master
节点之间的通讯方式:节点和节点之间的通信具体有4 种实现方法,分别是话题、服务、动作、参数
话题
example 话题被两个Subscriber 所订阅了
话题的通讯是单向的,这个订阅过程是完全单向的Publisher 只管发Subscriber 只管收。一个话题可以被多个Subscriber 订阅,也可以由多个发布者来发布。话题是实时性差且异步的通讯。Publisher 的发送时间跟Subscriber 接收到的时间并不是严格同步的,而且Publisher 是不知道Subscriber 有没有收到或者说有多少Subscriber 收到了。话题的一般应用场景为,一个传感器的信息发布。例如激光雷达发布扫描的数据,或者相机发布图像就会用话题的方式来发布。话题传递的内容就是message,而message type 就是话题的消息类型。当发布者通过udp 或者tcp 协议发出去一段字符之后接收者接收到了应该怎么样去解析,这就需要共同定义好一个解析的方式这个也就是消息的格式。
服务
服务的通讯是双向的,有一条实线箭头和一条虚线箭头。实线这边是从Client 端发往Server 端的这是一个起始,是由客户端向服务端发起的请求。请求在执行完之后再向客户端返回一个应答这个就是服务的过程。