賽E題實(shí)戰(zhàn):光電傳感與PID控制實(shí)現(xiàn)運(yùn)動(dòng)目標(biāo)自動(dòng)追蹤)
1. 從零到一國(guó)賽E題“運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)”的實(shí)戰(zhàn)復(fù)盤(pán)去年夏天我和我的團(tuán)隊(duì)一頭扎進(jìn)了全國(guó)大學(xué)生電子設(shè)計(jì)競(jìng)賽國(guó)電賽的E題——“運(yùn)動(dòng)目標(biāo)控制與自動(dòng)追蹤系統(tǒng)”。這個(gè)題目乍一看名字挺唬人什么“運(yùn)動(dòng)目標(biāo)”、“自動(dòng)追蹤”感覺(jué)像是電影里的高科技。但說(shuō)白了核心就是讓一個(gè)“小車”或者云臺(tái)能自己動(dòng)起來(lái)去追一個(gè)會(huì)移動(dòng)的“目標(biāo)”。這個(gè)目標(biāo)可能是一個(gè)發(fā)光的LED一個(gè)特定顏色的色塊或者一個(gè)二維碼。聽(tīng)起來(lái)是不是有點(diǎn)像我們小時(shí)候玩的“老鷹捉小雞”的自動(dòng)版只不過(guò)老鷹和小雞都換成了電路板和單片機(jī)。為什么這個(gè)題目每年都能吸引無(wú)數(shù)隊(duì)伍前赴后繼因?yàn)樗昝赖厝诤狭饲度胧较到y(tǒng)、傳感器技術(shù)、自動(dòng)控制、圖像處理或光電檢測(cè)以及機(jī)械結(jié)構(gòu)等多個(gè)學(xué)科的知識(shí)點(diǎn)。它不要求你某個(gè)單項(xiàng)技術(shù)做到極致但要求你具備出色的系統(tǒng)集成能力、工程實(shí)踐能力和臨場(chǎng)應(yīng)變能力。四天三夜從拿到賽題到封箱上交作品這不僅僅是一場(chǎng)智力的比拼更是一場(chǎng)體力、意志力和團(tuán)隊(duì)協(xié)作的終極考驗(yàn)。今天我就以一個(gè)過(guò)來(lái)人的身份把我們當(dāng)時(shí)做E題的完整思路、踩過(guò)的坑、以及最后讓我們拿到國(guó)獎(jiǎng)的關(guān)鍵決策毫無(wú)保留地分享出來(lái)。無(wú)論你是即將參賽的學(xué)弟學(xué)妹還是對(duì)嵌入式控制感興趣的愛(ài)好者相信這篇近萬(wàn)字的“脫水干貨”都能給你帶來(lái)實(shí)實(shí)在在的啟發(fā)。2. 破題與頂層設(shè)計(jì)你的系統(tǒng)究竟要干什么國(guó)賽題目往往言簡(jiǎn)意賅但字字珠璣。E題描述通常只有一頁(yè)紙里面卻藏著所有得分點(diǎn)和“坑點(diǎn)”。我們的第一步不是急著畫(huà)電路圖或?qū)懘a而是像解數(shù)學(xué)題一樣把題目要求逐字逐句“翻譯”成明確的技術(shù)指標(biāo)和系統(tǒng)功能。2.1 核心任務(wù)分解從模糊描述到清晰指標(biāo)以我們那年的題目為例核心要求通常包括基本要求系統(tǒng)上電后能自動(dòng)搜尋并鎖定初始靜止的目標(biāo)比如一個(gè)特定頻率閃爍的LED。鎖定后追蹤裝置如攝像頭云臺(tái)的中心要對(duì)準(zhǔn)目標(biāo)中心。這考察的是靜態(tài)目標(biāo)捕獲能力。發(fā)揮部分目標(biāo)開(kāi)始按照預(yù)定軌跡如圓形、矩形運(yùn)動(dòng)追蹤裝置需持續(xù)跟蹤保持對(duì)準(zhǔn)并實(shí)時(shí)顯示目標(biāo)位置坐標(biāo)。這考察的是動(dòng)態(tài)目標(biāo)跟蹤與控制系統(tǒng)響應(yīng)速度。創(chuàng)新部分加分項(xiàng)目標(biāo)運(yùn)動(dòng)軌跡變?yōu)殡S機(jī)或變速系統(tǒng)需能適應(yīng)并穩(wěn)定跟蹤。可能還會(huì)要求增加測(cè)距、無(wú)線數(shù)據(jù)傳輸、上位機(jī)顯示等功能。這考察的是算法魯棒性和系統(tǒng)擴(kuò)展能力。我們的做法是制作一張“需求-技術(shù)-驗(yàn)證”對(duì)應(yīng)表。用Excel或者直接畫(huà)在草稿紙上左邊列是題目原話中間列是我們理解的具體技術(shù)實(shí)現(xiàn)右邊列是計(jì)劃如何測(cè)試驗(yàn)證。例如題目要求技術(shù)實(shí)現(xiàn)解讀測(cè)試驗(yàn)證方法“自動(dòng)搜尋目標(biāo)”云臺(tái)需具備二維旋轉(zhuǎn)能力舵機(jī)/步進(jìn)電機(jī)配合傳感器進(jìn)行全域掃描。上電后云臺(tái)應(yīng)能自動(dòng)執(zhí)行掃描程序并在找到目標(biāo)后停止。“鎖定目標(biāo)”傳感器攝像頭/光電管輸出信號(hào)需達(dá)到穩(wěn)定閾值并認(rèn)為目標(biāo)位于視場(chǎng)中心。用示波器或串口監(jiān)視傳感器信號(hào)當(dāng)信號(hào)穩(wěn)定且云臺(tái)停止運(yùn)動(dòng)時(shí)視為鎖定。“跟蹤運(yùn)動(dòng)目標(biāo)”需實(shí)現(xiàn)閉環(huán)控制傳感器反饋目標(biāo)位置偏差 - 控制器計(jì)算 - 驅(qū)動(dòng)電機(jī)消除偏差。讓目標(biāo)沿固定軌跡運(yùn)動(dòng)觀察云臺(tái)跟隨是否平滑用上位機(jī)記錄軌跡曲線是否吻合。“顯示坐標(biāo)”需有顯示模塊OLED/LCD或通過(guò)串口發(fā)送到電腦上位機(jī)。目視檢查屏幕顯示或上位機(jī)軟件接收到的坐標(biāo)值是否合理、連續(xù)。這張表會(huì)成為我們后續(xù)所有工作的“憲法”任何設(shè)計(jì)決策都要回頭看看是否滿足了表中的某項(xiàng)要求。很多隊(duì)伍失敗的第一個(gè)原因就是沒(méi)有吃透題目想當(dāng)然地去做結(jié)果做出來(lái)的東西和評(píng)分標(biāo)準(zhǔn)格格不入。2.2 技術(shù)路線選型攝像頭方案 vs 純傳感器方案這是E題最核心的決策點(diǎn)直接決定了整個(gè)系統(tǒng)的復(fù)雜度、成本和穩(wěn)定性。方案一攝像頭圖像處理方案核心使用OpenMV、K210、樹(shù)莓派配合攝像頭或STM32F4/F7系列配合OV系列攝像頭作為主控通過(guò)圖像算法識(shí)別目標(biāo)。優(yōu)點(diǎn)信息豐富能獲取目標(biāo)的二維坐標(biāo)、形狀、大小、顏色等多種信息理論上識(shí)別更準(zhǔn)確。靈活性高通過(guò)修改代碼可以適應(yīng)不同特征的目標(biāo)顏色、形狀、圖案甚至實(shí)現(xiàn)多目標(biāo)跟蹤。“看起來(lái)”更高級(jí)容易做出炫酷的上位機(jī)圖像顯示界面視覺(jué)沖擊力強(qiáng)。缺點(diǎn)與巨坑處理速度圖像處理非常消耗算力。在低端MCU上幀率可能很低如OpenMV處理復(fù)雜算法時(shí)可能只有10fps左右導(dǎo)致系統(tǒng)響應(yīng)遲鈍無(wú)法跟蹤快速目標(biāo)。光照影響賽場(chǎng)光線不可控。窗戶邊的陽(yáng)光、日光燈頻閃、其他隊(duì)伍的燈光干擾都可能讓顏色識(shí)別或閾值分割完全失效。這是我們親眼所見(jiàn)最多隊(duì)伍翻車的地方。算法復(fù)雜度你需要編寫(xiě)或調(diào)試圖像處理流程找色塊、輪廓檢測(cè)、中心點(diǎn)計(jì)算并處理好圖像坐標(biāo)到云臺(tái)舵機(jī)角度的映射關(guān)系調(diào)試周期長(zhǎng)。穩(wěn)定性程序復(fù)雜內(nèi)存占用大容易死機(jī)或出現(xiàn)偶發(fā)性識(shí)別錯(cuò)誤。方案二光電傳感器陣列方案核心使用光敏電阻、光電二極管、激光接收管等模擬傳感器或者集成度更高的灰度傳感器、紅外循跡模塊陣列來(lái)感知目標(biāo)光源的位置。優(yōu)點(diǎn)響應(yīng)速度極快模擬電路或數(shù)字傳感器的響應(yīng)是微秒級(jí)的幾乎沒(méi)有延遲。抗干擾能力強(qiáng)可以針對(duì)特定頻率如果目標(biāo)LED是調(diào)制的進(jìn)行選頻放大極大抑制環(huán)境光干擾。電路做好了穩(wěn)定性極高。控制邏輯簡(jiǎn)單傳感器輸出直接就是電壓或數(shù)字信號(hào)反映目標(biāo)偏離中心的方向和程度可以直接用于PID控制計(jì)算系統(tǒng)簡(jiǎn)潔可靠。成本低功耗低。缺點(diǎn)信息量少通常只能得到一維或二維的偏差量無(wú)法知道目標(biāo)的絕對(duì)坐標(biāo)或復(fù)雜特征。依賴目標(biāo)特性通常要求目標(biāo)是主動(dòng)發(fā)光的、特定頻率的LED。如果題目目標(biāo)是被動(dòng)反射的普通物體此方案可能不適用。我們的關(guān)鍵決策與心得經(jīng)過(guò)激烈討論和前期實(shí)驗(yàn)我們毅然選擇了方案二——光電傳感器陣列。理由非常功利且直接國(guó)賽是在體育館里進(jìn)行現(xiàn)場(chǎng)光照條件復(fù)雜穩(wěn)定壓倒一切。我們賭題目中的“運(yùn)動(dòng)目標(biāo)”會(huì)是一個(gè)易于用光電方式檢測(cè)的主動(dòng)光源后來(lái)證實(shí)果然如此。我們用了4個(gè)光電二極管配合透鏡組成一個(gè)“十”字形探測(cè)陣列后面接模擬電路進(jìn)行放大、濾波和比較。整個(gè)檢測(cè)電路的反應(yīng)時(shí)間在毫秒級(jí)為后續(xù)的高速跟蹤打下了堅(jiān)實(shí)基礎(chǔ)。這個(gè)選擇讓我們避開(kāi)了最不可控的“光照”變量把問(wèn)題從復(fù)雜的圖像處理拉回到了我們更擅長(zhǎng)的電路設(shè)計(jì)和控制算法上。給后來(lái)者的忠告除非你對(duì)圖像處理有極深的功底和充分的抗干擾測(cè)試否則在有限的比賽時(shí)間內(nèi)優(yōu)先考慮最穩(wěn)定、最直接的方案。3. 硬件系統(tǒng)的骨架穩(wěn)定可靠的電路與機(jī)械設(shè)計(jì)硬件是系統(tǒng)的身體軟件是靈魂。一個(gè)顫顫巍巍的云臺(tái)或者噪聲巨大的傳感器信號(hào)再優(yōu)秀的算法也無(wú)力回天。3.1 傳感器模塊如何把“看見(jiàn)”變成“電信號(hào)”我們采用四象限光電探測(cè)器方案。核心思想是用一個(gè)遮光筒將視場(chǎng)限制在一個(gè)小圓錐內(nèi)四個(gè)光電二極管A, B, C, D呈“十”字排列在遮光筒底部。當(dāng)目標(biāo)光源出現(xiàn)在視野中時(shí)它會(huì)照亮一個(gè)或幾個(gè)二極管。電路設(shè)計(jì)要點(diǎn)選型光電二極管要選擇響應(yīng)速度快、暗電流小的型號(hào)。我們用的是BPW34。I-V轉(zhuǎn)換光電二極管輸出的是微弱的電流信號(hào)uA級(jí)。第一級(jí)運(yùn)放必須配置成跨阻放大器Transimpedance Amplifier將電流轉(zhuǎn)換為電壓。這里的反饋電阻和電容取值至關(guān)重要決定了帶寬和噪聲。放大與濾波第二級(jí)可調(diào)增益放大將信號(hào)放大到MCU ADC可采集的范圍如0-3.3V。必須加入帶通濾波如果目標(biāo)LED是1kHz方波調(diào)制我們就設(shè)計(jì)一個(gè)中心頻率在1kHz的帶通濾波器。這能濾除幾乎所有的環(huán)境光直流和低頻以及其他隊(duì)伍可能用的不同頻率光源高頻干擾。峰值檢波或有效值轉(zhuǎn)換經(jīng)過(guò)濾波放大的交流信號(hào)需要轉(zhuǎn)換成直流電壓才能被ADC采集。我們用了精密整流加低通濾波構(gòu)成的峰值檢波電路。也可以使用AD736這類真有效值芯片。信號(hào)合成得到四個(gè)通道的直流電壓Va, Vb, Vc, Vd后如何計(jì)算目標(biāo)偏離中心的位置(ΔX, ΔY)水平偏差 ΔX (Va Vd) - (Vb Vc)。當(dāng)目標(biāo)在左邊時(shí)(VaVd) (VbVc)ΔX為正。垂直偏差 ΔY (Va Vb) - (Vc Vd)。當(dāng)目標(biāo)在上邊時(shí)(VaVb) (VcVd)ΔY為正。這個(gè)公式的本質(zhì)是差分測(cè)量能有效抵消光源強(qiáng)度變化帶來(lái)的影響。即使光源變暗只要它偏離中心差值依然存在。3.2 執(zhí)行機(jī)構(gòu)云臺(tái)驅(qū)動(dòng)與選型云臺(tái)需要兩個(gè)自由度水平Pan和垂直Tilt。常用方案是舵機(jī)。舵機(jī)選型不要用廉價(jià)的9g塑料舵機(jī)它們扭矩小、齒輪易打滑、存在死區(qū)、精度差。我們選用的是數(shù)字金屬齒輪舵機(jī)如MG996R。雖然貴一點(diǎn)但扭矩大10kg/cm以上回中精度高響應(yīng)快。機(jī)械結(jié)構(gòu)自己用亞克力或鋁型材搭建云臺(tái)時(shí)重心和剛度是生命線。攝像頭或傳感器模塊必須牢固安裝整體重心盡量靠近兩個(gè)舵機(jī)的旋轉(zhuǎn)軸交匯處。否則舵機(jī)負(fù)載不均會(huì)產(chǎn)生抖動(dòng)甚至無(wú)法帶動(dòng)。我們用了3D打印了一個(gè)輕量化且結(jié)構(gòu)堅(jiān)固的支架并用螺絲嚴(yán)格固定。供電隔離舵機(jī)啟動(dòng)瞬間電流很大可達(dá)2A會(huì)在電源線上產(chǎn)生毛刺嚴(yán)重干擾敏感的模擬電路和單片機(jī)。必須將舵機(jī)電源和控制系統(tǒng)電源隔離我們的做法是一塊大容量鋰電池如2S/3S鋰電單獨(dú)給舵機(jī)供電。單片機(jī)、傳感器、運(yùn)放等由另一塊穩(wěn)壓后的電池或通過(guò)DC-DC模塊從總電源隔離出來(lái)。兩地之間僅共用信號(hào)線PWM。3.3 主控與電路板把一切連起來(lái)主控MCUSTM32F103C8T6藍(lán)橋杯板或STM32F407。性能完全足夠。F103的ADC和定時(shí)器做PID控制綽綽有余。關(guān)鍵是要熟悉其外設(shè)特別是定時(shí)器產(chǎn)生PWM驅(qū)動(dòng)舵機(jī)ADC多通道掃描采集傳感器信號(hào)以及串口與上位機(jī)通信。PCB還是洞洞板強(qiáng)烈建議繪制PCB四天時(shí)間看似緊張但用嘉立創(chuàng)等平臺(tái)打樣通常24-48小時(shí)就能拿到。洞洞板焊接模擬電路特別是多路運(yùn)放極易引入噪聲、產(chǎn)生虛焊調(diào)試起來(lái)是噩夢(mèng)。我們?cè)诘谝惶炀痛_定了原理圖當(dāng)晚就發(fā)出去打樣第三天早上拿到焊好整個(gè)系統(tǒng)的穩(wěn)定性有了質(zhì)的飛躍。這是時(shí)間投資回報(bào)極高。電源管理模擬部分運(yùn)放最好使用±5V或±12V供電以獲得更大動(dòng)態(tài)范圍數(shù)字部分3.3V。使用LDO如AMS1117-3.3或低噪聲DC-DC模塊。每個(gè)芯片的電源引腳附近都必須放置一個(gè)0.1uF和一個(gè)10uF的電容進(jìn)行去耦。4. 軟件算法的靈魂從數(shù)據(jù)到精準(zhǔn)控制硬件提供了干凈、快速的偏差信號(hào)(ΔX, ΔY)軟件的任務(wù)就是讓云臺(tái)動(dòng)起來(lái)讓這個(gè)偏差趨于零。4.1 核心控制算法PID的深入理解與整定我們采用了最經(jīng)典也最有效的位置式PID算法。公式大家都知道Output Kp * error Ki * integral Kd * derivative。但真正用好不容易。誤差Error的獲取這就是我們傳感器計(jì)算出的ΔX和ΔY。注意這里存在一個(gè)映射關(guān)系ΔX的電壓值對(duì)應(yīng)目標(biāo)在水平方向偏離了多少角度。我們需要通過(guò)實(shí)驗(yàn)標(biāo)定。例如讓目標(biāo)在云臺(tái)正前方左右緩慢移動(dòng)記錄下ΔX從正最大到負(fù)最大變化時(shí)目標(biāo)實(shí)際移動(dòng)的物理角度。從而建立一個(gè)電壓差 - 角度偏差的近似線性關(guān)系。這個(gè)關(guān)系系數(shù)會(huì)直接乘到Kp等參數(shù)上。積分項(xiàng)Integral的陷阱與抗飽和積分項(xiàng)能消除靜態(tài)誤差。但如果目標(biāo)快速運(yùn)動(dòng)或云臺(tái)暫時(shí)丟失目標(biāo)誤差一直很大積分項(xiàng)會(huì)累積到一個(gè)巨大的值積分飽和當(dāng)目標(biāo)再次出現(xiàn)時(shí)系統(tǒng)會(huì)產(chǎn)生嚴(yán)重的超調(diào)甚至震蕩。必須實(shí)現(xiàn)積分抗飽和。我們采用的方法當(dāng)輸出值達(dá)到硬件限幅如PWM占空比上限時(shí)就停止積分項(xiàng)的累積。或者更精細(xì)一點(diǎn)只累積那些與輸出方向相反的誤差。微分項(xiàng)Derivative與濾波微分項(xiàng)能預(yù)測(cè)變化趨勢(shì)提高響應(yīng)速度。但它對(duì)噪聲極度敏感傳感器信號(hào)哪怕有一點(diǎn)毛刺經(jīng)過(guò)微分也會(huì)被放大成尖峰。必須在軟件中對(duì)誤差進(jìn)行低通濾波后再計(jì)算微分或者使用“不完全微分”的PID變種。參數(shù)整定不是玄學(xué)是科學(xué)實(shí)驗(yàn)。先Kp 再Kd 最后Ki。這是黃金法則。將Ki和Kd設(shè)為0。逐漸增大Kp直到云臺(tái)開(kāi)始出現(xiàn)等幅振蕩臨界振蕩。記下此時(shí)的Kp為Ku振蕩周期為Tu。根據(jù)齊格勒-尼科爾斯Ziegler-Nichols經(jīng)驗(yàn)公式設(shè)置初始參數(shù)經(jīng)典PID: Kp 0.6 * Ku, Ki 2 * Kp / Tu, Kd Kp * Tu / 8。保守型我們采用的: Kp 0.33 * Ku, Ki 2 * Kp / Tu, Kd Kp * Tu / 3。在這個(gè)初始參數(shù)附近微調(diào)。觀察云臺(tái)跟蹤一個(gè)勻速運(yùn)動(dòng)目標(biāo)時(shí)的響應(yīng)曲線可以通過(guò)串口發(fā)送數(shù)據(jù)到電腦用Python matplotlib畫(huà)圖。理想狀態(tài)是快速響應(yīng)小幅超調(diào)迅速穩(wěn)定在誤差帶內(nèi)。4.2 程序架構(gòu)與多任務(wù)調(diào)度四天三夜寫(xiě)出的代碼不能是“面條代碼”。一個(gè)清晰的架構(gòu)能讓你在最后關(guān)頭修改功能時(shí)不至于牽一發(fā)而動(dòng)全身。時(shí)間片輪詢我們沒(méi)有用復(fù)雜的RTOS而是采用了簡(jiǎn)單可靠的時(shí)間片輪詢。在SysTick中斷1ms觸發(fā)一次中設(shè)置多個(gè)軟件定時(shí)器標(biāo)志位。// 示例代碼結(jié)構(gòu) volatile uint8_t flag_10ms 0, flag_20ms 0, flag_100ms 0; void SysTick_Handler(void) { static uint16_t tick 0; tick; if(tick % 10 0) flag_10ms 1; // 10ms任務(wù) if(tick % 20 0) flag_20ms 1; // 20ms任務(wù) if(tick % 100 0){ // 100ms任務(wù) flag_100ms 1; tick 0; } } int main(void) { // 初始化... while(1) { if(flag_10ms) { flag_10ms 0; Sensor_Read(); // 讀取傳感器數(shù)據(jù) (10ms) PID_Calculate(); // 計(jì)算PID輸出 (10ms) } if(flag_20ms) { flag_20ms 0; Servo_Update(); // 更新舵機(jī)PWM (20ms) } if(flag_100ms) { flag_100ms 0; UART_SendData(); // 向上位機(jī)發(fā)送數(shù)據(jù) (100ms) OLED_Display(); // 刷新顯示 (100ms) } // 其他非實(shí)時(shí)任務(wù)... } }10ms任務(wù)讀取ADC傳感器信號(hào)執(zhí)行PID計(jì)算。這是控制環(huán)的核心周期最短決定了系統(tǒng)帶寬。20ms任務(wù)更新舵機(jī)PWM信號(hào)。舵機(jī)的控制周期通常在20ms左右太快了沒(méi)必要。100ms任務(wù)刷新OLED顯示、向上位機(jī)發(fā)送調(diào)試數(shù)據(jù)。這些任務(wù)實(shí)時(shí)性要求不高。狀態(tài)機(jī)設(shè)計(jì)系統(tǒng)工作流程用狀態(tài)機(jī)來(lái)管理非常清晰。typedef enum { SYS_INIT, SCANNING, // 掃描目標(biāo) LOCKED, // 鎖定目標(biāo) TRACKING, // 跟蹤目標(biāo) LOST // 目標(biāo)丟失 } SysState_t;在while(1)主循環(huán)中根據(jù)當(dāng)前狀態(tài)執(zhí)行不同的函數(shù)并在滿足條件時(shí)進(jìn)行狀態(tài)轉(zhuǎn)移。例如在SCANNING狀態(tài)云臺(tái)勻速旋轉(zhuǎn)一旦傳感器信號(hào)超過(guò)閾值就轉(zhuǎn)入LOCKED狀態(tài)。5. 調(diào)試、測(cè)試與賽場(chǎng)實(shí)戰(zhàn)細(xì)節(jié)決定成敗系統(tǒng)搭起來(lái)能跑只是第一步如何讓它跑得穩(wěn)、跑得準(zhǔn)才是拿高分的關(guān)鍵。5.1 分模塊調(diào)試隔離問(wèn)題逐個(gè)擊破傳感器單獨(dú)測(cè)試用信號(hào)發(fā)生器產(chǎn)生一個(gè)1kHz的正弦波模擬光電二極管放大后的信號(hào)輸入到我們的濾波和檢波電路用示波器看輸出是否平滑的直流并且幅值隨輸入信號(hào)幅值線性變化。然后用手電筒最好也用1kHz調(diào)制在傳感器前移動(dòng)看輸出變化是否靈敏、連續(xù)。舵機(jī)單獨(dú)測(cè)試寫(xiě)一個(gè)簡(jiǎn)單的程序讓舵機(jī)在0°和180°之間往復(fù)運(yùn)動(dòng)觀察其運(yùn)動(dòng)是否平滑有無(wú)異響回中是否準(zhǔn)確。用手機(jī)慢動(dòng)作拍攝檢查是否有抖動(dòng)。PID開(kāi)環(huán)測(cè)試先將PID輸出斷開(kāi)手動(dòng)給一個(gè)階躍的“誤差”信號(hào)比如通過(guò)按鍵模擬用串口打印出此時(shí)PID計(jì)算出的輸出值觀察比例、積分、微分三項(xiàng)的變化是否符合理論預(yù)期。閉環(huán)聯(lián)調(diào)這是最激動(dòng)人心也最痛苦的階段。先讓目標(biāo)靜止調(diào)整Kp讓云臺(tái)能快速對(duì)準(zhǔn)并穩(wěn)定住沒(méi)有明顯抖動(dòng)。然后讓人手持目標(biāo)緩慢移動(dòng)觀察云臺(tái)跟隨是否平滑。這里一定要用上位機(jī)軟件如SerialPlot、自己用Python PyQt5寫(xiě)的實(shí)時(shí)繪制誤差曲線和輸出曲線眼睛看云臺(tái)動(dòng)作是感性的看曲線才是理性的分析依據(jù)。5.2 抗干擾與魯棒性提升軟件濾波除了硬件帶通濾波ADC采集后還要進(jìn)行軟件濾波。我們用了一階互補(bǔ)濾波來(lái)處理ΔX和ΔY信號(hào)平滑掉偶爾的尖峰。float filtered_value 0.9 * filtered_value 0.1 * raw_adc_value; // 一階低通目標(biāo)丟失處理在跟蹤過(guò)程中可能會(huì)因?yàn)槟繕?biāo)移動(dòng)太快、暫時(shí)被遮擋等原因?qū)е聜鞲衅餍盘?hào)消失四個(gè)通道電壓都很低。程序必須能檢測(cè)到這種情況LOST狀態(tài)并觸發(fā)一個(gè)重新搜索策略。我們的策略是記錄丟失前一刻的目標(biāo)運(yùn)動(dòng)方向讓云臺(tái)向那個(gè)方向加速旋轉(zhuǎn)一小段同時(shí)縮小搜索范圍。如果幾秒內(nèi)還沒(méi)找到再擴(kuò)大為全局掃描。這個(gè)策略讓我們?cè)跍y(cè)試中成功應(yīng)對(duì)了目標(biāo)的突然加速和短時(shí)遮擋。參數(shù)自適應(yīng)進(jìn)階玩法。我們嘗試了一個(gè)簡(jiǎn)單的方案根據(jù)誤差的大小動(dòng)態(tài)調(diào)整PID參數(shù)。當(dāng)誤差很大時(shí)目標(biāo)剛出現(xiàn)或丟失后重新找到使用一組更激進(jìn)的參數(shù)Kp大Kd小快速接近目標(biāo)當(dāng)誤差很小時(shí)使用一組更保守的參數(shù)Kp小Ki, Kd適當(dāng)精細(xì)調(diào)整避免震蕩。這有點(diǎn)像“模糊控制”的思想效果不錯(cuò)。5.3 賽場(chǎng)上的最后48小時(shí)封裝與測(cè)試清單作品封箱前列一個(gè)詳細(xì)的測(cè)試清單每項(xiàng)功能都讓隊(duì)友操作自己記錄結(jié)果。包括上電自檢、掃描鎖定時(shí)間、靜態(tài)對(duì)準(zhǔn)精度、勻速圓周跟蹤誤差、矩形軌跡拐角跟蹤性能、目標(biāo)丟失恢復(fù)時(shí)間等等。確保萬(wàn)無(wú)一失。備用方案我們準(zhǔn)備了兩套完全相同的傳感器模塊和一套備用舵機(jī)。主控程序燒錄在兩塊不同的核心板上。永遠(yuǎn)要有Plan B。心態(tài)調(diào)整最后一天核心代碼和參數(shù)就不要再做大改了只做微調(diào)。把時(shí)間花在整理報(bào)告、練習(xí)答辯、檢查機(jī)械結(jié)構(gòu)螺絲是否緊固、電池電量是否充足這些“瑣事”上。保持冷靜相信你們之前上百個(gè)小時(shí)的調(diào)試。6. 總結(jié)與延伸E題帶來(lái)的遠(yuǎn)不止一個(gè)獎(jiǎng)項(xiàng)回過(guò)頭看國(guó)賽E題就像是一個(gè)微縮的工程項(xiàng)目。它強(qiáng)迫你在極短時(shí)間內(nèi)完成從需求分析、方案論證、硬件設(shè)計(jì)、軟件編程、調(diào)試測(cè)試到最終交付的全流程。我們選擇的“光電陣列經(jīng)典PID”路線可能不是最炫酷的但卻是最扎實(shí)、最可靠的。它讓我們深刻理解了**“簡(jiǎn)單即是美”和“穩(wěn)定高于一切”**的工程哲學(xué)。比賽結(jié)束后我們?cè)谶@個(gè)系統(tǒng)上做了很多延伸。比如將傳感器換成了分辨率更高的PSD位置敏感探測(cè)器實(shí)現(xiàn)了亞毫米級(jí)的定位精度嘗試用MPU6050做云臺(tái)自身的姿態(tài)補(bǔ)償甚至把算法移植到了帶浮點(diǎn)單元的STM32F4上實(shí)現(xiàn)了更復(fù)雜的自適應(yīng)PID。這些都是在比賽核心框架上生長(zhǎng)出來(lái)的新技能。對(duì)于準(zhǔn)備參賽的朋友我的建議是盡早組隊(duì)明確分工硬件、軟件、機(jī)械、報(bào)告找一個(gè)往年的經(jīng)典賽題如2017年的“滾球控制系統(tǒng)”從頭到尾做一遍。在這個(gè)過(guò)程中你們會(huì)遇到本文提到的所有問(wèn)題并學(xué)會(huì)如何解決它們。當(dāng)你們真正比賽時(shí)就會(huì)發(fā)現(xiàn)題目雖然新穎但底層技術(shù)和解決問(wèn)題的方法論是相通的。最后分享一個(gè)讓我們?cè)跍y(cè)試階段省下大量時(shí)間的小工具一個(gè)用Python和PyQt5寫(xiě)的簡(jiǎn)易上位機(jī)。它通過(guò)串口接收單片機(jī)發(fā)來(lái)的數(shù)據(jù)實(shí)時(shí)誤差、PID輸出、舵機(jī)角度等并實(shí)時(shí)繪制成曲線圖。同時(shí)還能發(fā)送一些簡(jiǎn)單的指令如修改PID參數(shù)給下位機(jī)。這個(gè)工具讓我們擺脫了反復(fù)修改代碼、編譯、下載、觀察的循環(huán)調(diào)試效率提升了不止十倍。它的核心代碼并不復(fù)雜網(wǎng)上有很多教程強(qiáng)烈建議每一支隊(duì)伍都花點(diǎn)時(shí)間準(zhǔn)備一個(gè)。國(guó)賽之旅痛并快樂(lè)著。那些在實(shí)驗(yàn)室通宵調(diào)試、爭(zhēng)吵又和解、看到云臺(tái)終于平穩(wěn)跟蹤目標(biāo)時(shí)的歡呼都成為了我們大學(xué)生活中最寶貴的記憶和技術(shù)生涯最堅(jiān)實(shí)的起點(diǎn)。希望這篇長(zhǎng)文能為你點(diǎn)亮一點(diǎn)前行的光。祝你成功