
這半個(gè)月我身邊不止一個(gè)準(zhǔn)備智能車競賽的團(tuán)隊(duì)都在傳一段“走馬觀碑”車模運(yùn)行視頻。視頻不長畫面也不復(fù)雜車模在場地里沿路徑跑了一段轉(zhuǎn)向有動(dòng)作速度不算快唯一顯眼的是標(biāo)題最后那行字未加入視覺。如果猜得沒錯(cuò)很多人看到的第一反應(yīng)是沒視覺那這個(gè)視頻有什么可看的其實(shí)對一個(gè)準(zhǔn)備參加第21屆全國大學(xué)生智能汽車競賽、目標(biāo)還是視覺相關(guān)組別的隊(duì)伍來說這個(gè)視頻恰恰是整個(gè)工程里最值得留著的一份記錄。我的判斷是還沒接入視覺不等于車模狀態(tài)“不完整”。相反它是從純控制階段進(jìn)入多傳感器融合階段之前必須留下的一條基線。很多團(tuán)隊(duì)起步時(shí)急著往車模上堆攝像頭、跑模型結(jié)果車輛本身的轉(zhuǎn)向特性和速度閉環(huán)都沒穩(wěn)住最后出了問題也分不清是視覺模塊的問題還是底層控制的問題。先讓車模在沒有視覺的情況下跑出可復(fù)現(xiàn)、可評價(jià)、可檢查的結(jié)果再考慮視覺接入才是真正省時(shí)間的順序。1. 先確認(rèn)一下這段視頻到底證明了什么“未加入視覺”的視頻最容易給觀眾一種錯(cuò)覺車模能跑但還差一個(gè)功能模塊。這個(gè)理解不能說錯(cuò)但它把問題看小了。一個(gè)沒有視覺模塊參與的運(yùn)行視頻真正證明的并不是“少了一塊功能”而是“底層運(yùn)動(dòng)系統(tǒng)已經(jīng)具備被后續(xù)功能依賴的基礎(chǔ)”。1.1 視頻里的“能跑”到底跑通了哪幾層從智能車工程鏈路看車模能穩(wěn)定運(yùn)行至少要求三層成立第一層是執(zhí)行層。電機(jī)驅(qū)動(dòng)、舵機(jī)轉(zhuǎn)向、編碼器反饋、電池供電和電機(jī)驅(qū)動(dòng)模塊之間的電氣連接必須正確。很多新手覺得這層簡單實(shí)際上問題最多的是供電不穩(wěn)定和信號線受干擾。視頻里車模如果直道不抖動(dòng)、轉(zhuǎn)向不發(fā)生異響至少說明執(zhí)行層沒有嚴(yán)重的電氣缺陷。第二層是控制層。車模運(yùn)行需要速度閉環(huán)和方向控制。所謂閉環(huán)不是“給它一個(gè)PWM讓它走”而是根據(jù)實(shí)際速度和實(shí)際位置持續(xù)修正輸出。沒有視覺靠的是編碼器和慣性傳感器這層跑穩(wěn)定了才說明控制器的基礎(chǔ)參數(shù)基本合理。第三層是邏輯層。車模的狀態(tài)機(jī)、啟停策略、計(jì)時(shí)策略、串口輸出和日志記錄這些代碼在視頻里是看不見的但它們直接決定了車模的行為是否符合預(yù)期。一段運(yùn)行視頻能夠順利錄完本身就說明程序沒有在中途崩潰、超時(shí)或卡死。所以這段視頻證明了車模在三層鏈路里已經(jīng)打通了一個(gè)最小閉環(huán)。別小看這個(gè)閉環(huán)后續(xù)任何視覺模塊都只是在這個(gè)閉環(huán)之上增加“外部感知”而不是替換掉它。1.2 為什么視覺不能反過來決定車?;A(chǔ)性能很多團(tuán)隊(duì)在準(zhǔn)備視覺組時(shí)會下意識地認(rèn)為視覺才是核心競爭力底層控制隨便調(diào)一調(diào)就行。這是一個(gè)非常容易踩的坑。視覺模塊的輸入是圖像輸出是目標(biāo)位置、角度或者路徑偏差而最終執(zhí)行這些指令的依然是電機(jī)和舵機(jī)。如果車模本身的轉(zhuǎn)向響應(yīng)延遲、速度波動(dòng)大那么視覺給出來的偏差再準(zhǔn)車模依然跑不出穩(wěn)定的軌跡。視覺系統(tǒng)可以告訴你“應(yīng)該往左修正2厘米”但底層控制器如果響應(yīng)有80毫秒延遲這個(gè)修正指令到達(dá)執(zhí)行層時(shí)車模已經(jīng)駛過了目標(biāo)點(diǎn)。反過來一段無視覺的車模視頻如果能夠穩(wěn)定重復(fù)等于提前把“執(zhí)行”和“控制”兩個(gè)變量控制住了。后面接入視覺時(shí)一旦出現(xiàn)軌跡抖動(dòng)就可以大概率懷疑是感知或者視覺處理環(huán)節(jié)的問題而不是整車到處都可能有毛病。實(shí)際操作里我建議把無視覺運(yùn)行視頻作為視覺接入前的回歸測試基準(zhǔn)。以后每改一次視覺代碼都必須拍一段同樣路徑、同樣速度下的運(yùn)行視頻做對比。只要底層軌跡變形了先檢查視覺管線再檢查車輛機(jī)械和控制。2. 還沒接視覺之前控制系統(tǒng)應(yīng)該先守住幾條邊界視頻看起來是車模在跑但真正需要關(guān)心的不是畫面本身而是畫面里那些容易被忽略的“邊界條件”。沒有視覺階段恰恰是檢查這些邊界最干凈的窗口期。2.1 速度閉環(huán)和轉(zhuǎn)向響應(yīng)不能只看跑起來我見過不少團(tuán)隊(duì)車模能跑就急著調(diào)視覺結(jié)果連速度反饋的穩(wěn)定區(qū)間都沒標(biāo)定過。車模在0.5米/秒和1.5米/秒兩種工況下PWM和編碼器之間的關(guān)系完全不同。如果沒有視覺之前就把速度環(huán)調(diào)到“給目標(biāo)速度能穩(wěn)定收斂”的程度后面一旦視覺需要急?;虻退龠^彎車模就會開始振蕩。在無視覺階段至少要確認(rèn)下邊幾項(xiàng)電機(jī)PWM上限和下限。油門給到多少會原地抖動(dòng)給到多少會飽和。速度閉環(huán)在低、中、高三檔下的超調(diào)量。目標(biāo)速度從1.2米/秒降到0.6米/秒時(shí)會不會沖出目標(biāo)再折返。舵機(jī)中位和中位附近的死區(qū)。視覺給到角度偏差后舵機(jī)是否有最小響應(yīng)延遲。電池電壓下降后的表現(xiàn)。滿電和低電時(shí)同樣的PWM是否還能維持同樣的速度。這些數(shù)據(jù)不一定都體現(xiàn)在視頻里但視頻是驗(yàn)證這些數(shù)據(jù)是否可信的第一手資料。如果拍完視頻回放時(shí)聽出電機(jī)在高頻抖動(dòng)那就說明電流或者PWM占空比大概率沒到穩(wěn)定的工作點(diǎn)。2.2 底層參數(shù)先固化再談感知融合“底層參數(shù)固化”的意思是在沒有視覺階段就定好一套相對穩(wěn)定的參數(shù)組合之后不能因?yàn)橐曈X識別不準(zhǔn)就隨便改底層PID。原因很簡單底層參數(shù)是多個(gè)變量共同作用的結(jié)果視覺是另外一個(gè)變量。兩個(gè)變量同時(shí)抖動(dòng)的時(shí)候你根本無法定位問題。我建議在無視覺階段把下面幾個(gè)參數(shù)記錄下來作為團(tuán)隊(duì)的參數(shù)基線目標(biāo)速度與PWM的映射表。正常電量下不同目標(biāo)速度對應(yīng)的穩(wěn)定電流范圍。舵機(jī)從物理中位到最大左轉(zhuǎn)和最大右轉(zhuǎn)的響應(yīng)時(shí)間。車模從啟動(dòng)指令到穩(wěn)定達(dá)到目標(biāo)速度所需的時(shí)間。在固定路徑上跑完一圈的總耗時(shí)和分段耗時(shí)。這些參數(shù)記錄下來之后后續(xù)接入視覺時(shí)只要某個(gè)指標(biāo)明顯偏離基線就可以快速判斷是視覺引入的問題還是底層硬件狀態(tài)發(fā)生了變化。3. 視覺不是裝上去就能用它需要先跟硬件解耦很多人以為視覺模塊就是一個(gè)攝像頭加一個(gè)識別模型接上線就能給車模輸出角度。真實(shí)情況是視覺模塊從一開始就要面對取圖幀率、分辨率、曝光時(shí)間、圖像傳輸延遲、識別模型計(jì)算耗時(shí)、輸出結(jié)果的外推和濾波等一整套問題。在沒有視覺的階段先把視覺模塊和車??刂啤敖怦睢笔亲尯罄m(xù)工作不那么混亂的前置條件。3.1 先把視覺跑在“離線輸入”上一個(gè)便于落地的做法是視覺程序先不連車模只處理提前錄好的圖像或者視頻流。把攝像頭架在場地邊采集幾段真實(shí)光照和賽道條件下的圖像標(biāo)注好目標(biāo)元素然后讓視覺程序跑離線識別。這樣可以確定一個(gè)最關(guān)鍵的問題當(dāng)前算法在真實(shí)畫面上到底能不能穩(wěn)定識別出目標(biāo)。很多團(tuán)隊(duì)會把視覺識別代碼直接放到車模上聯(lián)調(diào)結(jié)果發(fā)現(xiàn)畫面模糊、反光嚴(yán)重、目標(biāo)太小一套問題堆在一起。如果先離線跑就能先排除算力和實(shí)時(shí)性對結(jié)果的干擾只看模型和圖像處理本身是否成立。這一步做完后再把視覺輸出打印到串口或者日志里手動(dòng)對比預(yù)測結(jié)果和實(shí)際目標(biāo)位置的誤差。等離線精度達(dá)到可接受范圍再轉(zhuǎn)到車模上進(jìn)行實(shí)時(shí)測試。這個(gè)順序能節(jié)省大量聯(lián)調(diào)時(shí)間。3.2 圖像幀率低、處理慢經(jīng)常不是算力問題“視覺取圖幀率低”“網(wǎng)口設(shè)置”“識別慢”這些是智能車視覺團(tuán)隊(duì)里的高頻問題。但實(shí)際排查時(shí)很大一部分原因是攝像頭配置、傳輸帶寬和等待邏輯不對。在無視覺階段車模主控和攝像頭之間的數(shù)據(jù)通路往往沒有建立這時(shí)候最好先把一條“虛擬視覺通路”跑通。也就是說即使攝像頭還沒參與實(shí)際控制也要在程序里預(yù)留一個(gè)圖像輸入接口用一個(gè)固定測試圖像每隔固定周期喂給感知模塊驗(yàn)證每個(gè)環(huán)節(jié)的時(shí)間戳和輸出延遲。它不替代真實(shí)攝像頭但能提前確認(rèn)數(shù)據(jù)流、計(jì)算耗時(shí)和輸出接口是否順暢。等到真實(shí)攝像頭接入時(shí)需要重點(diǎn)確認(rèn)的就不是“算法好不好用”而是“每一幀圖像到底經(jīng)過了哪些環(huán)節(jié)消耗了多少時(shí)間”。如果每一幀從采集到輸出平均值已經(jīng)超過控制周期那再好的識別模型都難以穩(wěn)定控制車模軌跡。4. 一塊“未加入視覺”的車模視頻應(yīng)該怎么拍、怎么看車模運(yùn)行視頻不是單純記錄過程它其實(shí)是工程判斷的重要素材。拍得好回放時(shí)能看出很多參數(shù)問題拍得隨意最后只能作為紀(jì)念不能用來調(diào)試。4.1 拍攝條件要固定才有對比價(jià)值視覺接入前后的對比視頻必須保證拍攝條件一致。我在實(shí)踐中一般會這么做固定場地地圖包括路徑形狀、標(biāo)志物、邊界線。固定出發(fā)位置和解說方向標(biāo)注拍攝時(shí)間。盡量使用固定機(jī)位從車模正上方或斜上方高機(jī)位拍攝。同一次對比測試?yán)锉3止庹諚l件基本一致避免中午強(qiáng)光和傍晚陰影造成誤判。視頻里要有計(jì)時(shí)參考建議直接在場地里放一塊帶秒數(shù)的電子表方便逐幀回放。這些細(xì)節(jié)看似與視覺無關(guān)但視覺接入后如果要判斷“是識別不穩(wěn)定還是控制不穩(wěn)定”就必須有同樣的拍攝基準(zhǔn)來對照。4.2 回放時(shí)重點(diǎn)看四個(gè)特征每次拍完視頻不要只看“有沒有沖出跑道”可以按下面幾個(gè)特征去觀察直道上的橫向擺動(dòng)。如果車模在直道出現(xiàn)周期性蛇形運(yùn)動(dòng)往往是速度環(huán)和方向環(huán)的耦合沒有調(diào)好。入彎前的減速點(diǎn)。視覺介入前車模應(yīng)該根據(jù)路徑判斷提前減速。如果它總是在彎心里突然打舵說明路徑規(guī)劃或轉(zhuǎn)向響應(yīng)不夠平滑。出彎后的恢復(fù)時(shí)長。視覺車模如果沒有提前規(guī)劃好出彎路徑出彎后會在直道上走斜線而不是沿切線拉直。車輪是否出現(xiàn)間歇性打滑。這一點(diǎn)視頻里可能不明顯但聽聲音可以發(fā)現(xiàn)。如果電機(jī)在彎道中有斷續(xù)嘯叫一般說明轉(zhuǎn)向負(fù)載超過輪胎抓地力。這些觀察結(jié)果在接入視覺之后要反復(fù)對照因?yàn)橐曈X只是改變了“決策依據(jù)”沒有改變底層執(zhí)行物理特性。一個(gè)小提醒回放視頻時(shí)不要用手機(jī)自帶的默認(rèn)倍速直接看建議用0.5倍速逐幀拖動(dòng)尤其觀察車輪和舵機(jī)的相對時(shí)機(jī)。很多問題只在低倍速下才看得出來。5. 從無視覺到有視覺我建議按四步走為了讓“未加入視覺”的狀態(tài)轉(zhuǎn)換成“視覺穩(wěn)定接管”的狀態(tài)而不至于推倒重來我總結(jié)了一個(gè)相對穩(wěn)妥的四步推進(jìn)順序。5.1 第一步先把底層的固定參考標(biāo)記做好接入視覺之前先在場地里規(guī)劃好參考點(diǎn)。比如賽道邊界、起點(diǎn)線、特殊元素位置這些參考不做成視覺依賴而是作為物理坐標(biāo)基準(zhǔn)。車模在沒有視覺時(shí)就可以根據(jù)這些基準(zhǔn)點(diǎn)記錄自己的運(yùn)動(dòng)軌跡方便后續(xù)用視覺識別結(jié)果和物理基準(zhǔn)對照。這一步的核心目的是讓視覺結(jié)果有一個(gè)“真值”可以去比較。沒有真值的視覺只看著像識別準(zhǔn)了實(shí)際誤差分布完全未知。5.2 第二步離線驗(yàn)證視覺識別鏈路把攝像頭接到電腦或工控機(jī)上跑一段固定路徑的圖像生成識別結(jié)果曲線再和真實(shí)路徑對比。重點(diǎn)檢查三件事識別準(zhǔn)確率、識別延遲、異常幀出現(xiàn)頻率。這個(gè)階段不要追求極限速度先保證結(jié)果穩(wěn)定可復(fù)現(xiàn)。如果這一步發(fā)現(xiàn)識別結(jié)果有時(shí)提前、有時(shí)滯后不要直接調(diào)模型先確認(rèn)時(shí)間戳是否統(tǒng)一。視覺程序里常見的一個(gè)隱患是圖像獲取時(shí)間和控制指令時(shí)間不在同一個(gè)時(shí)間基準(zhǔn)下導(dǎo)致車模以為看到的是當(dāng)前畫面實(shí)際上讀到的是幾十毫秒前的舊幀。5.3 第三步視覺結(jié)果先用于提示不直接參與控制別急著讓視覺輸出直接驅(qū)動(dòng)舵機(jī)和電機(jī)。建議先把視覺結(jié)果輸出為“提示信號”比如只在屏幕上畫一個(gè)目標(biāo)框然后讓車模繼續(xù)按原有路徑運(yùn)行。人站在旁邊觀察比較視覺提示和真實(shí)位置是否一致。這一步很容易被大家跳過但它能發(fā)現(xiàn)很多隱蔽問題視覺識別結(jié)果是否抖動(dòng)、幀數(shù)是否連續(xù)、輸出值是否滿足控制輸入的范圍。這些問題如果不提前暴露等到視覺參與控制就會表現(xiàn)為車模忽左忽右但你在畫面里又看不出是識別誤差還是控制誤差。5.4 第四步用安全系數(shù)建立視覺參與控制的邊界開始讓視覺參與控制時(shí)先設(shè)一個(gè)安全范圍。比如視覺輸出值如果超出合理區(qū)間就切換到底層預(yù)設(shè)路徑或者強(qiáng)制降速。這個(gè)機(jī)制叫保護(hù)性接管是視覺車模進(jìn)入穩(wěn)定階段前的必要保險(xiǎn)。我通常會在代碼里加一個(gè)條件判斷視覺連續(xù)N幀輸出異常時(shí)車模自動(dòng)回到低速直行狀態(tài)同時(shí)記錄日志。因?yàn)橐曈X識別在真實(shí)環(huán)境中一定會遇到遮攔、反光、目標(biāo)短暫消失等場景如果沒有保護(hù)機(jī)制任何一次丟幀都可能讓車模直接沖出場地。6. 在21屆準(zhǔn)備階段哪些取舍最容易被忽略關(guān)于第21屆全國大學(xué)生智能汽車競賽的準(zhǔn)備爭議最大的一點(diǎn)通常是“要不要一開始就上視覺”。我的看法是如果你是視覺相關(guān)組別的隊(duì)伍盡早接觸視覺管線是對的但不要以犧牲車輛基礎(chǔ)控制為代價(jià)。無視覺階段不是逃避視覺而是為了讓視覺有更健康的運(yùn)行平臺。6.1 別把大量時(shí)間花在調(diào)模型上先搞定工程鏈路很多隊(duì)伍的視覺計(jì)劃只有模型訓(xùn)練和推理這一步。但實(shí)際工程鏈路是圖像采集、圖像預(yù)處理、目標(biāo)檢測、坐標(biāo)系轉(zhuǎn)換、目標(biāo)跟蹤、結(jié)果平滑、控制指令生成、執(zhí)行反饋。這中間任何一環(huán)斷了視覺都跑不起來。在沒有視覺的階段重點(diǎn)要把這條鏈路的骨架提前預(yù)留出來。比如圖像采集接口、數(shù)據(jù)可視化界面、日志系統(tǒng)、異常處理機(jī)制這些和具體模型無關(guān)但它們會決定視覺接入的順利程度。先把這些工程骨架搭好后續(xù)慢慢替換模型和技術(shù)細(xì)節(jié)時(shí)整體風(fēng)險(xiǎn)會小很多。6.2 記錄“未加入視覺”的基線是為了以后能回退我見過太多隊(duì)伍陷入一種狀態(tài)今天改了視覺參數(shù)車模跑得還行明天改了一個(gè)模型結(jié)構(gòu)車模開始沖出去再往后改了一版底層PID結(jié)果視覺反而失靈但誰也不知道是哪一步引入的問題。如果無視覺階段保留了清晰的基線視頻和參數(shù)記錄這種情況就能得到控制。每次只改一個(gè)變量改完跑一次無視覺對比測試再跑一次帶視覺的測試對比差異。嚴(yán)格按這個(gè)流程走看起來慢實(shí)際上才是最快的問題定位方法。6.3 視頻不只是給評委看的更是給團(tuán)隊(duì)看的智能車競賽的作品展示視頻、運(yùn)行視頻確實(shí)有外部展示的意義但視頻更大的價(jià)值在內(nèi)部。它記錄的是團(tuán)隊(duì)調(diào)試過程中每一次有效變化也是一份低成本的狀態(tài)快照。等到比賽前一周誰還能記得三周前電機(jī)的響應(yīng)參數(shù)是什么樣把視頻和日志按日期整理好就能更快找到回歸。我建議每支隊(duì)伍在無視覺階段就養(yǎng)成三條記錄習(xí)慣每次調(diào)參后拍一段固定路徑的運(yùn)行視頻。視頻文件名里帶上日期、版本、目標(biāo)速度、是否帶視覺。把視頻和參數(shù)表、串口日志放在同一個(gè)目錄下統(tǒng)一命名。用不了多少存儲空間卻能讓整個(gè)調(diào)試過程變得可追溯、可復(fù)盤、可交接?;氐阶畛跄嵌巍拔醇尤胍曈X”的走馬觀碑視頻。它最打動(dòng)我的地方不是車模跑得多快而是團(tuán)隊(duì)愿意承認(rèn)當(dāng)前階段的狀態(tài)并且用視頻把狀態(tài)釘在時(shí)間軸上。這一步意味著他們已經(jīng)理解了智能車工程的切入點(diǎn)先穩(wěn)定再感知再?zèng)Q策再優(yōu)化。視覺不是一段被插進(jìn)代碼庫的魔術(shù)而是整個(gè)鏈條上的一環(huán)。先跑通無視覺的基線版本視覺接進(jìn)來才不會變成一場碰運(yùn)氣的聯(lián)調(diào)。希望你們在21屆的備戰(zhàn)路上也給自己留一條“未加入視覺”的基線它會比你想象的更有用。