项目3认识路标的自动小车
说明
在这个项目中,重新回归轮子驱动的小车。然而,我们要脱离将手机作为遥控器的模式,这次,让手机成为机器人的眼睛,负责看着前方,当发现路标的时候,按照路标的指示控制小车运行。
构想
现在大多数Android手机上都配备有高分辨率的摄像头用来拍照、摄像。而乐高机器人的套装标配中通常都不包含这类摄影摄像设备。要让机器人真正能够“看到”面前的东西,仅靠红外线传感器或超声波传感器这类测距设备是远远不够的。而手机上的摄像头刚好弥补这一缺陷。
这次,就利用手机上的摄像头来检测、识别摆在机器人路上的路标,然后将其信息转换成命令发送给机器人。这样,就可以让机器人看着路标自动完成自己要走的路。
调研〖*4/5〗路标的识别有了前几个项目的经验,手机控制机器人对我们来说已经不再是什么难解的课题了。从上面的构想可以看出,本项目中最关键的问题就是如何实现对路标的识别。
由于这是一个相对复杂些的问题,需将问题分解来看。
1. 确定路标图形格式
首先,要确定路标图形的格式。考虑到算法的复杂度,在本项目中,不打算实现对类似图131里那些现实世界中的路标进行识别,而是识别我们自己设计的特定路标图形。这样做,一方面可以降低算法复杂度,另一方面也可以根据需要随时添加新的路标。为了达到这两个目的,路标必须设计成容易识别并有相当的自由度才行。
图131现实世界中的路标
首先来看看如何让路标容易识别。为了达到这个目的,必须了解计算机如何进行图像识别。如前所述,计算机科学其实是一门仿生学。因此,还是先来看看人类是如何进行图像识别的。项目3认识路标的自动小车 当安卓遇上乐高——用Android手机打造智能乐高机器人〖2〗〖2〗 〖1〗 图132至图134描述了在大道上辨认路标的过程。众所周知,人眼的工作原理类似于照相机,眼前的景象会在眼底投影成一张图片,那么人们要识别路标,首先要从这张投影图中找到并定位路标。图132就是我们眼前景象的投影图片,在图133中,我们定位到了路标。接下来,为了按照路标指示行事,必须看懂并理解路标上的内容。这时,人眼就会聚焦在路标上并开始对路标的细节进行采集和分析,大脑会参与其中去分析和理解路标内容的意义。当我们集中注意力去理解路标的时候,就如同图134那样,很可能会忽略周围的事物。在这个过程中,大脑实际还会对路标的图像进行变形和分解以识别上面的形状和文字。
图132带有路标的街景
图133定位路标
根据上面的分析,就可以总结出图像识别中关键的两个步骤——图像定位和图像辨析。图像定位是为了在复杂的现实图134截取并识别路标
场景中找到令人感兴趣的部分并进行定位;图像辨析则是将定位好的部分进行适当的变形、分解等处理,最终清楚理解图像所代表的意义。
那么,这两个步骤是如何完成的呢?还是来看人类是如何做的吧!
先说图像定位。请你回想一下最初看到图132时自己是如何找到路标图案的。或许有人会回答颜色,路标的颜色都是鲜艳的红色、蓝色并配以对比度较强的黑色、白色、黄色;或许有人会说是形状,路标的形状都是正圆或者方形;或许有人说是位置,路标一定是在头顶靠路边的位置……这些答案都没错,归纳一下,除了位置,其他两项都可以归为是图像的特征。路标是具有明显特征的图像,而人眼可以快速从杂乱无章的图片内容中抓取这种特征。为了达到这样的效果,几乎所有的路标都采用了对比度很强的颜色、自然界中难以存在的简单几何图形。而特定的位置更加速了对这些特征的抓取,并且保证了路标一定会进入司机的视野中。所以,用一句话总结的话: 图像定位是通过特征检测来完成的。
……
第一部分实践篇
准备工作3项目1带距离预警的手机遥控车8项目2听话的机器宠物71项目3认识路标的自动小车101第二部分知识篇
第1章计算机编程基础知识1711.1计算机编程概述171
1.2变量和数据类型174
1.3数字在计算机中的表述176
1.3.1标志位和位运算178
1.3.2逻辑运算和程序流控制184
1.3.3函数185
1.3.4特殊数据类型和内存分配186
第2章Java基础知识190
2.1Java简介190
2.2第一个Java程序193
2.2.1数据类型196
2.2.2运算和运算符198
2.2.3条件分支和循环201
2.2.4面向对象编程203
2.2.5Java中的常用类209
2.2.6Java中的异常处理212目录 当安卓遇上乐高——用Android手机打造智能乐高机器人〖2〗〖2〗 〖1〗 2.2.7Java中的多线程214
第3章Android编程基础知识218
3.1Android开发环境的构建218
3.2创建一个Android应用221
3.3Activity的开发225
第4章leJOS基础知识228
4.1安装leJOS228
4.2安装和使用Eclipse插件229
4.3在EV3上运行程序231
第5章计算机网络基础知识233
5.1分层的网络233
5.2网络协议235
5.3Java中的网络编程236
附录238
附录A随书光盘说明238
附录B装配图的打开方法240
附录C项目3中使用的路标图形241
参考文献250