經(jīng)過(guò)第一步分解任務(wù)后,接下來(lái)就要具體分析每一步是如何實(shí)現(xiàn)。
基本上到這里,孩子們都喜歡直接沖到電腦前開(kāi)始寫(xiě)程序,但是呢,往往一堆問(wèn)題,復(fù)雜點(diǎn)的任務(wù)更是寫(xiě)著寫(xiě)著就懵了。
雖然我們已經(jīng)分解了任務(wù),但只是一個(gè)初略的分解,具體每一步的如何實(shí)現(xiàn),前面的分解步驟是否有紕漏,是否合理,這些是需要我們具體來(lái)分析一下的。
這一步我們需要寫(xiě)出每個(gè)步驟的具體完成動(dòng)作,是那個(gè)傳感器在發(fā)揮作用,各個(gè)馬達(dá)應(yīng)該如何運(yùn)轉(zhuǎn)。如下入所示。

下面我們來(lái)具體分析一下。
記得還在初中的時(shí)候,在《智慧背囊》(暴露年齡了)里有這么個(gè)故事:有個(gè)記者采訪一個(gè)滑雪冠軍,問(wèn)他怎么學(xué)好滑雪,冠軍說(shuō):你要先知道怎么停下來(lái)。
就像永動(dòng)機(jī)是個(gè)偽命題一樣,我不認(rèn)為這世上有永遠(yuǎn)沒(méi)有結(jié)束的事,大到太陽(yáng),看似永恒,可是50億年后也會(huì)因?yàn)閮?nèi)部的氫元素全部耗盡,導(dǎo)致核心將發(fā)生坍縮。小到我們每天吃飯,我們不會(huì)一頓飯從早吃到晚,從今天吃到明天,當(dāng)我們飽了,不想吃了,或者飯吃完了,吃飯這個(gè)事也就結(jié)束了。
所以對(duì)于我們機(jī)器人任務(wù)的每一步,“你要先知道怎么停下來(lái)”,我們需要知道這一步什么時(shí)候結(jié)束。
以上節(jié)課的巡線任務(wù)為例。
第一步是直行。具體任務(wù)描述是從起點(diǎn)巡線到A點(diǎn)。這里其實(shí)有兩層含義:一個(gè)是巡線,一個(gè)是這一步的結(jié)束標(biāo)志是到達(dá)A點(diǎn)。如果不去關(guān)注每一步的結(jié)果,就會(huì)導(dǎo)致程序停留在這一步,無(wú)法結(jié)束。
那怎么判斷到達(dá)A點(diǎn)呢,A點(diǎn)處是一個(gè)直角,可以用光電來(lái)做遇黑判斷,單光電遇黑時(shí),就可以停下來(lái)結(jié)束這一步了。
然后在考慮巡線,巡線可以用單光電巡線來(lái)完成,一般到這個(gè)地步的孩子對(duì)單光電巡線都不陌生,不過(guò)這里就還是多啰嗦一下,因?yàn)閱喂怆娧簿€看似簡(jiǎn)單,但是還是很容易出錯(cuò)的。
單光電巡線根據(jù)光電在黑線的左邊還是右邊會(huì)有不一樣的走法,在左邊時(shí),遇黑要左轉(zhuǎn),否則右轉(zhuǎn),在右邊則是反過(guò)來(lái)。
上面這個(gè)過(guò)程看似復(fù)雜,但是我把這個(gè)過(guò)程總結(jié)為三個(gè)問(wèn)題:是我是誰(shuí)?我從哪里來(lái)?要到哪里去?開(kāi)玩笑的,是:終止條件是什么?終止?fàn)顟B(tài)是什么?這一步要干嘛?這是那個(gè)問(wèn)題又可以叫做三板斧,我自嗨一下,不用在意。
終止條件:右光電遇黑
終止?fàn)顟B(tài):停下
這步干嘛:黑線右邊巡線
弄清楚這三個(gè)問(wèn)題后,再具體看下這步干嘛怎么做
黑線右邊巡線:
左光電遇黑則右轉(zhuǎn)
否則左轉(zhuǎn)
文章剛開(kāi)始我說(shuō)這個(gè)環(huán)節(jié)我們要具體到每個(gè)光電每個(gè)馬達(dá)的狀態(tài),所以這步干嘛還要在細(xì)化:
黑線右邊巡線:
左光電遇黑則右轉(zhuǎn)(左馬達(dá)動(dòng),右馬達(dá)不動(dòng))
否則左轉(zhuǎn)(左馬達(dá)不動(dòng),右馬達(dá)動(dòng))
于是我們就可以把任務(wù)分析表給填好了,就是最開(kāi)始那張表。
有學(xué)生會(huì)說(shuō):老師,搞這么復(fù)雜干嘛?
因?yàn)榍懊娌贿@么分析的細(xì)致一點(diǎn),所有最后調(diào)試遇到的問(wèn)題都在這些細(xì)節(jié)里,馬達(dá)轉(zhuǎn)動(dòng)方向不對(duì),光電跟馬達(dá)的配合不當(dāng),等等。其實(shí)都可以通過(guò)這一步的分析來(lái)避免的。
按照上面的套路,我們把第二步的任務(wù)分析表也整出來(lái)。

這時(shí)候我們對(duì)比一下第一步跟第二步的終止條件會(huì)發(fā)現(xiàn),兩個(gè)都是右光電遇黑,這就意味著第二步的右轉(zhuǎn)在開(kāi)始的時(shí)候就結(jié)束了。真是出師未捷身先死,尷尬了。這里其實(shí)就是一個(gè)光電狀態(tài)的問(wèn)題,我們可以在第一步跟第二步之間增加一個(gè)小的環(huán)節(jié),讓光電離開(kāi)黑線上的狀態(tài)。

這里呢,有些學(xué)生喜歡把前沖這個(gè)動(dòng)作放在第一步的終止?fàn)顟B(tài)里,不是不行,但是我建議單獨(dú)設(shè)置一步,這樣使整個(gè)分析結(jié)果更加清晰明了,遇到問(wèn)題容易定位也容易修改。所以我們第一步的分解步驟,在這里就要做修改。
前進(jìn),前沖,右轉(zhuǎn),前進(jìn),前沖,左轉(zhuǎn),前進(jìn),前沖,右轉(zhuǎn),前進(jìn),停留2秒,后退,掉頭,前進(jìn),前沖,右轉(zhuǎn),前進(jìn)。
前三步的任務(wù)分析表如下圖所示,后面的步驟跟前面大同小異,用相同的辦法分析就行了。

限于篇幅,這里稍作補(bǔ)充下,對(duì)于經(jīng)驗(yàn)豐富的學(xué)生,他們其實(shí)會(huì)發(fā)現(xiàn),第一步的巡線其實(shí)可以從起點(diǎn)一步到B點(diǎn)的,因?yàn)閷?duì)于直角彎,單光電巡線完全可以在外側(cè)直接通過(guò),不需要分解成兩段直線。只要把雙光電放在黑線左側(cè),用右光電來(lái)巡線就行了。如果是這樣的話,我們的任務(wù)分解又要做修改了,我要去給老婆做飯了,沒(méi)時(shí)間了,這里就偷懶一下啦,還是按前面的步驟來(lái)吧。
下一篇就是要開(kāi)始寫(xiě)程序啦,下周見(jiàn)。
老規(guī)矩,可子鎮(zhèn)樓。
