机器人人工智能(txt+pdf+epub+mobi电子书下载)


发布时间:2020-08-08 04:20:32

点击下载

作者:(美)Francis X. Govers(弗朗西斯·戈弗)

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

机器人人工智能

机器人人工智能试读:

前言

本书的目标已经完整地标在封面上了——机器人人工智能。本书的重点是应用于地面移动机器人的机器学习技术。本书从讲述专业的机器人设计原理开始,书中讲述的内容已经针对小型的机器人项目进行了缩减。AI 部分,首先讲述用于物体识别的卷积神经网络,然后是强化学习和遗传算法。我们的机器人可以接收语音,并可以学习使用基于AI 的语音识别技术来讲笑话。这种语音识别技术可以分辨用户的意图。本书还介绍了一种新的导航方式,它不需要地图,使用所谓的分治程序,也就是用房间的上部来记住路径,用下部来避开障碍物。本书演示了如何综合使用路径规划、决策树、对象分类和导航来解决问题。结尾部分,我们为机器人增加了人工人格。在最后一章,总结了对机器人未来发展的不同看法,并对机器人技术职业提出了建议。

整本书围绕着一个有趣的实例任务展开,就是设计并构建一个可以在室内非结构化环境下清理玩具的机器人。在学习中你会发现,这个项目并不简单。

本书针对的人群

本书的目的是成为高级机器人技术的研究者、专业人员、业余爱好者以及那些有过基本的机器人工作经历,并寻求在教育和技能集上更进一步的学生们的桥梁。

本书的读者需要熟悉Python 语言和机器人操作系统(ROS),以及Linux,在高等数学知识方面并没有太多要求。

本书涉及的内容

第1章介绍人工智能以及本书用到的机器人技术基础。本章还会介绍要用到的AI框架:观察——定位——决策——行动(OODA)模型,以及软实时控制。

第2章包括机器人架构、ROS 以及软硬件创建——包括本书演示用机器人的创建。

第3章介绍了一个简化的机器人设计系统方法,该方法综合使用了用例(来自系统工程)以及故事板(来自敏捷开发)来给读者提供一个解决机器人和人工智能难题时使用的架构和流程。

第4章介绍了如何创建一个人工神经网络。读者会学习到图像识别的基础知识以及如何使用Keras 和Python 来训练和评估一个神经网络。

第5章介绍了让机器人自己学习如何使用它的机械臂的技术。这里的关键技术是,要有一个机制让机器人可以为它的行为进行打分。我们会探索强化学习并深入研究遗传算法。

第6章开发基于语音的命令系统——一种使用AI技术来理解词语并预测说话人意图的数字助手。我们会介绍语音识别和自然语言处理的基本概念,例如上下文、知识库、意图识别以及句子重建。我们会教机器人既能够理解也能讲敲门游戏里的笑话。

第7章帮助读者理解机器人导航,包括SLAM。它会帮助你综合使用两项技术:寻找楼梯以躲开障碍,以及在无地图的情况下使用神经网络图像识别技术进行导航。

第8章包括了路径规划、决策树、分类技术、波前法、A*(A 星)算法和D*(D 星)算法,以及基于节点的规划方法。

第9章讲述了仿真和蒙特卡洛模型、机器人情感引擎、人类情感模型,以及如何把人格规则整合到一个基于聊天机器人的对话引擎中。

第10章讲述了人工智能和机器人技术未来发展的一些内容,以及对机器人技术职业的一些建议。

充分利用本书

本书的读者需要熟练掌握Python 语言编程——2.7 版本或3.6 版本都可以。本书大多数例子是用Python 2.7 版本编写的,不过要转换到3.6 及以上版本相当容易——主要是替换print 语句。ROS 只支持Linux 操作系统,读者可以用在Windows 电脑中创建Linux 虚拟机的方式来提供支持,笔者在写这本书的时候也是这么做的。如果你需要ROS 的更详细使用说明,Packt 出版社有几本很棒的书,讲述了相关知识。本书不会用到超出中学水平的数学知识。如果想跟着我一起组装机器人,你需要一些基本的工具(螺丝刀、扳手、六角螺丝小扳手以及电烙铁)。

其他所有的安装说明都放在了本书对应的章节中。

下载示例代码文件

你可以使用自己的账号登录到链接2 所指向的网站,下载本书所有的示例代码文件。如果你是从其他地方购买的本书,可以打开链接3 进行注册,代码文件会直接通过电子邮件发送给你。

下载代码文件的步骤如下:

1.打开链接4 所示的网站,登录或者注册。

2.选择SUPPORT 选项卡。

3.单击Code Downloads & Errata。

4.在Search 输入框内填入书名,然后按屏幕上的指令操作。

完成文件下载后,使用以下软件的最新版本解压它:

· Windows 下的WinRAR/7-Zip。

· macOS 下的Zipeg/iZip/UnRarX。

· Linux 下的7-Zip/PeaZip。

本书的代码包同时也放在GitHub 上,可参见链接5 所指向的网站,此处的代码会保持更新。

在链接6 所示的网页上还有很多其他书的代码包以及一些相关视频,你可以去查阅它们。

下载彩色图片

我们还提供了一个PDF 文件,里面包含了本书中用到的彩色截屏和图片。你可以下载链接7 所指示的文件。

代码运行效果

从链接8 所示的网址可以查看代码运行时的视频。

使用的约定

本书遵从以下几个文本格式约定。

代码体:用来显示代码段、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟URL、用户输入等。例如:“我们正使用Python 来编写控制循环,所以我们使用time.time()函数。”

代码块的显示格式如下所示:

输入的命令行以及命令输出的显示格式如下:这个图标表示警告或者重要提醒。这个图标表示小窍门。

与我们联系

我们欢迎读者随时提出反馈意见。

一般反馈:请发电子邮件到feedback@packtpub.com,并在邮件主题里写上书名。如果你对于本书的任何方面有疑问,请发邮件到questions@packtpub.com。

勘误:虽然我们已经很小心地确保内容的准确性,但肯定还有错漏之处。如果你提交发现的错误,我们会十分感激。你可以打开链接9 所示的网页,选择书名,然后输入错误详情并提交。

盗版:如果你在互联网上发现我们的书籍被以任何形式非法复制,请通过邮箱copyright@packtpub.com 给我们提供网址和网站名称,我们会无比感激。

成为作者:如果你在某个技术领域有专长并且有兴趣自己编写或者参与编写著作的话,请浏览链接10 所示的网页。

评论

欢迎留下你的评论。如果你阅读了本书,为什么不在网页上留下你的评论呢?这样潜在的读者就能看到你中立的观点,以决定是否购买本书;我们Packt 出版社也能了解你的想法;作者也能看到你对于他们著作的反馈。谢谢你!

要获取更多关于Packt 出版社的信息,请浏览链接11 所示的网站。

读者服务

微信扫码回复:38377

· 获取博文视点学院20 元付费内容抵扣券

· 获取本书参考资料中的配套链接

· ·获取更多技术专家分享的视频与学习资源

· 加入读者交流群,与更多读者互动1 高级机器人技术和人工智能的基础

本书的目标读者是这样的人群:他们已经学习了一些机器人技术,并且希望更进一步,通过增加人工智能行为来提高机器人、无人机或者自动驾驶汽车的能力,让它们更加先进。他们可能早就使用标准部件制作出了自己的机器人,这些机器人可以四处移动,或许还可以创建地图,并且可以通过一些基本的传感器来躲避障碍。他们面对的问题是:接下来要做什么?

本书所讲的AI 机器人,与普通机器人的根本区别在于:能力、决策软件,以及它们如何使用通过传感器获得的数据来学习和适应环境,均有所不同。更具体一些说,我们要跳出(普通机器人的)确定性行为的世界。当提到系统确定性时,我们指的是对于同一组输入,机器人总是产生同样的输出。当面对同一个情景时,比如遇到同一个障碍,普通机器人会做同样的事情,例如从左侧绕过障碍。但是一个AI 机器人,可以做两件普通机器人做不到的事情:自己做决策;从经验中学习。AI 机器人会改变或者适应环境,每次面对同一个情景,它可能会有一些不同的行为。同样是面对障碍,它可能会尝试推开障碍物,或者规划一条新的路径,甚至可能会改变目标。

本章内容将覆盖以下主题:

· 人工智能(AI)是什么

· 现代的AI——没有新东西

· 我们作为示范的问题

· 从这本书中你会学到什么——AI 技术覆盖

· 介绍我们的机器人:TinMan

· 保持控制——软实时控制

· OODA 循环——做出决策的基础技术要求

· Python 2.7 或者3.6 版本,并且安装了numpy、scipy、matplotlib 以及scikit-learn。

· 机器人操作系统(ROS)Kinetic Kame。

· 一台开发用Linux 电脑,在Windows 系统的电脑中安装Linux 虚拟机也可以。我使用Ubuntu 16.04 来做示范和讲解。

· 树莓派 3 代或者类似的单板电脑(BeagleBone Black、Odroid 或者其他类似的)。我们不会使用它上面的GPIO 或者特有接口。

· 一个Arduino Mega 2560 微控制器。

本章的源代码参见链接12。

你可以从链接13 所示的网址获取视频来查看代码的实际运行效果。机器人技术和AI 的基本原则

对机器人设计师和开发者来说,把人工智能应用到机器人开发,需要一些独特的技能。你之前应该制作过机器人,可能已经拥有了一个四轴飞行器或者一台3D 打印机(实际上它们也是机器人)。现在你所熟悉的PID 控制器、传感器回路、状态机都要让位给人工神经网络、专家系统、基因算法、搜索路径规划这些新技术。我们需要的机器人,不仅要能对外部环境做出条件反射般的响应,还要有自己的目标和意图,它可以自主学习,可以适应环境。我们要解决一些棘手的,甚至原本不可能解决的难题。

本书后续的内容会引入一个要解决的问题:让机器人从一个游戏室里捡起玩具。它将作为贯穿全书的一个例子,我们将通过这个例子来学习将AI 技术运用到机器人上的一系列技术。不过,在学习时,你一定要明白,重要的是解决问题的过程,而不是结果。学习完全书,你应该获得一些有广泛应用的重要技能,而不是只学会如何让机器人捡起玩具。

在写本书之前,我必须要做一个艰难的选择:究竟这本书是一本关于机器人技术的人工智能书,还是关于机器人如何实现人工智能的书。换句话说,是应该把重点放在学习机器人技术上还是放在学习人工智能上?我的答案是:这是一本关于如何使用AI 工具来解决机器人技术难题的书,因此它根本上是一本人工智能的书,只是使用了机器人作为例子。本书中你将学习到的工具和技术可以应用到很多场合。即使你没有机器人,也可以把它们运用到股票市场的交易决策上。

下面我们首先提供一些工具和背景知识,作为开发本书中实例的基础。这样做是让所有人有一个相同的开发环境,同时也为了不对读者的技术状况做任何假设。我们将使用Python 作为编程语言,使用ROS 作为数据基础架构,它们都运行在Linux 操作系统上。我使用一台运行Windows Vista 系统的电脑来开发本书中的实例,在它上面安装了Oracle 的VirtualBox 软件来运行Ubuntu Linux 虚拟机。在硬件部分,将使用树莓派3 作为机器人的板载大脑,使用一片Arduino Mega 2560 作为硬件接口微控制器。

在本章的剩余部分,我们将讨论一些关于AI 的基础知识,然后开始着手开发两个重要的工具,这两个工具会在剩余部分的所有实例中使用。我们还将介绍软实时控制的概念,并提供一个框架,或者说模型。它用来和我们的AI 机器人进行交互,这个模型(框架)叫作观察——定位——决策——行动(OODA)循环。AI 是什么(以及AI 不是什么)

AI 的定义应该是什么?通常,它意味着一台机器展现出的一些智能的特性——思考、推理、计划、学习以及适应。它也可以意味着一个软件程序可以模拟思考和推理。让我们试着举一些例子:一个机器人根据一些简单规则避开障碍(如果障碍在右边,它就去左边),这不是AI;一个程序通过对实例的学习来识别视频中的猫,这是AI;一个通过操作杆操作的机械臂不是AI;但是一个机械臂可以适应不同的物体并捡起它们就是AI。

对于人工智能机器人,有两个关键的特征你必须知道。首先,AI 机器人学习并适应它们的环境,也就是说,它们的行为会随着时间而改变。第二个特征是突发行为,就是机器人表现出进化的行为,这种行为我们并没有明确地写到程序中去。我们针对机器人的控制软件,本质上是非线性以及自组织的。面对一个事件或状况,机器人可能会突然展现出一些非比寻常的反应。这种反应看起来有些奇怪,或者说诡异,甚至是情绪化的。我曾经开发过一辆无人驾驶汽车,我敢发誓这辆汽车有很高的灵敏性并且驾驶非常顺畅。它拥有“费迪南”这样的昵称,这个昵称来自某卡通片中一头敏感的、喜欢花朵的公牛。这个名字对一辆重达9 吨,看起来像是一个厂房的卡车很适合。它的各种行为都是由不同软件模块和控制算法的相互作用决定的,不会有任何超出预期的表现。

在人工智能圈子里,你经常会听到一个概念:图灵测试。它是1950 年,由艾伦·图灵在一篇名为《计算机器与智能》的论文中提出的。他设想一个人,向混杂在人类中不可见的AI 系统提问。如果人类无法通过提问识别出哪个是计算机哪个是人类,那么AI 计算机就通过了测试。这个测试假设AI 将完全有能力来倾听对话、理解内容,并给出人类会给出的同样回答。我不相信AI 目前已经发展到了这个地步,不过聊天机器人或者自动应答服务已经可以做得很好,让你相信你是在和一个人而不是一个机器人聊天。

在本书中,我们的目标不是通过图灵测试,而是使用一些新的方法来解决问题。我们会使用到机器学习、规划、目标寻找、模型识别、分组、聚类等技术。许多这样的问题用其他方法很难解决。一个软件AI 如可以通过图灵测试,将成为通用人工智能的实例,也可以说是一个完整的、可用的智能人工大脑。和你我一样,一个通用的AI 不需要特殊的训练就可以解决任何特定的难题。时至今日,通用AI 还没有被创造出来,我们能实现的是弱人工智能,或者在很窄的应用场景里模拟思维的软件,比如物体识别,或者挑选购买优质的股票。

在本书中,我们不会创建通用AI,也不用担心自己创建的东西会发展出它们自己的思想或者会失控。这些场景都来自科幻小说或想象力十足的电影,并不是目前计算机技术的现实。我坚信所有宣扬AI 的邪恶,或者宣扬AI 将会控制世界的人,并没有这个领域的实际工作经验,他们看不到AI 研究在解决一般性问题,或者使其接近实际智能方面的惨淡现状。阳光之下无新事

今天所有关于AI 的实践并不是什么新鲜事。大部分相关技术是在20 世纪60 年代到70 年代开发出来的,但因为当时的计算机在处理复杂的软件和数字计算时力不从心,所以只能等待计算机变得更为强大,同时也是在等待另一件有重大意义的事件:互联网的发明。在几十年前,如果你需要10,000 张猫的数字照片,用来组成数据库以便训练神经网络的话,这几乎是不可能完成的,你只能自己拍大量猫的照片,或者从书上扫描图片。但是在今天,当你在谷歌里搜索猫的图片时,只需要0.44 秒,就会返回126,000,000 个结果。在寻找猫的照片时,或者其他任何东西的照片时,只需要一个简单的搜索,就能拥有自己的神经网络训练数据——除非你需要的是一些十分特别的东西,在互联网上无法找到。同样地,我们用来拍摄大量照片的现代帮手:数码相机,在20 世纪60 年代也还没有被创造出来。高速的计算机、大容量且廉价的存储设备,以及能够访问到几乎无限的各种数据,它们组合在一起,导致了AI 的复兴。

现代计算机谱系的发展,在另外一个方向上也取得了惊人的成果。虽然目前每个人家里的桌子上,都可以有一台超级计算机,但智能手机的出现又驱动了一系列的技术创新。让人惊讶的是,在智能手机中,集成了加速度传感器和陀螺仪,它们使用很小的硅晶体制成,被称作微机电系统(MEMS)。智能手机还拥有小尺寸、高分辨率的照相机,以及多核的计算机处理器,这个处理器只需要很少的电量来运行。它同时(很可能)支持3 种无线信号:WiFi无线网络、蜂窝电话、蓝牙。这些部件让你的手机使用起来很有趣,同样它们也可以用在机器人上面。我觉得这很有趣,这些东西以前只有在研究室和大学能够获得,现在却可以出售给个人。如果你是在一所大学或研究室工作,又或者在一家一年有几百万美元研发经费的科技公司上班,你还是可以从本书中学到一些东西,发现一些新工具和创意,它们很可能会激发你在机器人技术上的创造性,或者为你开发有令人兴奋功能的新产品提供助力。什么是机器人?在本书中,一个机器人指的是一台机器,它可以感知所处环境,并对其做出响应,而且具有一些类似人类或动物的功能。我们通常把机器人当作一种自动化的、自我指导的移动机器,并且能和周围的环境进行交互。作为例子的问题:整理房间

贯穿全书,我们要解决同一个问题。我感觉这个问题对大多数人来说相对比较容易,但同时,即使对于经验非常丰富的机器人专家来说,它都有一定的挑战性。

我们需要使用AI 和机器人技术,在我的孙子孙女们来玩过之后,捡起我家楼上游戏室中的玩具。机器人工程师或者研究人员听到这里,肯定会长舒一口气。为什么这是一个棘手的问题,为什么又说它对于本书是一个理想的问题呢?

这个问题和亚马逊公司曾经遇到的问题类似:它们需要将物品从货架上取下,然后放入盒子中以便发给顾客。在过去的几年中,亚马逊公司赞助了亚马逊机器人挑战赛,它们邀请很多支队伍来解决上述问题,获胜者会得到现金奖励。它们认为这个问题相当困难,所以在世界范围内邀请了很多支队伍。在2017 年,一支来自澳大利亚的团队夺得了比赛的胜利。

让我们讨论一下这个问题,并对它做一些分解。稍后,在第2章,我们会做完整的任务分析、用户案例以及故事板,以便找出我们的解决方案。不过在这里,我们可以先做一些一般的观察。

机器人设计者首先从环境开始——机器人在哪里工作?我们把环境分成两类:结构化的和非结构化的。结构化环境,包括“第一机器人竞赛”所使用的比赛场地、一条装配线或者实验室工作台,所有的东西都在固定的地方。有一句话这样说,一个所有的东西都有自己固定位置的地方——这就是一个结构化环境。从另一个角度去思考,结构化环境就是我们预先知道每一个东西目前在哪里以及它将会去哪里;我们知道每个物体的颜色、放置它们的地方,以及它们的形状。这类信息有一个名字:先验知识——我们已经事先了解了它。提前了解环境,在机器人技术领域,有时候是绝对必要的。装配线上的机器人就需要所有的部件严格按照指定的位置和方向摆放,这样它们才可以被顺利抓取并放到指定位置。换言之,我们要给机器人安排一个合适的外部环境。

显然,在游戏室这个场景里,这不是一个可接受的选项。如果我能让孙子孙女们每次都把玩具放到同样一个地方,那就不需要机器人来做什么了。在这个场景里,有一些东西是相对固定的——我就只有那么多玩具给他们玩。玩具会偶尔增加或减少,有时还会掉到楼下去,但相对来说是比较固定的。我们无法用任何特殊方式来固定它们的位置和方向——当孩子们结束玩耍回家时,玩具会被丢在当时的位置。游戏室还有一些固定的家具,不过有一些是可以移动的——比如脚凳和椅子。这是一个非结构化的环境,机器人和软件必须要适应它,而不是让玩具和家具来适应机器人。

我们要解决的问题是,让机器人巡视游戏室,并捡起所有玩具。让我们把该任务分解成下面一系列步骤:

1.我们想通过语音来和机器人交互。我们需要机器人理解我们想让它做什么,也就是给它的命令的意图是什么。

2.一旦命令开始执行,机器人必须识别区分不同的物体:玩具、墙、家具以及门。

3.机器人必须避开障碍,特别是通往一楼的楼梯。机器人很难识别负向障碍(路边台阶、悬崖、楼梯等),这是我们要面对的问题。

4.一旦机器人发现一个玩具,它要决定如何使用机械臂捡起它。它是否可以直接抓起玩具,还是必须把它兜起来,又或者把它往前推。我们预料到机器人会用不同的方式去捡起玩具,这个过程可能需要几次尝试才会成功。

5.一旦捡起玩具,机器人需要将它放到玩具箱里。机器人必须能辨认出房间里的玩具箱,并记住它的位置(因为要重复很多次),然后确定自己的位置,把玩具放回箱子。和上面一样,这个过程可能需要做多次尝试才能成功。

6.放下玩具以后,机器人重新巡查房间以寻找更多的玩具。等到某一个时候,它判断可能所有的玩具都已经被放回原处,然后需要来问我们,房间目前的状况是否可以接受,还是需要继续清理。

从这个问题中我们可以学到什么?我们会用它来检验各种AI 技术和工具。本书的目的是教你学会如何开发一个机器人相关的AI 解决方案。比起问题本身以及我开发出来以便于拍摄本书所用图片的机器人来说,解决问题的过程和方法才是最关键的信息。我们会示范如何制作一个可移动、能够学习并适应周围环境的机器人。顾及你会根据自己的兴趣和需要来挑选某些章节或者按照自己的顺序阅读,所以每一章都是独立的课程。

前三章的内容用来支持本书剩余部分的基础知识,创建了要解决的问题,并为剩余的所有内容提供了坚实的框架。你将学到的

本书所讲述的主题和内容并不都是公认的经典人工智能方法,但是它们确实代表了实现机器学习和做出决策的不同方法。

理解控制理论和定时机制,能够为实现机器人控制奠定坚实的基础。我们会使用一个被称作“以帧为基础的控制循环”的软实时控制策略。这项技术有一个花哨的技术名字:单调速率调度,不过你会发现这个概念其实很直观而且容易理解。

从最低层级来说,AI 是机器人为它的行为做决策的一种方法。我们会介绍一种源自美国空军的决策模型,叫作OODA(Observe-Orient-Decide-Act)循环,见下图。我们的机器人会有两个这样的循环:一个内部循环也叫内省循环;另一个是外部环境观察传感器循环。底层的内部循环的优先级高于慢速的外部循环,这类似于你身体的自治部分(心跳、呼吸、进食)的优先级高于你处理任务功能(上班、付钱、修剪草坪)的优先级。这使我们的系统成为一种将会在第2章里讲述的“包容架构”,这种控制范例的灵感来自生物学,由iRobot的创始人之一,来自麻省理工学院的Rodney Brooks 命名,他同时也是一个名字为Baxter的机器人的设计者。OODA循环

OODA 循环是由John Boyd 上校发明的,他被称为F-16 之父。Boyd 上校的思想在今天依旧被广泛引用,他的OODA 循环用来描述机器人人工智能、军事计划以及市场策略都同样有效。OODA 循环为一个可以和周围环境进行交互的可思考机器如何工作提供了一种模型。

我们的机器人不是简单地一步一步根据指令去工作,而是设置好目标以后自主工作。机器人可以自由地设置自己的路径,决定如何去完成目标。我们会告诉机器人捡起玩具,然后机器人自己去判断要捡哪个玩具、如何接近目标,以及如何捡起那个玩具。如果作为机器人主人的我们,只是想把机器人当作远程操作的手,我们就必须给机器人发出许多条独立指令,比如:向前移动、向右转、伸出手臂、张开手等,而且不会让机器人去思考做这些事的原因。

在设计机器人的规格和软件之前,我们必须考虑让它的能力和外部环境以及要解决的问题匹配。本书将介绍一些用于设计机器人和管理软件开发的工具。从系统工程的定义到实现,我都会使用两个工具:用例和故事板。我会让这个过程尽可能平滑。NASA 和航天公司使用更先进的系统工程范式来设计火箭和飞行器——讲这些内容是让你对这些结构化过程有一个粗略了解。人工智能和先进的机器人科技

接下来的几节,我将一步一步详细讲述不同的AI 方法应用的例子。

首先从物体识别开始。我们需要机器人识别物体,并对物体进行分类:如果是玩具就捡起它,如果是其他东西就忽略。我们使用一个视频摄像头在不同灯光条件从不同角度拍摄,然后使用一个训练过的人工神经网络(ANN)来识别物体。

玩具一旦被识别出来,下一个任务就是捡起它。为机械臂写一个通用的“捡起任意物体”的程序是一项非常困难的任务,涉及很多高等数学知识(你可以在网上搜索“反向动力学”,来了解一下我说的意思)。如果让机器人自己去处理呢?我们使用遗传算法来让机器人创造自己的行为,自行学习如何使用自己的手臂。

我们的机器人需要理解它的主人(我们)发出的各种命令。我们使用自然语言处理技术,让机器人不仅能识别我们的语音,还能理解我们的意图,然后根据我们想让它做的事情来创建目标。我们使用一个称为“填空”的巧妙技术,使机器人可以根据命令的内容来进行推论。这种处理对很多机器人任务规划都有用。

机器人遇到的下一个问题是避开楼梯和其他障碍。我们使用操作性条件反射让机器人通过正增强和负增强来学习向哪里移动是安全的。

机器人要能够找到玩具箱来放入玩具,同时还需要一个通用的框架来规划后续的移动。我们将使用决策树来做路径规划,还会讨论通过剪枝算法来快速排除不好的规划。我们也会介绍前向链接和后向链接,它们是用来做快速规划以达到目的的一种方法。你可以设想一下实现计算机象棋对弈的算法,它必须要做到可以考虑后续的几步走法,如何给这些走法做出好坏判断以便选择一个正确的策略呢?这种设想会让你对上述技术的威力有一些概念。这种类型的决策树有很多用处,可以处理很多维度的策略。我们将使用它寻找到达玩具箱以放下玩具的路径。

在最后的实战章节,我们会介绍一些不同的工具,这些工具通常不会用在机器人方面,或者至少不会像我们将要采用的方式那样使用。

我有4 个优秀、有才华又可爱的孙子孙女,他们喜欢来我这里玩。在这本书里你将会了解很多关于他们的事情。我最大的孙子6 岁,是一个孤独症患者;我的孙女,排行老三,也患有孤独症。我把大孙子威廉姆带到机器人跟前,他立刻想要和它对话。他会问:“你叫什么名字?”以及“你是做什么的?”当发现机器人没有回答的时候,他会很失望。所以为了孩子们,我将为机器人开发一个引擎,让它可以与人进行一些简单对话。我们还要创建一个可以和小孩子交互的机器人格。另外,威廉姆对这个机器人还有一个要求,就是它可以陪自己玩敲门游戏(knock, knock jokes)。

开发一个有真实感觉的机器人,已经超出了目前机器人开发以及AI 开发的技术现状,不过我们可以使用有限状态机和蒙特卡洛模型来模拟一些人格。我们会给机器人一些人类交互模型,这样它就可以考虑孩子的情绪。为了和人工智能区分开来,我喜欢把这种类型的软件叫作人工人格。人工智能创建了机器人的思考模型,人工人格创建了它的情感模型。机器人和我们的开发环境介绍

这本书是关于机器人和人工智能的,所以要有一个机器人来完成我们所有的实战练习。就像我们将在第2章讨论到的那样,我选择的软件和硬件,普通读者都可以使用,并且很容易通过各种方式获取。在第2章里,我详细说明了所有必需的软硬件,并展示了如何将它们组装到一起、如何为机器人的大脑和控制系统接线。机器人的底座和机械臂,我是从速卖通(AliExpress)上一起购买的,你也可以分别购买它们。所有的电子元器件,都是从亚马逊网站上购买的。

如下图所示,我们的机器人有履带、一个6 自由度的机械手臂以及一个电脑。我们给它起名TinMan,因为它就像绿野仙踪里的同名角色,有金属身体,而且最想要的就是有一个大脑。

本书的任务,是以在室内空间捡起玩具为核心的,所以我们的机器人拥有结实的底座,底座上有两个马达,还有履带,这样它就可以在地毯上移动。我们用的是坦克式转向方式,即差分式驱动,也就是给履带的驱动马达发送不同的指令。如果想让它直着往前,我们就让两个马达以同样的速率正向转动;如果想让它往后退,就让两个马达以同样的速率反向转动。转向是通过让一个马达正向转动,另一个马达反向转动来实现的(这将使机器人原地转向),或者让两个马达都正向转动,但是一个的速度比另一个快一些。用这种方式,我们可以完成各种转向。为了捡起玩具,我们需要一系列操作,所以我使用了一个6 轴机械臂来模拟人类极其灵巧的肩部——肘部——腕部——手部的组合,因为机械臂使用了标准的数字伺服系统,所以接线和编程都很容易。

你会发现整个机器人只使用了一块电池。你可能想让电脑部分和马达各自使用一个独立的电池,这也是通用的方式,我做的很多机器人都使用了独立电源。如果你这样做,要记得把两个系统的地线连接在一起。我很仔细地测试过我的电源,没有发现发热或者噪声问题,不过我没有试过同时运转手臂以及两个驱动马达时的情况。如果你发现马达产生的噪声干扰了Arduino(在这种情况下,Arduino 会一直自动重启),可以在马达的连线上接一个10 微法的滤波电容。

TinMan 机器人的主控系统是树莓派3 单板电脑(SBC),它通过板载的WiFi 网卡与操作者通信。一个Atmel 架构的Arduino Mega 2560 控制器提供了到机器人硬件组件(比如马达和传感器)的接口。

你可以参考下面这张图,它示意了机器人内部的各组件。我们会把主要精力放在树莓派3 单板电脑上,它是机器人的大脑。剩余部分我们只要完成组装,在整本书范围内再也不会去动它。

树莓派3 是我们的控制台(运行在PC 上的Linux 虚拟机)和机器人之间的主要接口,它们之间通过WiFi 网络连接。除了树莓派,任何低功耗运行Linux 的单板电脑都可以用来完成这项工作,比如BeagleBone Black、Odroid XU4 以及Intel Edison。

在单板电脑上连接了一块Arduino Mega 2560 微控制器主板,用来作为硬件接口。如果有需要,也可以使用树莓派自带的硬件接口,但是只要我们使用Arduino 分担这部分功能,就不用担心运行在树莓派上的高级人工智能软件干扰发送给马达的PWM(脉宽调制)控制信号的时序,也不用担心它干扰控制机械臂6 个伺服系统的PPM 信号(脉冲位置调制)。因为马达使用的电流比Arduino 能处理的大,所以需要一个马达控制器来放大我们的指令,使得有足够大的电流来驱动机器人的履带。几个伺服系统直接连接到Arduino 上,不过电源是单独从机器人电池接过来的。我们还需要一个5V 的稳压器,把11.1V 可充电锂电池电源调整到合适的电压以提供给机器人。我所用的电源组是可充电的3S1P(3 个单元串联,1 个并联)2700mA 时容量电池,它通常被用在四轴无人飞行器上,并带有对应的充电器。使用各种锂电池,必须遵循它的使用说明,并且在金属盒子或者其他防火容器中充电。软件模块(ROS、Python 和Linux)

我一再提到可以去查看运行在机器人上的所有软件,但为了提醒你,这里我还会讲到一些最基本的软件。我们说过,机器人使用的基本操作系统是树莓派上的Linux。我们还要使用ROS 把所有的软件模块连接在一起,同时它还可以很好地处理烦琐的网络任务,比如创建套接字(socket)并建立连接。另外,ROS 还提供了一个很棒的库,这个库中有很多现成的可以直接利用的功能,比如一个操纵杆的接口。

ROS 不是一个真正的操作系统,它不像Linux 或者Windows 那样可以控制整个电脑,但它是通信和接口标准的主干,并且提供了一些工具,使得攒一个机器人变得很容易。ROS使用发布/订阅(publish/subscribe)技术来实现在两个不同地方之间移动数据,它对产生数据的程序(比如,传感器和摄像头)和使用数据的程序(比如,控制和显示部分)实现了完全解耦。我们只使用ROS 的很少一部分功能,很多功能要自己开发。Packt 出版公司有一些很棒的学习ROS 的书籍,其中我最喜欢的是Aaron Martinex 和Enrique Fernandez 写的Learning ROS for Robotics。

除了在一两处无关紧要的地方使用了其他语言,本书中我们主要使用的编程语言是Python。有两个理由使得Python 对于本书是一种很好的语言:首先,它和ROS 一起被广泛用于机器人社区;其次,它在机器学习和人工智能社区也得到广泛接受。这两个重磅原因让使用Python 变得无法抗拒。Python 是一种解释型语言,这种语言有三个吸引我们的优点。

· 可移植性:Python 可以很方便地在Windows、Mac 和Linux 系统之间进行移植。在移植时通常只有一种情况你需要留心:当使用和操作系统紧密相关的功能,比如打开带有目录名字的一个文件时。

· 作为一种解释型语言,Python 不需要编译的步骤。我们在本书中开发的一些程序相当复杂,如果使用C 或者C++来写的话,每次修改代码后都需要10 到20 分钟来编译。这些时间你可以用来做让你的程序正确运行的事情,而不是等待它编译完成。

· 隔离性:这是一个很少被提及的好处,不过作为经历过很多次机器人操作系统崩溃的人,我可以告诉你一个事实,Python 解释器和操作系统内核是隔离开的,这意味着你用Python 写的ROS 程序导致电脑崩溃的情况是很罕见的。电脑崩溃意味着重启,并且很可能会丢失所有可以用来诊断崩溃原因的数据。我曾经有一个专业机器人项目,当我们从Python 语言迁移到C++时,操作系统马上开始崩溃,这次迁移破坏了机器人的可靠性。如果一个Python 程序崩溃,另外一个程序可以监控到,并且重启该程序。如果一个操作系统崩溃,并且没有额外的硬件支持可以按下重启按键的话,你就什么也做不了。(要获取更多相关信息,可以参考Python的成功故事,见链接14)机器人控制系统和决策框架

在开始为基础控制系统编码之前,让我讲一些创建健壮的、模块化的、灵活的机器人控制系统的理论,这些理论后面会用到。正如我前面讲过的,我们在这部分会使用两套工具:软实时控制和OODA 循环。其中一个提供了方便并持续控制机器人的基础,另一个提供了所有机器人自治性的基础。

软实时控制系统

一个机器人如何工作,尤其是如何移动的概念相当简单。有一个主控制循环反复做同一件事情;它从传感器和马达控制器读取数据,从操作者那里接受命令(或者从机器人的自治功能),根据这些命令对机器人的状态做出改变,然后发送指令给马达或者其他使机器人移动的操纵装置。

下图阐述了如何把OODA 循环实例化到机器人的软硬件中。机器人既可以自主行动,也可以从通过无线网络连接的控制站接受命令。

我们需要做的是让这个控制循环始终按一致的方式运行。我们需要给该控制循环设置一个基础的帧速率,或者说基础的更新频率。它会让机器人的所有系统运转得更好。没有一种时间管理器的话,每一个机器人的控制循环都会花费不同的时间完成,导致任何种类的路径规划、位置估算以及手臂移动都变得更为复杂。

如果你以前使用PID 控制器做过类似让机器人以恒定的速度移动,或者将摄像头对准一个移动目标这样的处理,那么你就能理解,有一个相同时间的运行周期对于获得好的结果很重要。

控制循环

为了控制机器人,我们必须建立某种控制或者反馈循环。比如,我们告诉机器人向前移动12 英寸(30 厘米)。机器人必须给马达发送一条命令,让它开始向前移动,然后需要某种机制来测量是否移动了12 英寸。有好几种方法来实现,只使用时钟就可以做到。机器人每秒移动3 英寸。我们需要一个控制循环来开始这个移动,然后在每个更新循环,也就是下一个新循环开始的时候检查时间,看是不是过去了4 秒。如果是的话,就发送一条停止命令给马达。计时器是控制装置,4 秒是预设的点,马达是被控制的系统。这个过程也会产生偏差信号,告诉我们执行了哪个控制(在这个例子中是停止)。下图展示了一个简单的控制循环。我们需要让罐子中的水保持恒定的温度。

图中的阀门用来控制火的大小,可以使用火给罐子里的水加热。温度传感器探测水的温度是高了、低了还是正好。控制器使用水温信息来控制阀门。这种类型的模式被称为闭环循环系统。

你也可以按照一个进程来理解它。开启进程,然后获取关于进度的反馈,根据反馈,我们就知道什么时候停止进程,什么时候改变进程。同理,在需要机器人以指定速率移动时,我们可以做速度控制;当机器人需要向指定方向移动时,我们可以做方向控制。

让我们看另外一个例子。我曾经为一个机器人配备了自充电坞站,这个坞站顶部安装了一组发光二极管(LED)以作为目标。我想让机器人可以径直移动进入充电坞站。我使用了摄像头来查看坞站顶部的目标LED。当发光二极管被摄像头捕捉到时,摄像头就产生一个偏差信号来确认。机器人距离LED 灯的距离,粗略代表了到坞站的距离。比如,摄像头画面中的LED 灯在中心偏左50%的方向,距离是3 英尺(1 米)。我们发送该信息给马达的控制循环:向右转一点,向前走一点。然后再次检测,发现LED 比原来靠近中心了一些(40%),距离也近了一些(2.9 英尺/90 厘米)。接收到的偏差信号少了一些,距离也少了一些,所以我们在这个更新循环里发送“转得慢一点,移动得慢一点”的命令给马达。当LED 准确地处于图像中心,并且机器人进入坞站,移动速度变为零的时候,这个任务就完成了。有一些人可能会说,“如果你用了PID 控制器的话……”是的,他们说得对,我上述描述恰好就是“P”,也就是比例控制方案。我们可以增加一些铃铛和汽笛来协助机器人,避免它因为重量和惯性而超过或者未到达目标,并减少因此而导致的反复调整。

这些例子的关键是指出系统中控制的概念。持续进行控制,就是实时控制的概念。

为了以固定的时间间隔(或者使用一个合适的术语:确定地,deterministically)执行我们的控制循环,有两种办法来控制程序的执行:软实时和硬实时。

硬实时系统由操作系统提供底层支持,所有的进程都在一个指定的时间窗口运行,它提供了高确定性:进程每次的执行时间总是完全一样的。

我们面对的问题:运行着操作系统的电脑,不断地被其他进程、运行中的线程、上下文切换或者正执行的任务中断。你使用的桌面电脑,甚至智能手机,都是一样的。例如,你打开文字处理软件,会发现每次启动时间都不一样,这就是因为你电脑的操作系统中断了某任务去做其他事情。

在实时系统里,上述情况是不可容忍的,我们需要在一个进程运行前就精确地知道它需要多久完成,时间要精确到毫秒。如果为一架飞机创建一套自动驾驶系统,你很容易就能想到:控制循环应该让飞机平滑地飞行,或者安全降落在跑道上,如果它时常被磁盘访问或者网络调用中断的话,就会带来灾难。

实时操作系统(RTOS)让程序员和开发者对进程何时以及如何运行,还有哪些例程可以中断进程以及中断多久,有完全的控制权。实时操作系统的控制循环每次都占用同样数量的计算机周期(所以也消耗同样的时间),这使得在关键输出时更加可靠。有一个很重要的点你必须知道:在硬实时系统中,通过硬件强制保证时序限制,同时保证计算机资源在需要的时候是可用的。

事实上,我们可以在Arduino 微控制器上实现硬实时,因为它上面没有操作系统,同一个时间只能执行一个任务或者运行一个程序。我们对所有正在运行程序的时序拥有完全的控制。我们的机器人还拥有另一个更强大的处理器,也就是运行Linux 系统的树莓派3。这台计算机拥有相当强大的性能,它可以并发地运行好几个任务来支持操作系统、运行网络接口、发送图形到HDMI 端口输出、提供用户接口,甚至还可以支持多用户。

软实时是更容易一些的方法。软件通常以帧的形式,保持对任务执行进行长久跟踪。帧是预设的时间间隔,和电影里的帧类似。每一帧都是一个固定的时间间隔,比如1/20 秒。程序的任务被分成很多个部分,每个部分可以在这些帧里执行。软实时比“安全关键”的硬实时系统更适合我们的游戏室清理机器人。另外,实时操作系统是很昂贵的,而且需要专门的培训。我们要做的是把控制循环的时序作为一个反馈系统。我们会在每一个循环的后面预留一部分空间,以允许操作系统做自己的事情,这样做会让控制循环以一个恒定的时间间隔一直执行。就像前面提到的控制循环示例,我们会在每一个循环内完成测量、错误确认、修正的任务。

现在我们需要担心的是更新频率。还必须要考虑“抖动”,也就是由于操作系统中断控制循环去做其他事情而导致的控制循环时序随机的改变。这种中断会导致我们的定时循环变长,使得循环周期时间发生随机跳动。在设计控制循环时必须为软实时控制处理一定数量的抖动,不过这些抖动的出现频率是比较低的。

在实践中,这个处理相当简单。我们从初始化定时器开始,定时器要采用能用到的最高精度。我们使用Python 来写这个控制循环,所以要使用time.time()函数,这个函数专门用来测量内部程序的时间性能(设置帧率、执行循环、测量时间、产生误差、为误差休眠、循环)。每次调用time.time(),都会得到一个浮点数,它是UNIX 时钟的秒数。

这个过程的概念是把我们的处理分到一组固定时间的帧中。所有我们要做的事情,都要分配到一个整数数量的帧内。基本的运行速度是每秒处理30 帧。我们将以这个速度来更新机器人的位置估算、读取传感器以及给马达发送命令。还有其他一些功能,它们运行的频率低于每秒30 帧,所以我们可以将它们分到几倍数的帧里去。一些功能每一帧都会运行,也就是每一帧都被调用或者执行。比如,有一个声呐传感器,它每秒只能更新10 次,所以每3 帧调用一次readsonar 函数。把所有的功能按照基本帧率(30 帧每秒)的倍数来分配帧率,这样就可以有30、15、10、7.5、6、5、4.28、2、1 (帧/秒)这样的帧率,对应于每帧、每两帧、每三帧……调用一次该函数。甚至可以用低于每秒1 帧的频率去调用,比如某个功能每60 帧调用一次,也就是每两秒一次。

有点棘手的是,我们需要确定每一个过程都能适用于一帧时间,也就是1/30 秒或者0.033 秒(33 毫秒)。如果某个过程消耗比这个时间长,要么把它分成几部分,要么把它放到一个独立的线程或者独立的程序中,这样可以在某一帧内开始该过程,然后在另外一帧获取它的执行结果。进行尝试并对帧进行平衡也很重要,这样就不会将所有的处理都放在同一帧里。下图展示了一个以每秒30 帧为基础帧率的任务调度系统。

我们有4 个任务需要考虑:任务A 以每秒15 帧运行,任务B 以每秒7.5 帧(每4 帧)运行,任务C 以每秒10 帧(每3 帧)运行,任务D 以每秒30 帧运行(每1 帧)。上图中所示的第一种调度方法是所有4 个任务都在第1、13、25 帧时运行。可以改进一下,使得控制程序的负载更为均衡,方法是将任务B 的运行时间放到第2 帧,如图中下面部分所示。

这和测量音乐作品的方式很相似:测量的量度是一定数量的时间,不同的音符有不同的时间间隔,一个完整的音符在每个测量单位只能出现一次,一个2 分音符在每个测量单位出现两次,这样一直到64 分音符。如同一个作曲者可以确定每个量度有确定数字的节拍,我们也可以确定控制循环对于进程在每一帧的运行可以平衡的量度。

让我们开始写一些程序来控制定时循环,并实现上述这些原则。

我们要一起开始写第一段代码了,这是让人激动的事情。这个程序只是示范定时控制循环,我们很快就会在机器人的主控制程序中用到它,在这里只是让你用一些参数做测试,观察一下运行结果。这是我能想到的在软时间控制循环里最简单的版本了,所以你可以放心地改进和润色。

下图展示了我们在这个程序中要做的事情。

现在让我们从编码开始。这些都是很简单明了的Python 代码,在后面我们才会加入一些复杂的内容。首先引入库文件。不出意料,我们首先引入的是时间模块。我们还将使用numpy(Python 的数值分析库)和matplotlib 里的平均数函数在最后进行绘图,还会进行一些数学计算来模拟要做的处理,并创建每帧的负载。

现在,使用一些参数来控制我们的测试。在这里你可以体验不同的定时选择。最基本的控制是FRAMERATE——每一秒想尝试多少次更新。我们先按前面说的那样,使用30:

测试的持续时间由counter 变量来设置。以FRAME 时间乘以运行的循环次数counter就可以得出测试时间。在这个例子中,2000 帧除以30 帧/秒就是66.6 秒,也就是说,测试程序会运行1 分钟多一点的时间:

我们会用两种方式来控制定时循环。首先,测算它在这一帧里进行计算所消耗的时间量。有一个存根程序,它使用了一些三角函数,我们会调用它来作为电脑的负载。机器人控制功能,需要大量三角函数来完成工作,比如计算机械臂需要转动的角度。

我们将测量控制函数运行耗费的时间,它将占用帧的一部分。然后计算1 帧还有多少剩余,并通知计算机在剩余时间内将当前进程休眠。使用sleep 函数释放计算机资源,让它去执行操作系统的其他工作,这比起运行某种紧凑循环来浪费帧剩余时间要好得多。控制循环的第二种方法是测量整个帧:运算时间加上剩余时间,然后看这个时间是超过还是少于我们的帧时间。在该函数中使用

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载