目前很多互联网公司都在开发自己的硬件产品(小米的小爱同学,腾讯听听音箱、叮当等),包括深圳这边一家非常有名的人形机器人公司优必选,有的机器人产品注重屏幕和交互,有的则注重路径、物体、语音及人脸识别等高级算法,除了安卓,还有不少人形机器人是基于 ROS 开发的。

ROS

ROS(Robot Operating System) 是一个在计算机上对机器人进行操作的一个开源系统(严格来讲是一种操作系统中间件)。它提供类似操作系统所提供的功能,包含硬件抽象描述、底层驱动程序管理、共用功能的执行、程序间的消息传递、程序发行包管理,它也提供一些工具程序和库用于获取、建立、编写和运行多机整合的程序。支持多种语言,C++、Python、Octave和LISP,也支持多种语言混合使用。

基本框架和概念

开源项目

  • main:核心部分,提供一些分布式计算的基本工具,以及整个ROS的核心部分。
  • universe:一种是库的代码,如OpenCV、PCL等;库的上一层是从功能角度提供的代码,如人脸识别,他们调用下层的库;最上层的代码是应用级的代码,让机器人完成某一确定的功能。

三个级别

计算图级—>文件系统级—>社区级。

计算图级

计算图是ROS处理数据的一种点对点的网络形式。程序运行时,所有进程以及他们所进行的数据处理,将会通过一种点对点的网络形式表现出来。

  • 节点:执行运算任务的进程。
  • 消息:节点之间是通过传送消息进行通讯的(标准数据类型或嵌套结构和数组)。
  • 主题:消息以一种发布/订阅的方式传递。一个节点可以在一个给定的主题中发布消息。一个节点针对某个主题关注与订阅特定类型的数据。
  • 服务:主题是广播式的。单播(同步传输模式)用服务,服务以一个字符串和一对严格规范的消息定义:一个用于请求,一个用于回应。
  • ROS 控制器:给ROS的节点存储了主题和服务的注册信息,是一个超级管理员,管理系统中所有节点,包括节点之间的相互通信。

ROS 系统基本结构:

举例:机器人上有一个摄像头,我们希望能够从机器人图像处理单元以及另外一台计算机上观察摄像头的图像。

  1. 需要一个管理员 ROS Master 管理整个系统,然后建立三个节点,分别是摄像头节点、机器人中的图像处理节点以及计算机上的显示节点。
  2. 在ROS Master的管理下,摄像头节点(Camera Node)发起一个主题(Topic)发送图像信息,同时,另外两个节点订阅这个主题(Topic)。
  3. 当摄像头节点从摄像头获得一帧新的图像时,它将立刻将获得的图像发送给另外两个节点(基于TCP/IP)。
  4. 如果机器人图像处理节点需要在某一个特定的时刻向摄像头节点请求一个信息,这种情况采用服务。图像处理节点可以告诉ROS Master,我需要向摄像头节点请求一项服务,然后ROS Master 将在摄像头节点和图像处理节点之间建立一个请求服务/应答的联系通道。图像处理节点将首先请求图像信息,然后摄像头节点将收集所需要的信息发送给图像处理节点。

文件系统级

在硬盘上面查看的ROS源代码的组织形式。

ROS的软件以包的方式组织起来。包包含节点、ROS依赖库、数据套、配置文件、第三方软件、或者任何其他逻辑构成。
堆是包的集合,它提供一个完整的功能,像“navigation stack”。

对ros的一些理解

根据这个教程,ROS 虽然号称是操作系统,但实际并不是传统意义上的操作系统。它只是一个通信的架构、一个代码管理的框架。操作系统的功能:任务的时序规划和CPU资源分配等等工作都是依靠linux来实现的,因此ROS不可能脱离linux,他们是一体的。

机器人的核心平台——多传感器和处理器之间的通信、处理器和执行器之间的通信,这些通信必须有统一的时钟,比如做传感器数据融合,如果从传感器抓回来的数据时间上都不同步,那融合根本没法做。ROS的通信架构,主要解决的就是这个问题:让设备之间的通信有一个统一的调度中枢(roscore),通过这个调度中枢不但可以让信号传递更好控制,还能够通过构建通信设备之间的关系来让开发者明白自己的机器人内部在干什么。

综上总结:我们可以把ros理解成一套基于Linux的能够协调各种传感器和CPU工作的开发框架。

基于安卓系统的机器人开发

在安卓进行机器人开发没有像在 Ubuntu 上ROS一样被广泛使用的开发框架。从网上看到的一些例子来看,基于安卓的机器人开发主要涉及以下内容:

  • 硬件平台:器件选型以及主要运动模块的制作和实现。
  • 软件平台:Linux 内核和
    Android 操作系统在实体机上的编译,往实验平台上烧写在实体
    机中编译的 Linux 内核镜像和 Android 操作系统镜像。
  • 针对实际需要对实验平台的硬件接口进行功能重设:设计编写硬件驱动程序,并将其在 Linux 内核中进行编译识别,最后为新编译的驱动设计编写硬件驱动层和硬件访问服务层的实现程序,使得 Android 应用程序中能够使用这些硬件。
  • 安卓应用程序开发。可以是开发板应用软件,也可以有远程控制端软件,实现对机器人的运动控制。

对比

  1. Ubuntu 和 Android 都可以看做基于Linux内核的不同版本。Ubuntu是机器人领域里开发最受欢迎的一个版本,就是因为ROS。80%的ROS都是运行在Ubuntu上的。从官方信息看,ros移植到安卓上是可行的,官网也有一些不成熟的教程。(有人做了这样的尝试:文章来源)。

    The native Java ROS client library, rosjava, has enabled ROS-based software to be written for the Android OS.

  2. ROS能够支持多种语言,如C++、python、Octave和LISP,甚至支持多种语言混合使用。Android支持Java和C++(NDK层)。
  3. 如果只是一个交互,像触摸屏,让它发声,Android是没有问题的,但如果让机器人做人脸、声音、路径识别,这些算法自己来实现是很困难的,而ros有很多人会把库贡献在这个平台上,为开发者提供了很多方便。
  4. 如果产品是重交互,轻路径、人脸识别,或者人工智能这样场景的产品,安卓比较好;但是如果产品有更多的机会用到一些复杂算法,则 Ubuntu+ROS 应该是更好的选择。

其他机器人系统

  • V-sido:日本一家公司开发的系统,做的是类似于ros的事情。

参考资料:
基于Android的双目视觉机器人运动平台无线网络控制系统
基于Android机器人–智能家居
Ubuntu Core 和SNAP 开发技术介绍
Programming Robots with ROS
ros教程
机器人开源项目盘点