书名:Python计算机视觉和自然语言处理
ISBN:978-7-115-56062-9
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [西]阿尔瓦罗•莫雷纳•阿尔贝罗拉(Álvaro Morena Alberola)
[西]贡萨洛•莫利纳•加列戈(Gonzalo Molina Gallego)
[西]乌奈•加雷•马埃斯特雷(Unai Garay Maestre)
译 倪 琛
责任编辑 胡俊英
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Copyright ©2019 Packt Publishing. First published in the English language under the title Artificial Vision and Language Processing for Robotics.
All rights reserved.
本书由英国Packt Publishing公司授权人民邮电出版社出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
机器人是人工智能时代的重要产物,为人类的工作和生活提供了非常多的助力。对于智能机器人而言,视觉识别能力和对话能力是非常重要的两个方面,本书就是基于这两个技术展开介绍,并通过一系列的编程案例和实践项目,引导读者高效掌握机器人的开发技巧。
本书基于Python语言进行讲解,结合机器人操作系统(ROS)平台给出了丰富多样的机器人开发方案。本书立足于机器人的视觉和语言处理,通过OpenCV、自然语言处理、循环神经网络、卷积神经网络等技术提高机器人的视觉识别能力和对话能力。全书包括多个练习和项目,通过知识点和编程实践相结合的方式,快速带领读者掌握实用的机器人开发技术。
本书适合机器人或智能软硬件研发领域的工程师阅读,也适合高校人工智能相关专业的师生阅读。
阿尔瓦罗•莫雷纳•阿尔贝罗拉(Álvaro Morena Alberola)是一名热爱机器人学和人工智能的计算机工程师,目前从事软件开发工作。Álvaro对基于人工视觉的人工智能(AI)核心部分非常感兴趣,并且喜欢尝试新技术和先进的工具。对他来说,机器人可以让人类的生活更轻松,并且可以帮助人们完成他们自己无法完成的任务。
贡萨洛•莫利纳•加列戈(Gonzalo Molina Gallego)是一名计算机科学专业的硕士,主修人工智能和自然语言处理。他构建过基于文本的对话系统和对话代理,擅长提供方法论层面的建议。目前,他致力于研究跨领域对话系统方向的新技术。Gonzalo认为,未来的用户界面是基于对话的。
乌奈•加雷•马埃斯特雷(Unai Garay Maestre)是一名计算机科学专业的硕士,主修人工智能和计算机视觉。在为2018年的CIARP大会贡献的一篇论文中,他提出了一种使用变分自编码器进行数据增强的新方法。他同时是一名机器学习工程师,使用深度神经网络处理图像。
本书首先介绍机器人背后的理论;然后介绍机器人开发的不同方法,以及计算机视觉的相关算法及其局限性;接下来介绍如何使用自然语言处理命令来控制机器人。本书还会介绍Word2Vec和GloVe这两种词嵌入技术、非数值数据、循环神经网络(RNN),以及基于RNN的先进模型;介绍如何使用Keras创建简单的Word2Vec模型,如何构建卷积神经网络(CNN),以及如何通过数据增强和迁移学习来进行模型优化。本书还会简单介绍机器人操作系统(ROS),带领读者构建用来管理机器人的对话代理,并将其集成在ROS中,实现将图像转换为文本和将文本转换为语音的功能。最后,本书将介绍如何利用一段视频来构建物体识别系统。
阅读完本书之后,读者将拥有足够的技能来构建一个环境信息提取应用,并可以将其集成在ROS中。
本书适合想学习如何结合计算机视觉和深度学习技术来创建完整机器人系统的机器人工程师阅读。阅读本书时,如果读者在Python和深度学习方面有一定基础,那么会更利于理解本书中的内容;如果读者拥有构建ROS的经验,则是锦上添花。
本书立足实践,帮助读者掌握足够的工具来创建集成计算机视觉和NLP的机器人控制系统。本书分为3个部分:NLP、计算机视觉和机器人学。本书先介绍详细的基础知识,然后再探讨高级问题。本书还涵盖一些实践项目,供读者在对应情境下实践并应用所掌握的新技能。
为保证最佳学习体验,本书推荐计算机的硬件配置如下。
本书推荐使用Google Colab训练神经网络模型。如果希望在自己的计算机上进行训练,你将会需要NVIDIA GPU。
鉴于与ROS Kinetic兼容的问题,如果你希望使用Ubuntu 18.04,可以使用它支持的ROS版本Melodic。为了完成本书项目中的全部练习,你将需要安装一些库,例如NLTK(版本不高于3.4)、spaCy(版本不高于2.0.18)、gensim(版本不高于3.7.0)、NumPy(版本不高于1.15.4)、sklearn(版本不高于0.20.1)、Matplotlib(版本不高于3.0.2)、OpenCV(版本不高于4.0.0.21)、Keras(版本不高于2.2.4),以及Tensorflow(版本介于1.5到2.0之间)。这些库的安装步骤将会在相应的练习中说明。
如果希望在Ubuntu系统上使用YOLO,你将需要为你的GPU安装NVIDIA驱动程序,并安装NVIDIA的CUDA工具包。
开始阅读本书之前,你需要安装以下这些软件。
你需要安装Git LFS(Git Large File Storage,Git大文件存储),以便从本书的GitHub仓库中下载全部资源,并使用其中的图像来训练神经网络模型。Git LFS会将音频、视频、数据集和图像等类型的大文件替换为Git中的文本指针。
如果你还没有复制仓库,请按照如下步骤操作。
1.安装Git LFS。
2.复制Git仓库。
3.在仓库文件夹中执行“gitlfs pull”。
4.完成。
如果你已经复制了仓库,请按照如下步骤操作。
1.安装Git LFS。
2.在仓库文件夹中执行“gitlfs pull”。
3.完成。
如果条件允许,本书推荐使用Google Colaboratory。它是一个免费的Jupyter Notebook环境,无须配置,完全运行在云端,而且可以在GPU上运行。
Google Colaboratory的使用步骤如下。
1.将完整的GitHub仓库上传到你的Google Drive账户上,以便使用仓库中的文件。注意,请确保你使用了Git LFS来加载所有文件。
2.移动到你想要新建Google Colab Notebook的文件夹位置,单击New > More > Colaboratory。这样就打开了一个Google Colab Notebook,并保存在相应的文件夹中,然后就可以使用Python、Keras或者其他已安装的库了。
3.如果希望安装某个库,可以使用pip软件包安装工具或者其他的命令行安装工具,但是需要在开头添加“!”。例如,可以执行“!pip install sklearn”来安装scikit-learn。
4.如果希望从你的Google Drive中加载文件,可以在Google Colab的单元格中执行以下两行代码:
from google.colab import drive
drive.mount('drive')
5.打开单元格输出中的链接,使用你创建Google Colab Notebook账户时使用的Google账户登录。
6.可以使用ls命令列举当前文件夹中的文件,如图0.1所示;也可以使用cd命令来移动到文件上传的位置。
7.这样就可以使用Google Colab Notebook加载文件和执行任务了,就像是使用在同一个文件夹下打开的Jupyter Notebook。
图0.1 使用ls命令的结果
按照以下步骤,在你的Ubuntu系统上安装相应框架。
1.为在Ubuntu系统上安装ROS软件做准备:
sudo sh -c'echo"deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc)
main" > /etc/apt/sources.list.d/ros-latest.list'
2.配置软件包密钥:
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recvkey 421C365BD9FF1F717815A3895523BAEEB01FA116
3.更新系统:
sudo apt-get update
4.安装完整框架,以免遗漏任何功能:
sudo apt-get install ros-kinetic-desktop-full
5.初始化rosdep并进行更新:
sudo rosdep init
rosdep update
6.可以在bashrc文件中添加相应的环境变量,以免在每次使用ROS时声明:
echo"source /opt/ros/kinetic/setup.bash" >> ~/.bashrcsource ~/.bashrc
完成以上各步骤之后,可能需要重启计算机才能使新配置生效。
7.启动框架,检查是否安装正确:
roscore
TurtleBot和你的ROS发行版(本书使用的是Kinetic Kame)之间可能存在兼容问题,但是没关系,Gazebo可以模拟很多种机器人。你可以换成其他机器人,并尝试在你的ROS发行版中使用。
下面是配置TurtleBot的步骤。
1.安装依赖项:
sudo apt-get install ros-kinetic-turtlebotros-kinetic-turtlebot-apps
ros-kinetic-turtlebot-interactions ros-kinetic-turtlebot-simulator
ros-kinetic-kobuki-ftdiros-kinetic-ar-track-alvar-msgs
2.将TurtleBot模拟器软件包下载到你的catkin工作空间中:
cd ~/catkin_ws/src
git clone https://github.com/turtlebot/turtlebot_simulator
3.现在你应该可以在Gazebo中使用TurtleBot了。
如果在Gazebo中试图对TurtleBot进行可视化时遇到了错误,可以从本书的GitHub仓库中下载turtlebot_simulator文件夹并进行替换。
启用ROS服务:
roscore
启动TurtleBot World:
cd ~/catkin_ws
catkin_make
sourcedevel/setup.bash
roslaunchturtlebot_gazeboturtlebot_world.launch
按照下面的步骤安装Darknet。
1.下载框架:
git clone https://github.com/pjreddie/darknet
2.移动至下载下来的文件夹,执行编译命令:
cd darknet
make
如果编译过程顺利完成,你将会看到类似图0.2所示的输出。
图0.2 Darknet编译输出
如果希望实现本书每章的学习目标,你需要完成下面的安装流程,这样就可以使用GPU计算来实时检测并识别物体了。开始之前,你需要在Ubuntu系统中安装好一些依赖项,包括以下几个。
请注意,所有这些依赖项都有多个版本,你需要找到与你使用的GPU和系统相兼容的版本。
一旦系统准备好,你就可以开始进行下面的高级安装了。
1.下载框架(如果没有在基础安装中下载的话):
git clone https://github.com/pjreddie/darknet
2.修改Makefile文件的前几行,以启用OpenCV和CUDA。修改之后的文件看起来应该是这样:
GPU=1
CUDNN=0
OPENCV=1
OPENMP=0
DEBUG=0
3.保存对Makefile文件的修改,将其移动至darknet文件夹中并执行编译命令:
cd darknet
make
现在你应该可以看到类似图0.3所示的输出。
图0.3 启用CUDA和OpenCV的Darknet编译输出
在安装之前,你需要在Ubuntu系统上安装一些依赖项(与在Darknet高级安装部分中提到的相同)。
本书由异步社区出品,社区(https://www.epubit.com/)为您提供相关服务和支持。
本书提供配套资源,请在异步社区本书页面中单击,跳转到下载界面,按提示进行操作即可。注意:为保证购书读者的权益,该操作会给出相关提示,要求输入提取码进行验证。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区,按书名搜索,进入本书页面,单击“提交勘误”,输入勘误信息,单击“提交”按钮即可(见下图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact@epubit.com。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给我们;有意出版图书的作者也可以到异步社区在线投稿(直接访问www.epubit.com/ contribute即可)。
如果您所在的学校、培训机构或企业想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接通过邮件发送给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值的内容的动力之源。
“异步社区”是人民邮电出版社旗下IT专业图书社区,致力于出版精品IT图书和相关学习产品,为作译者提供优质出版服务。异步社区创办于2015年8月,提供大量精品IT图书和电子书,以及高品质技术文章和视频课程。更多详情请访问异步社区官网https://www.epubit.com。
“异步图书”是由异步社区编辑团队策划出版的精品IT专业图书的品牌,依托于人民邮电出版社近30年的计算机图书出版积累和专业编辑团队,相关图书在封面上印有异步图书的LOGO。异步图书的出版领域包括软件开发、大数据、人工智能、测试、前端、网络技术等。
异步社区
微信服务号
阅读完本章之后,你将能够:
本章首先简要介绍机器人学的历史,然后介绍机器人以及机器人硬件的不同类别,最后介绍如何使用测距法求出机器人的位置。
目前,在工业领域、研究实验室、大学,甚至我们的家里,都有机器人的身影。机器人学这门学科仍然在不断发展,这也是它值得学习的原因之一。每个机器人都需要有人为它编写程序,即使是基于人工智能(Artificial Intelligence,AI)和自主学习的机器人,也需要有人为它赋予初始目标。出现故障的机器人既离不开技术人员,也离不开持续的维护;而基于AI的系统若想发挥效用,则离不开持续的数据输入和监控。
在本书中,你将学习并实践许多有趣的技术,其中重点是计算机视觉、自然语言处理,以及如何使用机器人和模拟器进行工作。这将为你在机器人学的一些前沿领域打下坚实的基础。
机器人学(robotics)源于创造智能机器来执行人类难以完成的任务这一需求。不过,这门学科最初并非称作“机器人学”。机器人(robot)这个术语是捷克作家卡雷尔·恰佩克(Karel Čapek)在他的剧本《罗梭的万能工人》中发明的。该词来源于捷克语单词robota,意思是奴役,和被迫劳动有关。
恰佩克的剧本随后享誉世界,“机器人”这个术语也随之广为传播。受此影响,著名教师及作家艾萨克·阿西莫夫(Isaac Asimov)后来在他的作品中也使用了该词,并且发明了“机器人学”这个术语,意为研究机器人及其特征的科学。
表1-1所示为涵盖机器人学的开端和发展的时间线,其中包含了机器人学历史中的重要事件。
表1-1 机器人学的发展历史
事件 |
年份 |
说明 |
---|---|---|
达·芬奇的机器人 |
1495 |
1950年,人们在达·芬奇的手稿中找到了一份机器人设计笔记。虽然我们无从知晓达·芬奇是否尝试建造过这个机器人,但是从设计上来看,这个机器人似乎能够以完美符合解剖学的方式做出一些人类的动作 |
《罗梭的万能工人》 |
1921 |
《罗梭的万能工人》是卡雷尔·恰佩克创作的一部舞台剧剧本,故事围绕一家机器人公司展开,该公司生产用来帮助人类执行各种任务的机器人 |
机器人三定律 |
1942 |
即艾萨克·阿西莫夫在他的许多书和故事中提到的机器人三定律: |
沃尔特的乌龟机器人 |
1953 |
沃尔特的乌龟机器人是由两个传感器、两个执行器和两个神经元构成的一台模拟设备。 |
Unimate |
1956 |
世界上第一个工业机器人,其任务是从装配线运输压铸件,并将这些零件焊接在汽车车身上 |
Shakey |
1969 |
Shakey是第一个能够规划自身行为的移动式通用机器人,同时也是第一个将计算机视觉与自然语言处理相结合的机器人 |
苏联的火星探测机器人 |
1971 |
苏联为探索火星而发射的机器人 |
美国的火星探测机器人 |
1977 |
美国为探索火星而发射的机器人 |
阿西莫夫的《机器人短篇全集》 |
1982 |
《机器人短篇全集》是阿西莫夫最重要的作品之一,包含了他在1940~1976年创作的一些故事 |
具有人类特性的机器人 |
现在 |
如今,许多仿人机器人都在开发之中,机器人已经可以执行越来越多的复杂任务,并且有望比人类做得更好 |
人工智能(AI)是旨在让机器人获得和人类相同的能力而开发的一套算法。AI使得机器人可以自己做决定、与人类互动以及识别物体。如今,这种智能不仅体现在机器人身上,还体现在大量其他应用和系统里(尽管人们可能没有意识到这一点)。
现实中的很多产品已经使用了AI技术,下面列举其中的一些产品作为示例。你也同样可以构建如此有趣的应用。
自然语言处理(Natural Language Processing,NLP)是AI中的一个专门领域,旨在研究实现人类与机器之间的交流的不同方式。NLP是一种能够让机器人理解并使用人类语言的技术。
对用户来说,如果一款应用可以与用户交流,那么这种交流最好类似于人与人之间的对话。如果仿人机器人病句迭出,或是答非所问,那么用户体验一定不会很好,这种机器人对消费者也就没什么吸引力了。因此,在机器人学中,理解并善用NLP是一件非常重要的事情。
下面列举了一些使用了NLP的真实应用。
你可能会问,这3个语音助手哪个最好?这个问题的答案取决于用户的个人喜好。
计算机视觉(computer vision)是机器人学中一种常用的技术,可以使用不同的摄像机来模拟人眼的生物力学三维运动。计算机视觉可以定义为用来获取、分析和处理图像并将其转换为对计算机有价值的信息的一组方法。在这个过程中,收集到的信息被转换为数字数据,以便计算机利用。后面的章节会对此进行介绍。
下面列举了一些使用了计算机视觉的真实应用。
如果要讨论AI和NLP,就一定要了解一下真实的机器人,因为这样可以让你理解现有的各种模型的进展状况。下面介绍一下已知的各种机器人的类型。一般来说,机器人可以分为两类:工业机器人和服务机器人。下面将对此进行探讨。
工业机器人用在工业制造中,一般不具有人的外形,看上去和其他机器没什么差别,因为工业机器人就是用来执行某种特定的工业任务的。
服务机器人以部分自主或全自主的方式工作,帮助人类执行各种任务。服务机器人可以进一步分为以下两类。
下面列举了一些现实中的个人机器人。
和其他的计算机系统一样,机器人也是由硬件和软件构成的。一个机器人所具有的软件和硬件的类型取决于它的用途和它的设计者,但是有一些硬件部件的类型在机器人中比较常用,这些部件会在本章中介绍。
下面是所有机器人都具有的3类部件。
图1.1所示为以图形化方式展示的机器人的组成部分。
为了更好地理解图1.1,下面在一个模拟情景中看看机器人的各个部件是如何工作的。假设机器人接收了从点移动到点的指令,如图1.2所示。
图1.1 机器人组成部分示意图
图1.2 机器人从点出发
这个机器人使用GPS(这是一种内部传感器)持续检查机器人的位置,从而判断是否已经抵达点,如图1.3所示。GPS会计算出机器人的坐标,然后发送给控制系统进行处理。如果机器人没有到达点,控制系统会让执行器继续前进。
图1.3 机器人正在从点移动到点
另一方面,如果GPS向控制系统发送的坐标与点的坐标一致,那么控制系统就会命令执行器终止该过程,机器人便会停止移动,如图1.4所示。
图1.4 机器人抵达点
使用上一节介绍的内部传感器,我们可以计算机器人经过一定位移之后的位置。这种技术称为测距法(odometry),使用编码器进行计算。测距法的主要优点和缺点如下。
下面介绍测距法的各个计算步骤。假设机器人使用两个轮子进行移动,那么计算步骤如下。
1.利用从机器人发动机编码器中提取的信息,分别计算两个轮子走过的距离。图1.5所示为针对双轮机器人的情况展示的一个简单示意图。
图1.5 双轮机器人运动示意图(1)
在图1.5中,虚线 表示左轮的位移,虚线 表示右轮的位移。
2.利用第一步获得的信息,可以计算轮子轴中点的线性位移。图1.6所示为在同一个示意图的基础上,使用 表示轮子轴中点的位移。
如果轮子有多个轴,那么首先需要研究轮子轴的分布方式,然后再分别计算每个轴的位移。
图1.6 双轮机器人运动示意图(2)
3.利用第一步获得的信息,可以计算机器人的旋转角度。将该角度记为。
在本例中,为90°,即机器人旋转了90°,如图1.7所示。
4.获得了所有信息之后,就可以进一步计算机器人的最终位置坐标了,计算方法会在接下来的内容中介绍。
图1.7 双轮机器人运动示意图(3)
在本练习中,我们使用上面介绍的计算步骤,计算一个移动一段时间后的双轮机器人的位置。首先看看下列数据。
编码器每圈计数(counts per lap)是一个测量单位,用来计算编码器围绕其轴旋转一圈产生的能量大小。例如,根据上面的信息,左编码器每5秒计数600次,编码器每圈计数76次。由此可得,编码器在5秒内会完整旋转7圈(准确来说是600/76圈)。知道了旋转1圈产生的能量,也就知道了在5秒内产生的能量。
初始位置中的前两个数字分别代表和坐标,最后一个数字代表机器人的旋转角度。旋转角度是相对的,你需要知道初始方向是什么。
然后按以下步骤计算。
1.计算每个轮子走过的距离。先计算每个编码器在机器人移动过程中的计数次数,计算方法是用移动时间除以每个编码器的单位时间,再乘以每个编码器在单位时间内的计数:
(移动时间/编码器单位时间) × 左编码器在单位时间内的计数= (5/5) × 600 = 600次
(移动时间/编码器单位时间) × 右编码器在单位时间内的计数= (5/5) × 900 = 900次
得到的结果可以用来计算轮子走过的距离。由于轮子是圆形的,每个轮子走过距离的计算方法如下:
(2π/编码器每圈计数)× 左编码器总计数= (10π/76) × 600 = 248.02 cm
(2π/编码器每圈计数)× 右编码器总计数= (10π/76) × 900 = 372.03 cm
2.计算轮子轴中点的线性位移,计算方法如下:
(左轮距离 + 右轮距离) / 2= (248.02 + 372.03) / 2 = 310.03 cm
3.计算机器人的旋转角度。首先计算两个轮子的距离之差,然后除以基座长度:
(右轮距离 − 左轮距离) / 基座长度= (372.03 − 248.02) / 80 = 1.55弧度
4.分别求出最终位置的各个组成部分,计算公式如下:
最终坐标 = 初始坐标 + (轮子轴位移 × 旋转角度余弦) = 0 + [310.03 × cos (1.55)] = 6.45
最终坐标 = 初始坐标 + (轮子轴位移 × 旋转角度正弦) = 0 + [310.03 × sin (1.55)] = 309.96
最终旋转角度 = 初始旋转角度 + 旋转角度= 0 + 1.55= 1.55
因此,经过此次移动,机器人的位置从(0, 0, 0)变为(6.45, 309.96, 1.55)。
和其他类型的软件开发一样,机器人应用和程序的实现也有很多不同的方式。
在接下来的章节中,我们会用到一些框架和技术,这些框架和技术有助于对具体问题进行抽象,开发出易于适应各种机器人和设备的解决方案。在本书中,我们将使用机器人操作系统(Robot Operating System,ROS)来实现这一目的。
在开始进行机器人开发之前,还需要考虑一下编程语言的问题。你一定已经了解并使用过一些不同的编程语言了,但哪一种最合适呢?真正的答案是,没有哪种编程语言是最合适的,应该视情况而定。鉴于我们希望解决的问题,本书将会使用Python。你可能已经知道,Python是一门解释型的、高级的、通用的编程语言,用途涵盖AI和机器人学等领域。
和其他编程语言一样,使用Python可以为机器人开发出你想要的功能,例如让机器人在识别到人时简单打个招呼,让机器人在“听到”音乐时跳舞。
如果你还不熟悉Python,下面的练习和项目会为你介绍Python在机器人学中的 应用。
这个练习会实现一个简单的Python函数,该函数按照“练习1”中的计算步骤计算轮子走过的距离。各个步骤如下。
1.导入所需的库。这里需要用到π:
from math import pi
2.创建带参数的函数。计算轮子走过的距离时,需要用到以下参数:
函数定义如下:
def wheel_distance(diameter, encoder, encoder_time, wheel, movement_time):
3.实现函数。计算编码器测量的距离:
time = movement_time / encoder_time
wheel_encoder = wheel * time
4.利用上面得到的距离,计算轮子走过的距离:
wheel_distance = (wheel_encoder * diameter * pi) / encoder
5.返回最终值:
return wheel_distance
6.为了检查函数的实现是否正确,可以向该函数传递一定的参数,然后再通过人工计算来检验:
wheel_distance(10, 76, 5, 400, 5)
该函数调用应该返回165.34698176788385。
轮子走过的距离如图1.8所示。
图1.8 轮子走过的距离
在这个练习中,给定机器人的初始位置、轮子轴走过的距离和机器人的旋转角度,使用Python计算机器人的最终位置。计算步骤如下。
1.导入sin和cos函数:
from math import cos, sin
2.创建函数。该函数需要以下参数:
def final_position(initial_pos, wheel_axis, angle):
然后利用“练习1”中的公式,编写该函数。
下面展示了一种编写方式:
final_x = initial_pos[0] + (wheel_axis * cos(angle))
final_y = initial_pos[1] + (wheel_axis * sin(angle))
final_angle = initial_pos[2] + angle
你可能已经注意到了,初始位置是使用一个元组来表示的,第一个元素代表坐标,第二个元素代表坐标,最后一个元素代表初始角度。
利用计算结果创建一个新元组,并返回:
return(final_x, final_y, final_angle)
3.同样,可以用一定的参数调用该函数,然后通过人工计算来检查函数的实现是否正确:
final_position((0,0,0), 125, 1)
上一行代码应该返回以下结果:
(67.53778823351747, 105.18387310098706, 1)
图1.9所示为机器人的最终位置。
图1.9 机器人的最终位置(1)
这个项目的目标是创建一个系统,用于检测机器人移动一段时间之后的位置。利用下面的数据,请编写一个Python函数来计算机器人的最终位置。
可以借助前几个练习中的函数来完成这个项目。那些函数中的一些步骤是可以在这里复用的。
可以参考以下步骤完成本项目。
1.计算每个轮子走过的距离。
2.计算轮子轴走过的距离。
3.计算机器人的旋转角度。
4.计算机器人的最终位置。
机器人的最终位置如图1.10所示。
图1.10 机器人的最终位置(2)
本项目的答案参见附录。
本章带领读者进入了机器人学的世界,介绍了一些先进的技术,例如NLP、计算机视觉和机器人学。本章用到了Python,并且接下来的各章还会继续使用。
此外,本章介绍了如何在不借助外部传感器的情况下,利用测距法计算机器人的位置。只要所需数据都是可以获取的,那么计算机器人的位置并不困难。请注意,虽然测距法是一项很棒的技术,但在接下来的各章中将使用其他的方法,利用不同的传感器,得到更精确的结果。
下一章将介绍计算机视觉,并探讨一些更为实际的主题。下一章会介绍机器学习、决策树和人工神经网络,并在计算机视觉中应用这些算法。这些算法不仅会在本书的余下部分中发挥作用,而且也会在你未来的生活或工作中派上用场。