做个全国一等奖的小车,其实不难(F题:智能送药小车方案分享)
01?
?前 言
大家好,我是張巧龍,今天給大家?guī)?lái)關(guān)于21年F題的分享:智能送藥小車,出了這個(gè)題目之后,咋一看,好像比較簡(jiǎn)單。
不過(guò)大家慢慢做,越往后做越發(fā)現(xiàn),坑越來(lái)越多。
第一個(gè)問(wèn)題:數(shù)字識(shí)別率不高,我對(duì)識(shí)別率高低的看法:只要不到100%,哪怕出現(xiàn)1%的誤識(shí)別率,我認(rèn)為都不行,為什么?
因?yàn)?#xff0c;題目明顯給出說(shuō)明,每個(gè)項(xiàng)目只測(cè)試一次。也就是說(shuō),小車一旦出錯(cuò),就0分,沒(méi)有再測(cè)的機(jī)會(huì)。
第二個(gè)問(wèn)題:小車巡線的問(wèn)題,一談到巡線,大家想到的肯定是,循跡模塊(顏色識(shí)別傳感器),這個(gè)沒(méi)問(wèn)題,可以用,也可以用攝像頭來(lái)尋跡。
不知道大家是否有發(fā)現(xiàn)過(guò),車運(yùn)動(dòng)的軌跡都是直線,轉(zhuǎn)彎都是90度,循跡模塊或者攝像頭尋跡確實(shí)可以用。
但運(yùn)動(dòng)過(guò)程中,需要一直巡線,對(duì)攝像頭或者是循跡模塊的要求比較高,環(huán)境的光線要求比較穩(wěn)定。
為了提高巡線的穩(wěn)定性,我認(rèn)為可以直接采用電機(jī)編碼器來(lái)寫閉環(huán),將小車運(yùn)動(dòng)的路程直接固定死,每次都是走固定直線距離后再識(shí)別數(shù)字,拐彎也可以直接固定,畢竟都是90度。
當(dāng)然,這個(gè)過(guò)程中,肯定需要顏色識(shí)別模塊或者攝像頭尋跡來(lái)做輔助。
來(lái)吧,看視頻展示,文字內(nèi)容在后文。
【全國(guó)一等獎(jiǎng)】F題:智能送藥小車
對(duì)了,由于是電機(jī)直接閉環(huán),所以本視頻中小車的運(yùn)動(dòng)速度還可以繼續(xù)提升。
02
?系統(tǒng)方案
2.0 摘要
以STM32單片機(jī)為核心、結(jié)合視覺(jué)識(shí)別技術(shù),通過(guò)速度閉環(huán)來(lái)控制智能送藥小車,并實(shí)現(xiàn)雙車在預(yù)定軌道上送藥,取藥。
基本模塊主要包括主控、攝像頭、直流減速電機(jī)、驅(qū)動(dòng)模塊,無(wú)線傳輸模塊,本設(shè)計(jì)主控選擇STM32F103RCT6。
在攝像頭識(shí)別中,采用雙攝像頭方案,K210用于識(shí)別數(shù)字和尋找對(duì)應(yīng)數(shù)字并通過(guò)串口向主控發(fā)送識(shí)別信息,從而進(jìn)入對(duì)應(yīng)的病房,OpenMV用來(lái)尋跡,防止小車偏離預(yù)定軌道;
小車1,2通過(guò)ZiGBee來(lái)完成雙車通信,實(shí)現(xiàn)雙車協(xié)同運(yùn)送的效果;通過(guò)電機(jī)編碼器反饋的信息設(shè)計(jì)小車的速度閉環(huán)控制系統(tǒng),實(shí)現(xiàn)運(yùn)輸距離的精準(zhǔn)控制。
經(jīng)過(guò)檢測(cè)發(fā)現(xiàn),本設(shè)計(jì)具有識(shí)別速度快,識(shí)別精準(zhǔn)度高,運(yùn)輸穩(wěn)定且效率高等優(yōu)點(diǎn)。
2.1?方案設(shè)計(jì)
2.1.1 控制方案設(shè)計(jì)
根據(jù)題目要求,將小車系統(tǒng)分為4個(gè)基本模塊,包括主控模塊、電機(jī)驅(qū)動(dòng)模塊、視覺(jué)檢測(cè)和識(shí)別模塊,無(wú)線通訊模塊,主控選擇STM32F103RCT6,通過(guò)速度閉環(huán)來(lái)實(shí)現(xiàn)電機(jī)驅(qū)動(dòng)的精準(zhǔn)控制。
視覺(jué)識(shí)別中,尋跡采用OpenMv攝像頭,數(shù)字識(shí)別采用K210攝像頭。
無(wú)線通信選擇ZIGBEE實(shí)現(xiàn)兩車之間的通訊,系統(tǒng)的總體設(shè)計(jì)框圖如圖1所示。
圖1 ?系統(tǒng)總體設(shè)計(jì)框圖
2.1.2?機(jī)械結(jié)構(gòu)方案
由于題目要求小車的長(zhǎng)寬高不能超過(guò)25cm*20cm*25cm,再加上賽道的寬度只有30cm,為了保證轉(zhuǎn)向的時(shí)候能夠避免碰到黑實(shí)線,我們采用雙驅(qū)動(dòng)置于車身中間,車身前后分別裝置牛眼輪便于轉(zhuǎn)向。
根據(jù)設(shè)計(jì)要求和實(shí)際情況,兩個(gè)攝像頭安裝于車頭前端,OpenMv在下,K210在上,以便于識(shí)別和檢測(cè)。
由于識(shí)別數(shù)字時(shí)數(shù)字寬度較大,K210無(wú)法全部識(shí)別到數(shù)字,所以搭配舵機(jī),實(shí)時(shí)調(diào)整攝像頭的位置來(lái)達(dá)到擴(kuò)大視野范圍的目的。
2.2?數(shù)字識(shí)別方法
首先將1-8字模原比例打印出來(lái),然后用K210進(jìn)行模型訓(xùn)練,模型訓(xùn)練了幾千張模型,生成訓(xùn)練樣本矩陣,一般樣本是以二維矩陣的方式存在文件當(dāng)中,現(xiàn)在要將它們讀出來(lái),進(jìn)行適當(dāng)?shù)念A(yù)處理,然后生成OpenCV能理解的數(shù)據(jù)結(jié)構(gòu)。
其中包含了分別從不同的視角對(duì)圖像進(jìn)行采集入庫(kù),在通過(guò)NCC模板匹配訓(xùn)練產(chǎn)生數(shù)字分類器,訓(xùn)練樣本中的數(shù)字位置形態(tài)各異,因此讀入時(shí)需要進(jìn)行規(guī)整化。
主要方法是先找到數(shù)字的邊界框,然后以寬和高中大的一邊為基準(zhǔn)進(jìn)行縮放和拉伸,從而使得其可以占滿整個(gè)表示單個(gè)樣本的矩陣。
再將其圖像二值化,進(jìn)行腐蝕分割,前面通過(guò)學(xué)習(xí)產(chǎn)生了分類器,但我們輸入圖像中的數(shù)字并不能直接作為測(cè)試輸入。圖像中的數(shù)字筆畫有時(shí)并不規(guī)整,還可能相互重疊。
接下來(lái),就可以對(duì)圖像進(jìn)行分割了。由于我們的分類器只能對(duì)數(shù)字一個(gè)一個(gè)地識(shí)別,所以首先要把每個(gè)數(shù)字分割出來(lái)。分割完后就可以應(yīng)用我們前面訓(xùn)練好的分類器對(duì)分割結(jié)果進(jìn)行識(shí)別。
2.3?自動(dòng)尋徑方法
首先對(duì)圖像進(jìn)行相關(guān)預(yù)處理,圖像采集和傳輸過(guò)程中可能產(chǎn)生噪點(diǎn),通過(guò)圖像灰度化和圖像濾波減小對(duì)圖像處理的干擾。
其次攝像頭采集跑道上的紅線,通過(guò)硬件二值化處理,這里用到最大類間方差法(Otsu)來(lái)實(shí)現(xiàn)圖像二值化閾值選取:
Otsu算法的基本思想是用某一假定灰度值t將圖像的灰度分成兩組,當(dāng)兩組的類間方差最大時(shí),此灰度值t就是圖像二值化的最佳閾值。
設(shè)圖像有L個(gè)灰度值,取值范圍在0~L-1,在此范圍內(nèi)選取灰度值T,將圖像分成兩組G0和G1,GO包含的像素的灰度值在0~T,G1的灰度值在T+1~L-1,用N表示圖像像素總數(shù),n, 表示灰度值為i的像素的個(gè)數(shù)。
已知:
每一個(gè)灰度值i出現(xiàn)的概率為p=n/ N;假設(shè)GO和G1兩組像素的個(gè)數(shù)在整體圖像中所占百分比可得:
緊接著,運(yùn)用計(jì)算機(jī)視覺(jué)的線性回歸(Linear Classification)算法進(jìn)行尋線,線性回歸能找到視野中任何的線,但是處理速度就會(huì)很慢。
為了能更快的尋到我們想要的軌跡,把顏色調(diào)為灰度,不去處理追蹤顏色,圖像大小設(shè)成QQVGA,縮小圖像面積,來(lái)增加速度。
最后向STM32提供反饋信息,控制電機(jī)進(jìn)行自動(dòng)尋徑。
2.4 小車電機(jī)運(yùn)動(dòng)閉環(huán)控制算法
依靠編碼器反饋數(shù)值,通過(guò)速度閉環(huán)解決對(duì)小車行駛距離的把控,本小車所采用的PID算法是閉環(huán)控制系統(tǒng)中常用的控制算法之一,其全稱為比例積分微分控制。
其傳遞函數(shù)如下:
再配合OpenMv二值化處理尋線輔助和K210數(shù)字識(shí)別并將相關(guān)數(shù)據(jù)通過(guò)串口反饋給主控板最終實(shí)現(xiàn)小車的精準(zhǔn)控制。
通過(guò)配置串口的波特率便可以控制串口通訊的速率。
為保證數(shù)據(jù)接收正常,本設(shè)計(jì)通過(guò)對(duì)控制系統(tǒng)中的STM32F103RCT6單片機(jī)進(jìn)行編寫通信協(xié)議程序,以防止無(wú)線接收模塊在受到干擾的情況下收到錯(cuò)誤指令而使小車失控的情況發(fā)生。
03
?程序設(shè)計(jì)
3.1??程序設(shè)計(jì)思路
3.1.1 小車1的程序設(shè)計(jì)思路
在識(shí)別目標(biāo)病房號(hào)后,判斷是否為近端,如果為近端則直接第一個(gè)十字路口轉(zhuǎn)對(duì)應(yīng)方向,否則直行至第二路口,判斷是否為目標(biāo)數(shù)字。
如果是,則轉(zhuǎn)對(duì)應(yīng)方向,否則直行至T型路口左轉(zhuǎn),判斷判斷是否為目標(biāo)數(shù)字,如果否,則轉(zhuǎn)至T型路口對(duì)面,識(shí)別目標(biāo)數(shù)字方位并轉(zhuǎn)彎。
識(shí)別虛線點(diǎn)后停車,發(fā)送位置信號(hào)給小車2,同時(shí)檢測(cè)小車2回饋信號(hào)和藥品是否卸載,在卸載藥品完成條件下,如果檢測(cè)到回饋信號(hào)則為雙車模式,等待小車2,發(fā)送到達(dá)指定位置信號(hào),則開(kāi)始啟動(dòng)返回,否則為單車模式,直接按記憶路線返回。
圖1 ?小車1程序設(shè)計(jì)流程圖
3.1.2 小車2的程序設(shè)計(jì)思路
發(fā)送反饋信號(hào)給小車1,開(kāi)始識(shí)別目標(biāo)病房號(hào),檢測(cè)是否裝藥,如未裝藥且接收到小車1位置指令,則取藥模式,運(yùn)行到T型路口處小車1對(duì)面支路并識(shí)別是否為目標(biāo)數(shù)字,如果否,則轉(zhuǎn)至T型路口對(duì)面,識(shí)別目標(biāo)數(shù)字方位并轉(zhuǎn)彎,識(shí)別虛線點(diǎn)后停車。
如裝藥且接收到小車1位置指令,則送藥模式,小車2運(yùn)行到指定位置停車且發(fā)送反饋信號(hào),當(dāng)接收到小車1繼續(xù)運(yùn)行指令則倒車回十字路口識(shí)別目標(biāo)數(shù)字方位并轉(zhuǎn)彎,識(shí)別虛線點(diǎn)后停車。
圖2 ?小車2程序設(shè)計(jì)流程圖
04
?總結(jié)
此方案,可行性較高,關(guān)鍵點(diǎn)有3個(gè),分別是電機(jī)編碼器位置閉環(huán)、K210訓(xùn)練識(shí)別數(shù)字、OPENMV巡線,其實(shí)這些內(nèi)容我在21年電賽開(kāi)賽前就說(shuō)過(guò),不知道大家還有沒(méi)有印象:
關(guān)于21年電賽,這些一定要熟悉!(點(diǎn)擊即可跳轉(zhuǎn)閱讀)
關(guān)于2021年電賽的一些想法,看到就是賺到!(點(diǎn)擊即可跳轉(zhuǎn)閱讀)
現(xiàn)在回過(guò)頭來(lái)看看,確實(shí)有一些參考價(jià)值。
由于篇幅有限,過(guò)多的細(xì)節(jié)在此不放了,有需要詳細(xì)設(shè)計(jì)報(bào)告以及代碼的,請(qǐng)加微信:great_xiaolong,加好友記得備注。
對(duì)了,近期會(huì)陸陸續(xù)續(xù)開(kāi)源電賽所有題目的方案,有興趣的朋友們可以關(guān)注下。
當(dāng)然,想來(lái)分享自己電賽心得體會(huì)的可以加我微信,進(jìn)行投稿,一旦錄用,有稿費(fèi)哦~
精彩推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀
帶學(xué)生參加電賽,5個(gè)國(guó)一,2個(gè)國(guó)二!15個(gè)省獎(jiǎng)!
【STM32入門】這個(gè)項(xiàng)目絕了,用手勢(shì)來(lái)產(chǎn)生波形!
電烙鐵焊錫到底有沒(méi)有毒?
近期會(huì)近期會(huì)開(kāi)源電賽所有題目的方案,歡迎大家關(guān)注公眾號(hào)。
總結(jié)
以上是生活随笔為你收集整理的做个全国一等奖的小车,其实不难(F题:智能送药小车方案分享)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: k3c路由器怎么设置
- 下一篇: python爬虫怎么挣钱_python爬