1.1 定义机器人的7个标准
在开始着手于机器人编程任务之前,需要明确是什么让一个机器人能真正被称作机器人。那么,什么时候才能让一个自操作的软件控制装置有资格成为一个机器人呢?在ASC(Advanced Software Construction公司,作者为机器人和软件机器人打造智能引擎的地方),一台机器需要满足以下7个标准:
1.?通过编程,应具备以一种或多种方式感知外部或内部环境的能力。
2.?其行为、动作和控制是执行一组程序指令的结果,并可重复编程。
3.?通过编程,应具备以一种或多种方式来影响外部环境、与外部环境交互或者在外部环境中进行操作的能力。
4.?应拥有自己的电源。
5.?应具备一种语言,它适合表示离散指令和数据并支持编程。
6.?一旦启动,无需外部干预即具备执行程序的能力。
7.?必须是一个没有生命的机器。
下面将详细阐释上述标准。
1.1.1 标准1:感知环境
一个有用或有效的机器人应具有一些感知、测量、评估或监测环境与态势的方法。机器人计划执行的任务决定了其需要什么感知,以及如何在所处环境中利用这些感知。它可能需要识别环境中的对象、记录或区分声音、测量遇到的物质、通过触碰定位或规避物体等。在某种程度上,如果缺少感知环境与态势的能力,机器人将很难完成任务。当然,除了具有一些感知环境与态势的方法之外,机器人还必须具有接受指令的能力,诸如如何、何时、何地以及为何使用其感知等。
1.1.2 标准2:可编程的动作和行为
应要有给机器人指令的描述方法:
执行什么动作
何时执行动作
何地执行动作
何种情形下执行动作
如何执行动作
通过本书可知,对机器人编程相当于给机器人一系列关于是什么、何时、何地、为什么和如何执行动作问题的一组指令。
1.1.3 标准3:改变环境、与环境交互或作用于环境
一个有用的机器人不但需要感知环境,而且在某种程度上要改变其所处的环境或态势。换言之,一个机器人应能够通过行动改变某些东西或利用某些东西来完成任务,否则就是无用的。采取行动或执行任务的过程应影响或作用于环境,否则就无法得知机器人的行动是否有效。一个机器人的行动以某种可测量的方式改变其所处环境、场景或态势,并且这种改变是向机器人发出一组指令后直接的结果。
1.1.4 标准4:具备电源
机器人的主要功能之一是执行某种动作,这就需要消耗机器人的能量。能量应来自某种电源,比如电池、电力、风力、水力和太阳能等。只有电源持续提供能量,机器人才能操作和执行动作。
1.1.5 标准5:适用于表示指令和数据的语言
一个机器人需要给定一系指令以确定如何、何时、何地以及在何种态势或场景下执行什么动作。有些指令是硬连接于机器人的,并且不论机器人处于何种情况,只要其有主动电源便会一直执行这些指令。这是机器人的机械部分。常规机器与机器人之间最重要的差异之一表现为:机器人可以接收新指令而不用重建或改变硬件,也无需重新连接。机器人拥有接收指令和命令的语言,该语言应能够表示命令和数据以描述机器人的环境、情景或态势。机器人的语言装置应允许给定指令而无需物理连接,即机器人可以通过一组指令实现再编程。
1.1.6 标准6:无需外部干预的自主性
我们坚持本条是定义机器人的硬性标准,虽然此观点仍有争议。我们认为,真正的机器人是完全自主的,但该观点并未得到所有机器人专家的认同。图1-1源自机器人新兵训练营,它给出了机器人操作的两种基本分类。
图1-1 机器人操作的两种基本分类
机器人操作或机器人控制一般分为两类:
遥控机器人
自主机器人
类似自主机器人,遥控机器人也接收指令,但这些指令是实时的,由外部源(人类、计算机或其他机器)实时发送或有一定时延。指令以某种遥控形式发送,机器人按照指令要求执行动作。机器人接收到信号后就会执行动作,有时一个遥控信号会触发多个动作;其他情况下,信号与动作是一一对应关系,即一个信号对应一个动作。
这里需要注意的一个要点是,在没有遥控或外部干预的情况下,遥控机器人不会执行任何动作。然而自主机器人的指令会提前存储于机器人内,以执行一系列动作。自主机器人能够自己出发命令,不需要依赖遥控来执行或启动每一个动作。需要明确的是,实际会存在混合型机器人和运行情景发生改变的情况,即遥控机器人具有一些自主行为,以及自主机器人有时会进入一个木偶模式。
但是,我们对完全自主机器人和半自主机器人进行了区分,并且整本书可能都称为强自主性或弱自主性。本书将介绍完全自主机器人编程的概念和技术,而并未涵盖遥控编程技术。
1.1.7 标准7:一个没有生命的机器
虽然有时认为植物和动物是可编程的机器,但它们不是机器人。当我们对机器人进行构建、编程和部署时,必须有许多伦理规范。当机器人学发展到一定高度时,即把机器人看作有生命的时候,也自然会对机器人重新进行定义。
1.1.8 机器人分类
虽然许多类型的机器可能满足7个标准中的1个或多个,但是一台机器若要看作一个真正的机器人,必须至少满足上述7个标准。需要明确的是,一个机器人可以多于但不能低于这7种特性。幸运的是,我们并没有要求一个机器人像人类那样具有智力或情感。事实上,现在使用的大多数机器人与人类很少有共同点。机器人分为三个基本类别,如图1-2所示。
这三类机器人仍然可以基于其如何运行和编程做进一步划分。之前我们将机器人描述为遥控机器人或自主机器人。因此,我们有遥控的或自主的地面、空中或水下机器人。图1-3展示了空中或水下机器人的简单分类。
图1-2 机器人的三种基本分类
图1-3 空中和水下机器人的运行模式
空中和水下机器人
空中机器人也称为无人机(Unmanned Aerial Vehicle,UAV)或自主式无人机(Autonomous Unmanned Aerial Vehicle,AUAV)。但不是每个UAV和AUAV都有资格成为一个机器人,记住前面的7个标准。大多数UAV仅仅是机器,但其中有一些满足所有7个标准且可以通过编程来执行任务。水下机器人也称为遥控潜水器(Remotely Operated Vehicle,ROV)和自主式水下机器人(Autonomous Underwater Vehicle,AUV)。类似于UAV,大多数ROV仅仅是机器而并未上升到机器人的水准,但是水下机器人也可以像任何其他机器人那样编程和控制。
正如你可能会想到的那样,空中和水下机器人经常面临的问题是地面机器人通常不需要考虑的。例如,水下机器人必须通过编程在水下导航和运行,也必须处理所有来自水生环境(如水压、水流、水等)的挑战。大多数地面机器人不用或不需要在水生环境中运行,也通常并不需要防水防潮设计。
空中机器人负责起飞、降落,并且它们通常在离地数百或数千英尺的空中运行。UAV机器人所编程必须考虑一个航空器所要面对的一切挑战(比如,如果一个空中机器人失去了所有动力会发生什么?)。而一个地面机器人耗尽电源后可能只是简单地停止工作。
如果出现导航或电源问题,UAV和ROV都可能会遇到灾难。不过,地面机器人有时也可能遇到危险。它们可能在边缘掉落、从楼梯上滚下、钻进液体里或在恶劣天气里失灵。一般而言,机器人只运行在上述某一类环境中,很难建立和设计一个可以运行于多类环境的机器人。UAV通常不在水中操作,ROV通常也不在空中操作。
虽然本书中的大多数示例集中于地面机器人,但是所介绍的机器人编程的概念和技巧可以应用于所有这三类机器人。机器人具有其框架,
图1-4展示了一个简化的机器人组成框架。
所有真正的机器人具有图1-4所示的基本组成框架。不论一个机器人属于哪一类(地面、空中或水下),它应至少包含四类可编程组件:
一个或多个传感器
一个或多个执行器
一个或多个末端作用器/环境作用器
一个或多个微控制器
这四类组件是最基本的机器人编程核心。在最简单的形式里,机器人编程归结为用控制器控制机器人的传感器、执行器和末端作用器。是的,机器人编程远比仅仅处理传感器、执行器、感受器和控制器要复杂,但是这些组件主要构成了机器人的内部和外部设备。机器人编程的其他主要涉及机器人的场景,我们将在后面介绍。现在,首先来看看(其实也是简单看)这四个基本的可编程机器人组件。
1.1.9 传感器
传感器是机器人在这个世界上的眼睛和耳朵。它们是可以使机器人接收其当前环境下输入、信号、数据或信息的组件。传感器是机器人与这个世界的接口,换言之,传感器是机器人的感官。
机器人传感器有许多不同的类型、形状和大小,有感知温度的传感器,有感知声波、红外线、运动、无线电波、气体和土壤成分的传感器,也有测量引力的传感器。传感器可以使用摄像机来实现可视和识别方向。人类局限于视觉、触觉、嗅觉、味觉和听觉这五种基本感觉,而机器人在传感器方面几乎具有无限潜力。机器人可以装备几乎所有种类的传感器,并且只要电源支持,可以配备尽可能多的传感器。第5章会详细讲述传感器。现在只是把传感器看作一种装置,为机器人提供关于其当前态势或场景的输入和数据。
每个传感器都要负责给机器人某种关于其当前所处环境的反馈。通常,机器人从某个传感器阅读数值或向某个传感器发送数值。但是,传感器并不仅仅是自动感知,机器人的编程还会指定何时、如何、何地以及在何种程度上使用传感器。编程决定了传感器处于哪种模式以及机器人接收到传感器的反馈后做什么。
例如,我有一个配备了光传感器的机器人,根据传感器的复杂度不同,可以让机器人利用其光传感器来确定一个物体是否是蓝色的,然后只取回蓝色物体。如果一个机器人配备的是声传感器,我可以让它听到某种声音执行一个动作,听到另一个不同的声音执行另一个动作。
并不是所有的传感器都是平等的。对于给机器人配备的任何传感器,在其所属类别中都有一个从低端至高端的具体定位。例如,有些传感器只能检测4种颜色,而有些光传感器可以检测256种颜色。机器人编程部分包括熟悉机器人的传感器设置、传感器能力和局限性。一个传感器越通用越高级,相应的机器人任务就可以更精巧。
机器人的效能受其传感器所限制。机器人若只有一个可视距离仅几英寸的摄像机传感器,它就无法看到一英尺远的东西;若只配备检测红外线的传感器,它就不能看到紫外线,等等。本书讨论机器人的效能并且从机器人框架层面(见图1-4)描述它。我们基于以下几方面来评估一个机器人的潜在效能:
执行器的效能
传感器的效能
末端作用器的效能
微控制器的效能
REQUIRE
通过机器人效能的简单测量,得知传感器占机器人潜在效能的近四分之一比重。我们开发了一种测量机器人潜力的方法,称为实际环境中的机器人效能熵(Robot Effectiveness Quotient Used in Real Environments,REQUIRE)。使用REQUIRE作为一个最初的试金石,以确定我们可以通过编程让机器人做什么和不能做什么。稍后我们再解释REQUIRE,并且将其作为一个机器人性能指标贯穿本书。需要重点注意的是,传感器的质量以及如何对其编程决定了一个机器人潜在效能的25%。
1.1.10 执行器
执行器是提供机器人部件运动的组件。对于机器人来说,电机通常扮演着执行器的角色。电机可以是电动的、液压的、气动的或其他能源。执行器提供了机器人手臂的动作,或是牵引机构、轮子、螺旋桨、手动遥控杆或机翼和机器人腿的运动。执行器允许机器人移动其传感器,以及旋转、移动、打开、关闭、提高、降低、扭曲和转动其组件。
可编程机器人的速度和机器人力量
执行器或电动机最终决定了一个机器人的移动速度。机器人的加速度与其执行器紧密相关。执行器也决定了一个机器人可以举起或托住多少重量。执行器与一个机器人可以生成多少扭矩或力密切相关。完整地编程一个机器人涉及给予机器人关于如何、何时、为什么、何地和在何种程度上使用执行器的指令。很难想象或建立一个没有任何运动类型的机器人。这种运动可能是外部的或内部的,但它必须是存在的。
小贴士
回忆前面列出的机器人要求中的标准3:通过编程,机器人应能够以一种或多种方式影响其外部环境、与外部环境交互或作用于外部环境。
机器人必须以某种方式在其环境中运行,而执行器则是互动的关键组件。类似传感器设置,机器人的执行器可以实现或限制其潜在效能。例如,执行器让一个机器人的手臂只能转动到45°,则对于要求转动90°的情形就不再有效。或者若执行器只能以200r/min移动螺旋桨,对于要求1?000r/min的场合,执行器将阻止机器人恰当地执行所要求的任务。
因此,机器人的运动必须要有正确的类型、距离、速度、角度和自由度,执行器是提供这种运动的可编程组件。执行器涉及一个机器人可以移动多少重量或质量。如果任务要求机器人举起一个2?000mL或1kg液体的容器,但其执行器的极限仅仅约为0.35kg,则机器人注定失败。
机器人的效能通常是由其在特定态势或场景中的有用性来衡量的。执行器通常决定一个机器人能或不能完成多少工作。类似传感器,机器人的执行器不是简单地自我驱动,需要对其编程。和传感器一样,执行器使用范围包括从低端的简单功能到高端、自适应、复杂的功能。编程工具越灵活,执行器执行能力越强。第7章将更详细地讨论执行器。
1.1.11 末端作用器
末端作用器是机器人在其环境中处理、操作、改变或控制对象的硬件。末端作用器是使得机器人的动作对它所处环境或场景产生影响的硬件。执行器和末端作用器通常紧密相关。大多数末端作用器需要使用执行器或与其交互。
机器人末端作用器常见的例子有手臂、钳子、爪子和手。末端作用器有许多形状和大小,并具有多种功能。例如,一个机器人可以使用钻头、抛射体、滑轮、磁铁、激光器、声波冲击器,甚至渔网作为末端作用器。类似传感器和执行器,末端作用器也受机器人编程
控制。
对机器人进行编程所面对的挑战,一部分来自于指导机器人充分利用其末端作用器来完成任务。末端作用器同样也会决定机器人能否成功完成一个任务。类似传感器,一个配备了多个末端作用器的机器人能同时操控不同类型的对象或相似对象。是的,有时候最好的末端作用器是那些按两个、四个、六个等一组工作的。末端作用器必须具有与对象交互的能力,这些对象在机器人的场景或环境中被其操控。第7章会详细介绍末端作用器。
注释
末端作用器符合机器人定义的标准3。机器人必须能够做某事以改变某些东西或利用某些东西来做某事。机器人必须在其环境或态势中产生影响,否则就无用。
1.1.12 控制器
控制器是机器人用于“控制”其传感器、末端作用器、执行器和运动的组件。控制器是机器人的“大脑”。控制器的功能可通过多个控制器实现,但其通常是一个微控制器。微控制器是一个位于芯片上的小型单片机。图1-5展示了一个微控制器的基本组成。
控制器或微控制器是可编程的机器人组件,并且支持机器人的动作和行为编程。根据定义,一个连微控制器都没有的机器不是机器人。但需要记住的是,可编程仅仅是7个标准中的一个。
图1-5 微控制器的基本组成
控制器既能控制机器人的内存组件,又是拥有机器人内存的组件。注意,图1-5中有4个组件。处理器负责计算、符号操作、指令执行和信号处理。输入端口从传感器接收信号并且把这些信号发送给处理器处理。处理器发送信号或指令给连接到执行器的输出端口,于是它们可执行动作。
发送传感器的信号使得传感器置于传感器模式。这些信号用于初始化执行器、设置电动机转速、起动电动机运动、停止电动机等。
因此,处理器通过来自传感器的输入接口获得反馈,发送信号和命令给输出端口并最终指向电动机、机器人手臂以及机器人活动部件(诸如牵引机构、滑轮和其他末端作用器)。
注释
处理器执行指令。每个处理器都有自己的一套机器语言。发送给处理器的一组指令必须最终转换为处理器的语言。因此,如果我们用英语着手进行我们想要给处理器执行的一组指令,这些指令最终必须转换为微控制器中处理器可以理解和执行的指令。图1-6展示了向机器语言转化的基本步骤。
图1-6 向机器语言转化的好点子
在本书中,前文讨论过BURT用于将好点子转化为机器语言,因此你可以很清楚在机器人编程过程中发生了什么。除非你有一个使用英语或一些其他自然语言作为内部语言的微控制器,否则所有指令、命令和信号都必须转化为可以被微控制器中处理器所识别的形式。
图1-7简单给出了传感器、执行器、末端作用器和微控制器之间的交互关系。
图1-7中的记忆元件是机器人指令存储和当前所运行的数据存储的地方。当前运行的数据包括来自传感器、执行器、处理器、或存储数据或信息(必须最终由控制器的处理器处理)所需任何其他外围设备的数据。我们已经在本质上将一个机器人简化至基本的机器人主体:
传感器
执行器
末端作用器
微控制器
从最基本的层面上来说,编程一个机器人等同于通过给微控制器一组指令集来处理机器人的传感器、末端作用器和运动。不管我们正在编程的是一个地面、空中或水下机器人,基本的机器人主体是相同的,并且都必须处理一组核心的初级编程活动。编程一个机器人去自主执行一个任务要求我们在某种程度上传达这项任务给机器人的微控制器。只有在机器人的微控制器存在这个任务后,机器人才可以执行。图1-8展示了我们转化的机器人主体。
图1-7 微控制器、传感器、执行器和末端作用器之间的基本相互作用
图1-8展示了相类似的基本机器人组成。机器人传感器、执行器和末端作用器肯定有更详细的形式,但是图1-8显示了一些常用形式,并传达了我们在本书中使用的基本思想。
注释
我们特别强调微控制器,因为它是一个机器人主要的可编程组件,并且当我们讨论机器人编程时,通常也会涉及微控制器。末端作用器和传感器也很重要,但微控制器处于“驾驶员”的位置,能设置并读取传感器、控制机器人运动以及操作末端作用器部件。表1-2列出了针对低成本机器人的一些常用的微控制器。
图1-8 转化的机器人主体
虽然本书中大多数示例开发时采用的是Atmega、ARM7和ARM9微控制器,但是我们介绍的编程理念可以应用于具有图1-4基本机器人主体和满足我们7个机器人标准的任何机器人。
1.1.13 机器人所在的场景
机器人主体只讲了机器人编程故事的一半,另外一半不在于实际的机器人部分,而是机器人场景或态势。机器人是在一个特定的环境中执行某个类型的任务的。机器人若是有用必须能在环境中造成某种影响。机器人的任务和环境不只是随机的、未指定的概念。有用的机器人必须在特定场景或态势中执行任务。机器人在场景或态势中扮演给定的某种角色。举例来说,图1-9中所示为一个机器人参加一场生日聚会。
图1-9 一个生日聚会机器人
我们有一个机器人,称之为BR-1,分配给它两个任务:
点燃蛋糕上的蜡烛
聚会结束后清除盘子和杯子
生日聚会是机器人所处的场景。机器人BR-1扮演的角色是点燃蜡烛和清除盘子与杯子的人。场景与期望相伴,有用的机器人是由期望驱动的。生日聚会上会有期望,通常生日聚会会有场所、蛋糕、冰淇淋、客人、庆祝活动、时间和礼物。对于BR-1去完成其在生日聚会上的角色,它必须有处理场景或特定态势的指令,比如:
蛋糕的位置
点燃蜡烛的数量
机器人相对于蛋糕的位置
点燃蜡烛的时间
聚会如何以及何时结束
盘子和杯子的数量等
机器人的实用性和成功与否取决于其在特定态势中扮演角色的好坏。每个场景或态势都有一个场所、一组对象、条件和一系列事件。自主机器人位于场景内并且受期望驱动。当对一个机器人编程时,我们期望它以某种方式参与和影响一个态势或场景。描绘场景、与场景交流和给机器人设置期望是机器人编程故事的后半部分。
小贴士
简言之,编程一个有用的机器人相当于编程一个机器人利用其传感器和末端作用器,通过在某个特定态势或场景中执行一组任务而完成其角色并满足期望。
编程一个有用的机器人可以分为两个基本层面:
指导机器人利用其基本能力去实现某些期望
在某个给定态势或场景中给机器人解释期望是什么
通过编程,一个自主机器人无需人类干预就能在特定态势或场景中实现期望时,它就是有用的。因此,一半工作需要编程机器人以执行某个任务或一组任务。
另一半任务则需要指导机器人在一个或多个特定场景中执行其功能。我们的机器人编程方法是场景驱动的。机器人在态势和场景中扮演一定角色,且这些态势和场景一定是编程和指导机器人成功执行任务的重要部分。