机器人操作系统(ROS,Robot Operating System),是一个开源的机器人软件平台,专为机器人软件开发设计。ROS是一个元级操作系统,提供类似于操作系统的服务,如硬件抽象、底层驱动程序管理、共用功能执行、程序间消息传递和程序发行包管理。此外,ROS还提供一些工具和库,用于获取、建立、编写和执行多机器人融合的程序。
ROS的运行架构采用P2P的
松耦合网络连接处理架构,支持多种类型的通讯,包括基于服务的同步RPC通讯和基于Topic的异步数据流通讯,以及参数服务器上的数据存储。尽管实时性在机器人控制中具有重要意义,但ROS并非实时操作系统(RTOS)。然而,通过与实时计算代码的整合,ROS 2成为了一个主要的ROS API修订版,利用现代的库和技术实现核心ROS函数,并添加支持实时代码和嵌入式系统硬件的支持。
在ROS生态系统中,软件可以分为三类:语言-independent工具、主要客户端库(
C++、
Python和
LISP),这些工具和库均受BSD协议约束,因此是开源软件,可用于商业和科研使用。其他大部分软件则采用各种开源许可。这些其他
软件包 implements commonly used functionality and applications,如硬件驱动、机器人模型、数据类型、规划、感知、SLAM、
仿真工具和其他算法。
主要ROS客户端库依赖大量开源软件,因此主要面向Unix-like系统。由于这些客户端库依赖大量开源软件,Ubuntu Linux被标记为“支持”,而其他版本(如Fedora Linux、
Mac OS和Microsoft Windows)则是“实验性”,由社区提供支持。然而,原生JavaROS客户端库rosjava并未受到这些限制,使ROS-based软件得以在Android OS上编写。rosjava还使ROS得以与 officially supported MATLAB工具箱整合,该工具箱可在
Linux、macOS和Microsoft Windows上使用。
简介
ROS的运行架构是一种使用ROS通信模块实现模块间P2P的松耦合的网络连接的处理架构,它执行若干种类型的通讯,包括:
产品功能
Turing OS是一款
人工智能级机器人操作系统,集成人机对话、视觉识别及
运动控制等人工智能核心技术,强技术、稳服务、周期短、成本低,帮合作伙伴更快开发出属于自己的实体机器人与智能应用。
Turing OS具有的多模态交互能力,让
人机交互更流畅多元,能综合处理文字、语音、视觉、触觉等多维度信息,精确解析用户意图,做出拟人化响应。
图灵机器人 OS具有多种AI能力,包括身高检测、人脸检测、人脸识别、人脸跟踪、声音情绪识别、颜色识别、特征识别和在线物体识别等,助力合作伙伴开发出更丰富、体验更好的智能机器人。
基于Turing OS 1.5版本,开发了机器人应用服务,涵盖远程、游戏、教育、工具、社交等诸多领域,当前应用总数达30余种。
发展经历
2015年11月6日,
人工智慧创业团队图灵机器人对外发布了人工智能机器人操作系统Turing OS。
2016年7月28日,在首届
图灵机器人创新大会上再次推出人工智能机器人操作系统Turing OS 1.5。
图灵机器人CEO
俞志晨宣布:为了支撑机器人应用创新,TuringOS已从原1.0版本升级至1.5版本,视觉能力、
运动控制及硬件模块得到增强。
发展目标
ROS的首要设计目标是在机器人研发领域提高代码复用率。ROS是一种分布式处理框架(又名Nodes)。这使可执行文件能被单独设计,并且在运行时松散
耦合。这些过程可以封装到数据包(Packages)和
堆栈(Stacks)中,以便于共享和分发。ROS还支持代码库的联合系统。使得协作亦能被分发。这种从文件系统级别到社区一级的设计让独立地决定发展和实施工作成为可能。上述所有功能都能由ROS的基础工具实现。
为了实现“共享与协作”这一首要目标,人们制订了ROS架构中的其他支援性目标:
行业展望
随着机器人产业链的深入发展,越来越多的科技巨头认同“机器人产业发展将遵循PC发展轨迹”这一观点,而在PC普及及标准化的过程中,体验良好、操作简单的操作系统的出现扮演了重要角色。
从该方面来看,TuringOS的发布对推动机器人产业发展及普及而言意义重大,或许,这只是
图灵机器人实现“智能机器人走进每个家庭”的第一步。
ROS
ROS 的 Filesystem Level
文件系统层概念就是你在碟片里面遇到的资源,例如:
ROS 的 Computation Graph Level
Computation Graph Level(计算图)就是用ROS的P2P(peer-to-peer
网络传输协议)网络集中处理所有的数据。基本的Computation Graph的概念包括Node, Master, Parameter Server,messages, services, topics,和bags,以上所有的这些都以不同的方式给Graph传输数据。
Nodes: Nodes(节点)是一系列运行中的程序。ROS被设计成在一定
颗粒度下的模块化系统。一个机器人控制系统通常包含许多Nodes。比如一个Node控制
激光雷达,一个Node控制车轮马达,一个Node处理定位,一个Node执行路径规划,另外一个提供图形化界面等等。一个ROS节点是由Libraries ROS client library写成的, 例如 roscpp和rospy。
Master: ROS Master 提供了登记列表和对其他计算图的查找。没有Master,节点将无法找到其他节点,交换消息或调用服务。
Server Parameter Server: 参数服务器使数据按照钥匙的方式存储。参数服务器是主持的组成部分。
Messages:节点之间通过messages来传递消息。一个message是一个简单的
数据结构,包含一些归类定义的区。支持标准的原始数据类型(整数、
浮点数、布尔数,等)和原始数组类型。message可以包含任意的嵌套结构和数组(很类似于
c语言的结构structs)
Topics: Messages以一种发布/订阅的方式传递。一个
node.js可以在一个给定的topic中发布消息。Topic是一个
人名被用于描述消息内容。一个node针对某个topic关注与订阅特定类型的数据。可能同时有多个node发布或者订阅同一个topic的消息;也可能有一个node同时发布或订阅多个topic。总体上,发布者和订阅者不了解彼此的存在。主要的概念在于将信息的发布者和需求者解耦、分离。逻辑上,topic可以看作是一个严格规范化的消息
总线。每个bus有一个名字,每个node都可以连接到bus发送和接受符合标准类型的消息。
Services:发布/订阅模型是很灵活的通讯模式,但是多对多,单向传输对于分布式系统中经常需要的“请求/回应”式的交互来说并不合适。因此,“请求/回应”是通过services来实现的。这种通讯的定义是一种成对的消息:一个用于请求,一个用于回应。假设一个节点提供了一个服务提供下一个name和客户使用服务发送请求消息并等待答复。ROS的客户库通常以一种远程调用的方式提供这样的交互。
Bags: Bags是一种格式,用于存储和播放ROS消息。对于储存数据来说Bags是一种很重要的机制。例如
传感器数据很难收集但却是开发与测试中必须的。
在ROS的计算图中,ROS的Master以一个
人名 service的方式工作。它给ROS的节点存储了topics和service的注册信息。Nodes 与Master通信从而报告它们的注册信息。当这些节点与master通信的时候,它们可以接收关于其他以注册节点的信息并且建立与其它以注册节点之间的联系。当这些注册信息改变时Master也会回馈这些节点,同时允许节点动态创建与新节点之间的连接。
节点之间的连接是直接的; Master仅仅提供了查询信息,就像一个DNS服务器。节点订阅一个topic将会要求建立一个与发布该topics的节点的连接,并且将会在同意连接协议的基础上建立该连接。ROS里面使用最广的连接协议是TCPROS,这个协议使用标准的TCP/IP 接口。
这样的架构允许解耦操作(decoupled operation),通过这种方式大型或是更为复杂的系统得以建立,其中names方式是一种行之有效的手段。names方式在ROS系统中扮演极为重要的角色: topics, services, and parameters 都有各自的names。每一个ROS客户端库都支持重命名,这等同于,每一个编译成功的程序能够以另一种形似【名字】运行。
例如,为了控制一个北阳激光测距仪(Hokuyo laser range-finder),我们可以启动这个hokuyo_node 驱动,这个驱动可以给与激光仪进行对话并且在"扫描"topic下可以发布sensor_msgs/LaserScan 的信息。为了处理数据,我们也许会写一个使用laser_filters的node来订阅"扫描"topic的信息。订阅之后,我们的
过滤器将会自动开始接收激光仪的信息。注意两边是如何脱钩工作的。所有的hokuyo_node的节点都会完成发布"扫描",不需要知道是否有节点被订阅了。所有的过滤器都会完成"扫描"的订阅,不论知道还是不知道是否有节点在发布"扫描"。在不引发任何错误的情况下,这两个nodes可以任何的顺序启动,终止,或者重启。
以后我们也许会给我们的机器人加入另外一个
激光器,这会导致我们重新设置我们的系统。我们所需要做的就是重新
映射已经使用过的names。当我们开始我们的第一个hokuyo_node时,我们可以说它用base_scan代替了映射扫描,并且和我们的
过滤器节点做相同的事。这些节点将会用
Base_scan的topic来通信从而代替,并且将不再
监听"扫描"topic的信息。然后我们就可以为我们的新
激光测距仪启动另外一个hokuyo_node。