一、背景
接触到“智能小车”这个概念是在八年前。当时想设计一个趣味性的单片机学习平台,使单片机学习能有一些与“跑马灯”之类项目不同的练习,可以做些有趣的、可持续的、相互关联的内容,且学习者愿意相互切磋,促使其不断完善练习的内容,从而真正掌握单片机;而不是只做些孤立、缺乏发挥空间的项目,像学校中的实验一样,验证性的实践一下,参与度极浅!
二、探索历程
当初是想找一个有显性需求,且不需要专业背景的内容,最终选择了“智能小车”。因为“车”的需求已众人皆知,且相对于航模和船模而言,实现的难度最小,特别是运行环境要求最低,最易于实现。
按此初衷,所关注的“智能小车”属性中,学习的成分居多,看重的是它原生需求所产生的控制素材,而非最终实现的小车性能,甚至希望小车本身不太“完美”,需要在控制上多下功夫,以弥补其“先天”不足;这样就等于给编程提出了更高的要求,学习效果会更好。
这么多年来,做了很多尝试,摸索智能小车的实现模式。开始是提供DIY套件,期望学习者在DIY过程中从硬件电路开始,逐步过渡到软件学习,从而完成单片机应用的入门。因为嵌入式学习是软硬件强相关的!
但实施后发现,学习跨度过大,会硬件的对付不了软件,学软件的卡在了硬件上,效果不理想!坚持了四年后,只好放弃这个思路。
此时,单片机有了长足的进步,已不是51一统天下的时代了,MCU的选择很多,再“强迫”学习者接受设定的单片机已不合时宜,便放弃了“从控制器到小车驱动、底盘全部包办”的思路,将智能小车抽象成2个部分:
1、小车底盘部分:实现小车行走功能,含机械和驱动部分,以及和运动相关的反馈,如码盘、电机电流检测等,从而使之成为一个实现行走功能的执行机构。但其侧重点是智能小车的需求,即在小范围内灵活运动;不同于车模,以竞速或越野为主要追求目标。
2、控制器部分:控制小车底盘部分工作,同时采集传感器信号,实现和外部通讯。
按当初设计“智能小车”的初衷,学习者关注的目标不是小车如何,而是如何实现控制,小车只是控制对象、学习素材。所以小车部分的实现耗费精力越少越好,主要精力应放在控制上。
顺着这个思路,对于学习者而言,需要的只是一个易于实现的小车底盘,而控制器部分他们自己根据学习内容选择,无需由他人代办。
因此,我将所做的重点改为:将小车底盘部分“封装”,形成一个易于构建智能小车的部件,或者已经是一个易于和控制器相连的智能小车底盘,选择任何一款单片机最小系统或者核心板,不需要任何器件,只需连线即可控制小车行走。
三、对目前智能小车实施模式的反思
在上述探索过程中,同时也在不断琢磨:“智能小车”到底应该采用什么样的实施模式?
模型领域的车模有十分成熟的模式,因为他们的需求十分明确 —— 性能、竞速、操控!围绕着这些确定的目标,车模产业创造了很多成熟的部件,将不便于个人制作的部分封装、产品化,如电调、遥控器、解码器、舵机、车轮、悬挂等,而将玩家需要个性化的组装过程让出来,可以用这些组件构成不同性能的模型,为玩家提供足够的发挥空间。
“智能小车”也存在了很久,可远比车模的发展落后,经历了这么多年,市场上的智能小车还是那么“粗糙”,问题何在呢?
我觉得最大的问题是:需求不清晰!
“智能小车”这个词在10个人嘴里会有10种解释,更可悲的是:如果要他们深入展开,你会发现更加“混乱”!
不只是在陈述上存在问题,在实施过程中也一样,很多人一时冲动开始动手,自认为已经知道要实现一个什么目标。可随着制作的深入,逐渐发现离预想的目标越来越远,最后连自己也搞不清要实现什么了,只好草草收手,留下一个“烂尾工程”,最多作为吹牛的谈资。
一个概念十分混乱的项目,怎么可能有一个良性的发展?
要想“智能小车”有明显改观,使之能和车模等活动相媲美,首先必须确定其需求,用明确的目标引导客户,营造相对集中的内容和平台!而不是一盘散沙。
从我探索的经历看,参与“智能小车”活动者的学习需求更多一些。
智能小车不像车模,有明确的竞技目标、成熟的比赛规则。智能小车到目前为止还没有一个相对稳定的比赛内容,多数停留在“秀”的层面上,不存在性能比较的基础,因为还不知道该追求和完善什么指标。
可从学习角度出发,参与者又没有一个明确的思路,清晰的界定自己要学些什么?怎么去学?阶段目标是什么?什么时候算是达到了目的?只能宏观的提出一个想法就开始动手了,比如:想学习单片机应用、想学习嵌入式,、想学习电机PID控制等等。
但启动后就会发现有很多困难,因为所要实施的内容是自己不了解的(了解就无须学了),首先是实现目标的难度把握,通常是太难而无法实现;其次是由于某些主、客观约束条件没有考虑,导致制作过程中被自己掌控不了的因素所羁绊。就像一个学生要自己给自己出题一样,很难“适度”,否则优秀的习题集和模拟卷就不会那么被追捧了。
这样开始的制作过程结果可想而知,“烂尾工程”是常态,即便做出来作品多数只能自我安慰一下,因为和自己初期的目标相去甚远,只有制作过程算是参与者最大的体验和收获。
从另一角度审视:由于制作智能小车的目标多数是个性化的,没有相对集中的基础和公共的内容,所以交流也存在障碍,这带来两方面问题,其一是:遇到困难无法得到支持和帮助,孤军奋战,极易半途而废。 其二是:解决问题后无法分享,享受不到征服后的喜悦,以及胜人一筹的快感,很难激励继续深入。电脑游戏之所以流行,能在同样的内容上比别人做的更好、从而满足虚荣心和成就感是很大的因素。
交流、分享、竞争是人作为群体动物的核心需求!
因此,在明确定义智能小车活动的目标时,必须考虑内容的相对集中,以便激发参与者的热情,使活动能持续和扩散。
四、以学习为目标的智能小车实施方式
4.1、定位
首先:将此处所讨论的“智能小车”实施目的定位为学习,而且是侧重编程的学习!
以学习为目标制作智能小车虽不是智能小车活动的全部,但占很大比例。本文只就此主题探讨一下智能小车的实施方式,至于其它的需求,留待他人去研究,本文暂不涉及。
前文已述:智能小车可以分为两个部分,其一是小车底盘部分,包含电机、驱动、轮子和必要的反馈,实现小车的行走功能。其二是控制部分:控制小车底盘部分按需要行动,包含MCU、传感器和通讯接口。
制作智能小车的学习者,多数关注的是编程,也就是软件,而非硬件。
即便是学习者自己准备的控制部分,也通常是选择一些成品部件构成,如开发板、核心板、传感器模块、通讯模块等,这些很多是成熟的产品,但不是为智能小车设计,智能小车只能算是“借用”而已。购置这些部件后,简单连接后就能使用,注意力很快便转向编程。
因此,暂且缩小学习的范围,将智能小车的学习内容锁定为:编程学习!
4.2、小车底盘部分的实施方式探索
学习者希望智能小车特有的部分 —— 小车底盘也能像控制部分那样便于构建和使用,无需耗费太多精力。而目前市场上多为分立的电机、车轮、驱动、底盘、码盘,实现起来颇为麻烦,关键是所涉及的知识和能力是学习者通常不全具备的,很多想把智能小车作为学习平台的都倍受困扰。
虽说智能小车的底盘可以有很多种方式实现,驱动也有诸多形式(我曾写过一篇《智能小车全攻略》,列举了很多智能小车的底盘形式),但作为学习平台,智能小车的形式并不重要,只要能安装你所选择的控制部分,蕴含你所要学习的内容即可(当然,能方便的实现各种驱动方式更好,可以体验不同驱动的优劣,同时满足各类任务的需求)。
所以,就智能小车而言,应该设计一些符合“车”需求的部件,类似于车模的电调、舵机等,简单组合即可实现“车”的功能。或是符合某类需求的小车平台,配上控制器即可工作。
基于此构想,尝试设计了两种部件:
A)轮式驱动单元:一个将车轮、电机、电机驱动、码盘检测、电机电流检测等功能集成在一起的部件,可方便的和MCU的IO口相连,直接使用MCU的IO口驱动和检测,实现闭环运动控制。同时在结构设计上易于安装,不但可以实现最常见的差分驱动模式,还可以方便的实现用舵机控制转向的驱动模式,以及由此而派生出来的全向驱动模式。构建小车时只需根据控制部分的安装需求设计相应底板即可,一般用4.5mm厚的亚克力制作,用CAD画好后,将图纸发给亚克力板材店家,他们有雕刻机,可以代加工,十分方便。
轮式驱动单元主要是针对需要在智能小车上搭载较多部件的应用场景,轮子直径80mm,小车尺寸在直径200 ~ 400mm 范围。构建的小车最大可以搭载一台笔记本电脑,作为小车控制器,从而享用PC机上方便的开发环境,实现更全面的控制需求,如:使用Kinect 作为导航传感器!
B)FIRA小车平台:这是基于机器人足球FIRA的规则设计的一个小车平台,小车体积只有75*75*75mm,两轮差分驱动,同样包含了车轮、电机、电机驱动、码盘检测、电机电流检测等功能,也可以直接使用MCU的IO口控制,区别是这已经是一个完整的小车底盘了,只需配置控制板即可。这个平台以小见长,主要针对一些无需搭载很多部件的应用场景,使用者关注的是小车的行为,或者是基于现成内容的编程练习,如群体机器人研究。
之所以按照FIRA的规则设计,是因为机器人足球是一项趣味性、知识性都较为丰富的活动内容,从编程学习角度,其蕴含的知识不论是深度还是广度都有充分的学习空间。即便不作为足球机器人,娇小的身材仍可以应对很多项目,而且可以在桌面上把玩,简单、方便。
4.3、小车控制部分的实现模式建议
严格来说,这部分应该由学习者自己决定:以何种方式实现。这也是我在写那篇《智能小车全攻略》时没有涉及控制部分的原因,因为当时我就没有想清楚该给学习者一个什么样的建议?但我一直在观察、思考,站在学习者的角度,到底应该如何选择?
我尝试只提供小车底盘部分,但似乎效果也不是很好,很多人还是觉得控制部分无法把握,不知道该怎样配置控制部分。
所以我自己也在不断地摸索控制部分的实现方式。
首先做过一款基于STM32的控制板,主要是想为学习 RTOS提供方便,因为STM32 的性能指标很符合RTOS的要求,且开源的RTOS经典之作 uCOS有丰富的资料。但这样做需要我提供完整的学习资料,工作量很大,至今还在完善之中,尚未推出。
除了工作量,还有一个因素阻碍了这个方案的面世:缺少一个可以持续且有趣的项目!(“机器人足球”项目由于个人能力所限,一直未能如愿)
小车跑起来不是目标,需要赋予它一个任务,才能使需求更加丰满,才能提供给学习者充分的素材。
后来Arduino风行,便尝试了将Arduin作为控制器,实现是很容易,还试着重新设计了UNO控制器,实现了无线程序下载。但感觉发挥空间有限,作为学习素材有点“单薄”,尤其是针对大学生。同时也一样由于缺少任务而搁浅。
看到WifiRobot热,又尝试了基于OpenWRT系统的路由器作为控制器。
就制作的感受而言:虽然成本上确实有些优势,但缺少学习的素材,硬件上也有诸多不便,毕竟是借用的路由器硬件,便宜的代价是:存在若干很难掌控的因素,供电也是一件很烦的事!
而且只是实现一个视频遥控小车,或是堆砌了很多东西,“秀”的成分多于“学”,在编程上发挥空间不大,愿意深入学OpenWRT的人很少(光搞定它所能驱动的摄像头就非易事),也缺少合适的“任务”激发参与者深入,交流的内容停留于将少数人提供的程序烧入、重现,就学习而言含金量不高。
除了自己实践、摸索,还关注了很多其他人做的智能小车方案,如基于树梅派的,基于各类开发板、核心板的,大同小异,没有一个相对集中的需求引导,都只是停留在“小车动起来”的阶段,连个“好坏”都无从评判。
在上述探索过程中,我逐渐有了这样一个思路:
智能小车一般是上、下位机架构:下位机控制车的行为,因为要实时,且需要硬件控制接口,所以用单片机实现。上位机实现高级的策略控制以及视频采集、处理,因为在操作系统下,有丰富的资源可以利用,便于实现这类需求,所以上位机多采用可以运行操作系统的控制器。
从易上手、性价比等各方面综合考虑,下位机建议用Arduino实现,易上手,且不要求有硬件基础。上位机则建议借用Android智能手机,资源丰富!
虽说智能手机价格不菲,但它并非专为小车而购,所以成本可以看成“0”。现在那些控制器虽然“不贵”,但只能用于小车,多数时间闲置,代价还是不小的。
手机自带摄像头,无匹配和驱动之扰。我被路由器摄像头的选择折腾的快要崩溃了,现在手上还有一堆无法使用的摄像头:
供电也是路由器、树梅派等作为控制器较大的困扰,耗电大,电压要求不同。用手机则不存在这些问题。
智能手机的性能在不断完善,处理能力远超那些路由器和核心板,Android的生态环境就更不用说了。
作为一般性的编程学习者,其实没有必要去接触那些专业的核心板或相对冷门的软件环境(OpenWRT),流行的软件环境对于学习编程十分有益,因为有充分的学习资源,而且日后或许还有用武之地。
按此思路构建的智能小车框图如下:
如上图所示,典型的上、下位机架构。用轮式驱动单元和舵机构建小车底盘;Arduino控制器作为下位机,控制轮式驱动单元和舵机,实现小车行走;手机作为上位机,用其摄像头实现视频采集,用其Wifi和PC机通讯,用其蓝牙和Arduino通讯,扮演了WifiRobot中的路由器和摄像头的角色。
因轮式驱动单元可以5V驱动,舵机供电是4~6V,Arduino控制器和蓝牙模块都可以5V工作,可借用“手机充电宝”作为小车的电源,再次降低了成本,使用、充电更加方便,也使小车更为“干净、利落”。
用手机的背部摄像头,因为比较清晰,且多数是在中间。设计了一个弹簧固定的夹子,且可以前倾,以便实现对前方地下的监测,如捕捉彩球、走轨迹、避障等。
选用了一个Arduino扩展基板,主要为了便于连线,它将每个IO都配置了一个电源和地线插针,十分方便。
手机和外界的交流均通过无线方式,没有任何物理连接,确保不会因控制小车而损坏。一款好的智能手机价格不菲,必须考虑这个因素。
4.4、编程环境的选择
此想法三年前就尝试过:
但当时被WinCE编程所羁绊,未能继续。
这次再次尝试,首先是被Android的开放所吸引,但即便如此,构建一个标准的Android开放、发环境仍非易事!
真正让我重起炉灶的是它:
这本书是在网上查阅资料时无意发现,下载后觉得内容十分契合我的需求,Processing的简便易用早有体会,如果编写Android程序也能如此便捷,那障碍岂不烟消云散?
按书中示例浅尝后发现,果真如此!没有任何手机编程基础的我也能编写App了,而且是能控制手机硬件的!最想用的三个硬件:摄像头、Wifi、蓝牙书中都有章节讨论,太棒了!
考虑到开始就将视频识别等高级任务放置手机上难度太大,因为毕竟是手机,调试环境简陋,资源有限。
所以尝试的第一步是按照WifiRobot的模式:手机只是完成图像采集、上传给PC机,由PC机实现图像识别,并产生相应的控制命令,发送给手机,手机再通过蓝牙转发给Arduino控制器,控制小车行走。
之所以不用PC机直接通过蓝牙发命令给Arduino控制器,是因为最终的目标是手机自主控制小车,而非PC机!将图像传送给PC是作为监视或者更高级的交互,不是控制小车的简单行为!
软件环境按上述构思,分为三个部分:
1)控制小车行为的下位机 —— Arduino控制器,基于开源的Arduino的IDE,这个大家已经很熟悉了,在此不再赘述。
2)实现图像采集和命令上传下达的上位机 —— Android手机,基于Processing环境,它和Arduino的IDE同源,几乎一样的操作,易学易用。将 PRocessing置于Android模式即可。
3)暂时作为手机“外脑”的PC机,还是基于 Processing环境,只是设置在JAVA模式,有支持Processing 的 OPENCV 库,可以方便的使用。包括一些视觉处理的示例。
上述三个环境都是经典的开源项目,且出于同一组织,使用方式完全一样,对于初学者而言,不必耗费精力去学习复杂的IDE环境设置和使用,注意力可直接放在程序逻辑上,这才是学习编程的核心!
虽说有了上述易用的环境和丰富的资源,但实现过程对我而言还是有些困难,问题出在如何通过WiFi将图像传送到PC上,并且转换为Processing可以处理的图像格式。请了一个大学生帮忙,化解了这个难题。在此表示感谢!
为了便于大家学习,将一些基础功能做成了Processing库,如图像的传输、Wifi命令传输、蓝牙命令传输等,初学者可以快速的让小车动起来,之后再逐步深入,掌握全部的细节。
在这方面我也是个初学者,希望能借助这个小车平台,学会手机编程,掌握基于手机和PC的图像识别技术,以及相关的通讯技术。
五、愿望
目前小车平台只是一个雏形,所做的示例程序只能证明这个模式可行,作为一个完整的学习素材,还有很多内容需要完善。包括不同形式的小车底盘,以及相应的活动内容。
补白:
将智能小车的学习的内容局限在“编程”上,是否合适?通常提及“智能小车”,强调的是锻炼“动手能力”!忽略掉是否合理?
一定会有人提出此疑问!
个人认为:
首先,不能狭隘的认为:强调“编程”学习就是否定了“动手能力”的培养,我只是在这个小车项目上将学习的内容做了界定,以使得项目更具体、可操作。本人并不反对任何形式的动手能力锻炼!
其次,就如今的社会实际状况,对多数人而言,可能学习编程的需求更为普遍,因为工业化已使“手工制作”成为一种工艺性或趣味性的活动,而编程将成为主要的技术类谋生手段。
第三,“编程学习”和“动手制作”其本质上有相通之处,都是DIY,强调在自己动手的过程中提高分析、处理问题、与他人交流、合作的能力。
但就国人的环境而言:快节奏的生活、较短的业余时间以及窘迫的个人空间,只有少数人能实现需要整段时间和场地的“制作”。而编程则不然,对环境和时间的要求都大大降低,可以充分利用碎片时间去完成构思、尝试、完善。而且交流也更容易。
同时就能力锻炼而言,编程学习虽说缺少了“手上技巧”的提升,但逻辑思维能力的锻炼远胜于“制作”,这个能力对人的生存影响更为深远,尤其是孩子!特别是如今处于应试教育中的孩子,他们普遍缺乏严谨的思维逻辑训练!数学都快成了英语课,因为靠背答案即可应对。电视上《一站到底》类的节目更是错误的诱导了孩子,那种记忆力超强的人在现实社会中鲜有用武之地。解决现实问题需要的是分析和推理,将复杂过程抽象、分解,化繁为简,逐一克之。这些在编程学习中能够充分得到锻炼和提升!
个人之见,欢迎讨论!