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