與PID控制:從嵌入式系統(tǒng)到自動(dòng)駕駛的微型實(shí)踐)
簡介本資源是面向智能車競賽四輪組參賽者與嵌入式開發(fā)者的技術(shù)實(shí)踐包聚焦巡線控制、環(huán)島識(shí)別與十字路口決策三大核心賽題任務(wù)提供可直接調(diào)試的完整程序框架與工程實(shí)現(xiàn)。壓縮包共622個(gè)文件涵蓋58個(gè)C源碼含傳感器采集、PID控制、圖像識(shí)別等模塊、61個(gè)頭文件.h、180個(gè)目標(biāo)文件.o及52個(gè)鏈接腳本.xcl等關(guān)鍵類型支撐Kinetis系列MCU如MK60DN在IAR環(huán)境下編譯調(diào)試另有多個(gè).bat批處理腳本用于自動(dòng)化構(gòu)建與臨時(shí)文件清理體現(xiàn)工程化開發(fā)規(guī)范。資源大小為46.57MB結(jié)構(gòu)清晰、模塊解耦包含主控邏輯、多傳感器融合、深度學(xué)習(xí)輕量化識(shí)別接口等實(shí)戰(zhàn)要素。目前已有944人學(xué)習(xí)下載讀者可直接獲取從灰度閾值處理、環(huán)島CNN特征提取到十字路口多策略導(dǎo)航的全鏈路代碼實(shí)現(xiàn)并參考配套調(diào)試腳本與工程配置快速部署驗(yàn)證。1. 從零到一智能車競賽的“靈魂”是什么如果你最近在B站、知乎或者各大高校的實(shí)驗(yàn)室里聽到同學(xué)們討論“調(diào)車”、“PID”、“環(huán)島”、“電磁”這些詞那多半是又到了全國大學(xué)生智能車競賽的季節(jié)。這個(gè)比賽從2006年第一屆到現(xiàn)在已經(jīng)成了國內(nèi)高校電子、自動(dòng)化、計(jì)算機(jī)等相關(guān)專業(yè)學(xué)生繞不開的“硬核”練兵場。我當(dāng)年也是從實(shí)驗(yàn)室里抱著電路板、對(duì)著示波器、一遍遍在賽道上“撞墻”過來的?,F(xiàn)在回頭看所謂“SmartCar_智能車程序”絕不僅僅是讓一個(gè)小車跑起來那么簡單它是一套集成了感知、決策、控制、執(zhí)行于一體的微型自動(dòng)駕駛系統(tǒng)是算法與硬件的深度耦合更是工程思維從理論到落地的完整閉環(huán)。很多人拿到一個(gè)開源的程序框架或者學(xué)長留下的代碼第一反應(yīng)是“我該改哪里才能讓它跑得更快” 這個(gè)想法沒錯(cuò)但容易陷入盲目調(diào)參的泥潭。在我看來理解智能車程序的“靈魂”比盲目修改代碼更重要。這個(gè)靈魂就是在資源算力、內(nèi)存、傳感器精度極度受限的嵌入式平臺(tái)上如何實(shí)現(xiàn)穩(wěn)定、快速、魯棒的賽道循跡。它不像實(shí)驗(yàn)室里的機(jī)器人可以用工控機(jī)跑ROS也不像自動(dòng)駕駛汽車有強(qiáng)大的GPU和激光雷達(dá)。你的戰(zhàn)場是一塊主頻可能不到200MHz的單片機(jī)幾個(gè)廉價(jià)的攝像頭或電感幾條賽道邊線以及一個(gè)充滿變數(shù)的比賽環(huán)境。所有的算法設(shè)計(jì)、代碼優(yōu)化都必須圍繞這個(gè)核心矛盾展開。所以當(dāng)你開始動(dòng)手寫或修改你的“SmartCar_智能車程序”時(shí)首先要建立的認(rèn)知是這不是一個(gè)純粹的軟件問題也不是一個(gè)純粹的硬件問題而是一個(gè)軟硬協(xié)同的系統(tǒng)工程問題。程序里的每一個(gè)判斷、每一個(gè)參數(shù)都對(duì)應(yīng)著物理世界中小車的一個(gè)具體行為。理解了這一點(diǎn)我們才能深入這個(gè)程序的肌理看看它到底是如何運(yùn)作的。2. 程序架構(gòu)解剖一個(gè)典型智能車控制系統(tǒng)的三層模型一個(gè)成熟、可維護(hù)的智能車程序絕不會(huì)是幾千行代碼都堆在main.c里的“意大利面條”。經(jīng)過這么多屆比賽的迭代社區(qū)和參賽隊(duì)伍已經(jīng)形成了一些共識(shí)性的架構(gòu)。我最推崇也是實(shí)踐下來最有效的是一種三層模型感知層、決策層、控制層。這聽起來很像自動(dòng)駕駛的架構(gòu)沒錯(cuò)因?yàn)楸举|(zhì)是相通的只是規(guī)模微型化了。2.1 感知層小車的“眼睛”和“觸角”感知層的任務(wù)是把原始的傳感器數(shù)據(jù)轉(zhuǎn)換成程序能夠理解的、關(guān)于賽道和環(huán)境的狀態(tài)信息。對(duì)于智能車來說最主要的傳感器無外乎攝像頭和電磁傳感器。攝像頭方案這是目前主流尤其是追求極限速度的競速組別。程序在這里的核心工作是圖像處理。從攝像頭通常是數(shù)字?jǐn)z像頭如OV7725、MT9V034讀回來的是一幀灰度或二值化的圖像。感知層算法要干這幾件事圖像預(yù)處理濾波去噪中值濾波、均值濾波、對(duì)比度增強(qiáng)。這一步是為了讓后續(xù)的邊緣檢測更可靠。很多新手會(huì)忽略預(yù)處理直接拿原始圖像做二值化結(jié)果就是抗光照干擾能力極差下午和晚上的參數(shù)完全對(duì)不上。賽道邊線提取這是核心中的核心。常用方法有邊緣檢測如Sobel算子或直接動(dòng)態(tài)閾值二值化。我更傾向于動(dòng)態(tài)閾值因?yàn)樗?jì)算量小。關(guān)鍵技巧在于閾值不是固定的而是根據(jù)圖像每一行或一個(gè)區(qū)域的灰度統(tǒng)計(jì)值如平均值動(dòng)態(tài)計(jì)算。例如閾值 行平均灰度值 * 系數(shù)K 偏移量B。這個(gè)K和B就是你需要根據(jù)賽道背景和邊線顏色反復(fù)調(diào)試的“魔法數(shù)字”。中線生成提取到左右邊線后需要擬合出賽道的中心線作為小車?yán)硐氲男旭偮窂健3S梅椒ㄊ菕呙杈€法從圖像底部車頭近處向上逐行掃描找到每一行的左右邊線點(diǎn)然后取中點(diǎn)連起來就是一條由離散點(diǎn)組成的中心線。這里會(huì)遇到丟線的情況比如十字路口處理丟線的策略如補(bǔ)線、預(yù)測直接決定了小車過特殊元素的穩(wěn)定性。電磁方案多見于節(jié)能組或創(chuàng)意組。通過電感采集賽道中心通有100mA、20kHz交流電的導(dǎo)線產(chǎn)生的磁場信號(hào)。感知層的核心是信號(hào)處理與歸一化。幾個(gè)電感通常5-7個(gè)會(huì)返回一組電壓值。程序需要信號(hào)解調(diào)與放大硬件電路檢波、放大已經(jīng)完成了大部分工作單片機(jī)讀到的是直流電壓。歸一化處理這是關(guān)鍵電感的感應(yīng)電壓受高度、速度影響巨大。必須進(jìn)行動(dòng)態(tài)歸一化將當(dāng)前值映射到一個(gè)固定的范圍內(nèi)如0-100。常用方法是記錄每個(gè)電感一段時(shí)間內(nèi)的最大值和最小值用公式歸一化值 (當(dāng)前值 - 最小值) / (最大值 - 最小值) * 100。這個(gè)“一段時(shí)間”的窗口選擇很有講究太短容易受噪聲影響太長則響應(yīng)遲鈍。位置計(jì)算根據(jù)多個(gè)歸一化后的電感值通過加權(quán)平均或差值比和等算法計(jì)算出一個(gè)代表車體偏離賽道中心位置的誤差值。這個(gè)誤差值就是后續(xù)控制器的輸入。注意感知層輸出的應(yīng)該是一個(gè)干凈、抽象的“賽道信息”數(shù)據(jù)結(jié)構(gòu)比如中心線點(diǎn)集、當(dāng)前位置偏差、賽道類型直道、彎道、環(huán)島、十字等而不是把原始的圖像數(shù)組或ADC數(shù)值直接扔給決策層。這體現(xiàn)了模塊化設(shè)計(jì)的思想。2.2 決策層小車的“大腦”決策層接收感知層提供的賽道信息然后決定小車“現(xiàn)在該干什么”。對(duì)于基礎(chǔ)的循跡來說決策似乎很簡單“沿著中線走”。但在復(fù)雜賽道和追求性能時(shí)決策邏輯至關(guān)重要。路徑規(guī)劃并不是嚴(yán)格沿著感知到的中線走就是最快的。在彎道需要內(nèi)切吃內(nèi)道減少行駛距離。這就需要在原始中線的基礎(chǔ)上進(jìn)行路徑重規(guī)劃。一個(gè)簡單的策略是在入彎前讓目標(biāo)路徑點(diǎn)向彎道內(nèi)側(cè)偏移一個(gè)固定或動(dòng)態(tài)的距離。這個(gè)偏移量需要根據(jù)彎道曲率和車速來調(diào)整否則容易撞上內(nèi)環(huán)島或沖出賽道。特殊元素識(shí)別與策略這是區(qū)分高手和新手的關(guān)鍵。程序必須能識(shí)別出環(huán)島、十字、坡道、障礙等特殊元素并切換到對(duì)應(yīng)的處理策略。環(huán)島識(shí)別到連續(xù)彎道且邊線特征符合環(huán)島時(shí)需要決策是進(jìn)入環(huán)島、在環(huán)島內(nèi)行駛還是出環(huán)島。通常需要設(shè)置一個(gè)狀態(tài)機(jī)如NORMAL,IN_ISLAND,OUT_ISLAND在不同的狀態(tài)下使用不同的控制參數(shù)甚至不同的控制算法。十字路口攝像頭可能會(huì)短暫丟線決策層需要根據(jù)歷史路徑和當(dāng)前部分有效信息判斷是直行通過還是需要轉(zhuǎn)彎。電磁車則可能需要識(shí)別電流方向的變化。坡道需要提前識(shí)別并調(diào)整電機(jī)輸出防止沖坡時(shí)失速或飛坡后砸地。速度規(guī)劃直道全速彎道減速這是基本邏輯。但如何減速何時(shí)開始減速減到多少這就是速度規(guī)劃。一個(gè)簡單有效的方法是前瞻減速根據(jù)路徑的曲率可以通過計(jì)算中線點(diǎn)的方向角變化得到來動(dòng)態(tài)設(shè)定目標(biāo)速度。曲率越大目標(biāo)速度越低。同時(shí)要結(jié)合當(dāng)前車速做一個(gè)平滑的加速度限制避免急剎導(dǎo)致輪胎打滑或重心不穩(wěn)。決策層輸出的是兩個(gè)核心指令目標(biāo)路徑點(diǎn)或目標(biāo)橫向位置和目標(biāo)速度。它告訴控制層“請(qǐng)你用盡可能平滑的方式讓我到達(dá)那個(gè)位置并以那個(gè)速度行駛?!?.3 控制層小車的“手腳”控制層是最終將決策轉(zhuǎn)化為電機(jī)和舵機(jī)動(dòng)作的環(huán)節(jié)。這里主要涉及兩個(gè)經(jīng)典的控制回路方向控制舵機(jī)和速度控制電機(jī)。方向控制舵機(jī)PD控制 這是智能車程序里最經(jīng)典的部分。輸入是當(dāng)前位置與目標(biāo)位置的橫向偏差由感知層或決策層計(jì)算得到輸出是舵機(jī)的打角值。P比例控制偏差越大打角越大。反應(yīng)快但容易在目標(biāo)值附近振蕩永遠(yuǎn)停不下來。D微分控制根據(jù)偏差的變化率即偏差的微分來補(bǔ)償。它能預(yù)測偏差未來的趨勢抑制振蕩。比如車正在快速接近中線即使還有偏差D項(xiàng)可能已經(jīng)開始回正舵機(jī)了防止沖過頭。公式舵機(jī)PWM Kp * 偏差 Kd * (本次偏差 - 上次偏差)。調(diào)試心得先調(diào)P讓小車能大致跟著線走但會(huì)左右搖擺。然后慢慢加D搖擺會(huì)逐漸減弱變得平滑。D太大反而會(huì)引入高頻抖動(dòng)讓小車“抽搐”。一個(gè)黃金法則是在直道上微調(diào)讓小車走直線時(shí)舵機(jī)幾乎不動(dòng)在中等彎道上讓小車能平滑過彎沒有明顯超調(diào)沖出去再拉回來。速度控制電機(jī)PID控制 輸入是目標(biāo)速度與實(shí)際編碼器反饋速度的差值輸出是電機(jī)的PWM占空比。PI控制通常足夠P項(xiàng)快速響應(yīng)I項(xiàng)消除靜差比如上坡時(shí)光靠P項(xiàng)可能無法維持目標(biāo)速度I項(xiàng)會(huì)累積誤差增加輸出。公式電機(jī)PWM Kp * 速度差 Ki * 速度差積分。調(diào)試心得速度環(huán)要和方向環(huán)配合調(diào)試。直道加速要果斷彎道減速要提前且平滑。特別注意I項(xiàng)的積分限幅防止“積分飽和”。比如長時(shí)間低于目標(biāo)速度I項(xiàng)會(huì)累積一個(gè)很大的值一旦達(dá)到目標(biāo)這個(gè)巨大的I項(xiàng)輸出還會(huì)持續(xù)一段時(shí)間導(dǎo)致嚴(yán)重超速。解決辦法是給積分項(xiàng)設(shè)置一個(gè)上限值。3. 代碼實(shí)現(xiàn)的魔鬼細(xì)節(jié)讓程序既跑得快又穩(wěn)如狗理解了架構(gòu)我們落到具體的代碼實(shí)現(xiàn)上。這里充滿了“教科書上不會(huì)寫但比賽場上血淚換來的”細(xì)節(jié)。3.1 定時(shí)中斷一切節(jié)奏的指揮官智能車程序必須是實(shí)時(shí)的。你不能用while(1)加延時(shí)來循環(huán)那樣控制周期不穩(wěn)定PID控制會(huì)一團(tuán)糟。必須使用定時(shí)器中斷。設(shè)置一個(gè)核心定時(shí)器中斷比如1ms或2ms觸發(fā)一次。在這個(gè)中斷服務(wù)函數(shù)里執(zhí)行最核心的控制循環(huán)讀取傳感器、運(yùn)行感知算法、決策、計(jì)算PID、更新電機(jī)舵機(jī)PWM。確保中斷服務(wù)函數(shù)執(zhí)行時(shí)間遠(yuǎn)小于中斷周期。如果1ms中斷你的代碼要控制在800us以內(nèi)否則會(huì)發(fā)生中斷嵌套導(dǎo)致系統(tǒng)崩潰。這意味著你的圖像處理算法必須極度優(yōu)化或者將耗時(shí)的操作如圖像采集、復(fù)雜的圖像處理放到主循環(huán)或另一個(gè)低優(yōu)先級(jí)的中斷/任務(wù)中。使用狀態(tài)機(jī)管理非實(shí)時(shí)任務(wù)比如按鍵掃描、OLED顯示、藍(lán)牙調(diào)試數(shù)據(jù)發(fā)送。這些操作可以放在主循環(huán)里用標(biāo)志位和狀態(tài)機(jī)來管理避免阻塞。3.2 圖像處理的速度與激情對(duì)于攝像頭車圖像處理是最大的計(jì)算負(fù)擔(dān)。優(yōu)化是永恒的課題。降低分辨率OV7725可以輸出多種分辨率8060、160120足以用于循跡比320*240快好幾倍。ROI感興趣區(qū)域不要處理整幅圖像。只處理賽道可能出現(xiàn)的下半部分或者根據(jù)上一幀的賽道位置動(dòng)態(tài)劃定ROI。二值化硬件化一些高級(jí)的數(shù)字?jǐn)z像頭如MT9V034支持硬件二值化輸出單片機(jī)直接接收0/1的圖像數(shù)組省去了軟件二值化的巨大計(jì)算量。匯編與硬件加速對(duì)于最耗時(shí)的操作如行求和求平均可以嘗試用匯編語言重寫或者利用單片機(jī)自帶的DMA、硬件乘法器等外設(shè)。3.3 參數(shù)管理告別“魔法數(shù)字”程序里到處都是Kp, Ki, Kd, Threshold等參數(shù)。千萬不要把這些數(shù)字直接寫在代碼里。建立一個(gè)全局的參數(shù)結(jié)構(gòu)體把所有可調(diào)參數(shù)放在里面。通過上位機(jī)如藍(lán)牙、WiFi、串口實(shí)時(shí)調(diào)參這是必備技能在電腦上寫一個(gè)簡單的上位機(jī)軟件可以用PythonPyQt或C#通過無線模塊發(fā)送調(diào)整指令實(shí)時(shí)修改車上的參數(shù)并觀察效果。這比一次次修改代碼、下載、復(fù)位要高效一萬倍。參數(shù)存儲(chǔ)調(diào)好的參數(shù)可以保存在單片機(jī)的Flash或EEPROM中上電自動(dòng)讀取避免每次開機(jī)重新設(shè)置。3.4 調(diào)試信息輸出你的“透視眼”小車在跑你怎么知道它“想”什么靠猜是沒用的。必須建立豐富的調(diào)試信息輸出通道。最常用的是無線串口將關(guān)鍵數(shù)據(jù)如當(dāng)前偏差、舵機(jī)輸出、速度、賽道類型、電感值等打包成一個(gè)結(jié)構(gòu)體定期通過藍(lán)牙模塊如HC-05發(fā)送到電腦上位機(jī)。上位機(jī)可視化上位機(jī)不僅可以接收數(shù)據(jù)還可以繪制曲線如偏差曲線、速度曲線甚至實(shí)時(shí)顯示攝像頭圖像需要一定的帶寬和編碼。看著曲線調(diào)PID比盲調(diào)直觀太多。車載OLED屏顯示關(guān)鍵參數(shù)和狀態(tài)方便現(xiàn)場快速查看。4. 從實(shí)驗(yàn)室到賽場環(huán)境適應(yīng)性與穩(wěn)定性調(diào)校你的小車在實(shí)驗(yàn)室的賽道上跑得飛快一到比賽現(xiàn)場就各種“趴窩”這是最常見的問題。程序的魯棒性抗干擾能力必須在設(shè)計(jì)之初就考慮。4.1 光照適應(yīng)性攝像頭車的噩夢比賽場館的光線千變?nèi)f化有窗戶自然光、頂棚燈光甚至可能有其他隊(duì)伍的補(bǔ)光燈干擾。動(dòng)態(tài)閾值是基礎(chǔ)如前所述絕對(duì)不能使用固定閾值。自動(dòng)曝光/自動(dòng)增益控制如果攝像頭支持如OV7725開啟AEC/AGC讓攝像頭硬件自動(dòng)適應(yīng)環(huán)境亮度。補(bǔ)光自己帶一個(gè)均勻的LED燈條為攝像頭創(chuàng)造一個(gè)穩(wěn)定的光照小環(huán)境。這是最有效、最物理的方法。圖像預(yù)處理加強(qiáng)采用更魯棒的濾波算法或進(jìn)行灰度拉伸增強(qiáng)圖像對(duì)比度。4.2 機(jī)械與電氣的耦合影響程序不是運(yùn)行在真空里。機(jī)械結(jié)構(gòu)和電氣噪聲會(huì)直接影響控制效果。舵機(jī)安裝與中值舵機(jī)安裝的物理中值車輪擺正時(shí)對(duì)應(yīng)的PWM值必須精確校準(zhǔn)。并且這個(gè)中值可能會(huì)隨著電池電壓變化而漂移可以在程序初始化時(shí)讓舵機(jī)自檢找到機(jī)械中值。電池電壓掉電電機(jī)全力加速時(shí)電池電壓會(huì)被拉低可能導(dǎo)致單片機(jī)復(fù)位或傳感器供電不穩(wěn)。必須在電源設(shè)計(jì)上做好濾波和穩(wěn)壓程序里也可以監(jiān)測電池電壓低壓時(shí)限制電機(jī)輸出。電機(jī)干擾電機(jī)產(chǎn)生的電磁噪聲可能干擾電磁傳感器的信號(hào)或單片機(jī)的ADC采集。做好電源隔離、信號(hào)線屏蔽軟件上對(duì)ADC采樣值進(jìn)行數(shù)字濾波如滑動(dòng)平均濾波。4.3 比賽策略與程序模式比賽不是一次跑完就結(jié)束有試車時(shí)間、正式比賽多次機(jī)會(huì)。設(shè)計(jì)多種運(yùn)行模式通過撥碼開關(guān)或藍(lán)牙指令切換。例如模式1正常競速模式2慢速巡線用于觀察路徑模式3參數(shù)調(diào)試模式4特殊元素專項(xiàng)測試。發(fā)車穩(wěn)定性很多車倒在起跑線上。程序需要檢測起跑線通常是特定的黑白格或磁場變化并在此穩(wěn)定等待幾秒防止誤觸發(fā)。發(fā)車瞬間的電機(jī)啟動(dòng)要平滑避免車輪打滑。容錯(cuò)與恢復(fù)程序要有一定的“自救”能力。比如長時(shí)間檢測不到賽道可能沖出賽道應(yīng)該讓小車緩慢減速并停車或者原地緩慢旋轉(zhuǎn)重新尋線而不是瘋狂打轉(zhuǎn)。5. 進(jìn)階思考超越基礎(chǔ)循跡當(dāng)你解決了基礎(chǔ)循跡和穩(wěn)定性問題后可以思考一些更進(jìn)階的方向這些往往是在激烈競爭中脫穎而出的關(guān)鍵。5.1 更優(yōu)的控制算法除了經(jīng)典的PID可以嘗試模糊PID將PID參數(shù)根據(jù)偏差和偏差變化率的大小進(jìn)行模糊化調(diào)整在直道和彎道使用不同的控制力度可能獲得更平滑的響應(yīng)。純追蹤算法這不是用于舵機(jī)控制而是用于速度規(guī)劃。想象小車前方有一個(gè)“預(yù)瞄點(diǎn)”控制目標(biāo)是讓車在某個(gè)時(shí)間后到達(dá)該點(diǎn)。這更符合人類的駕駛習(xí)慣能實(shí)現(xiàn)更平滑的彎道速度控制。模型預(yù)測控制建立小車的運(yùn)動(dòng)學(xué)模型預(yù)測未來幾步的狀態(tài)并優(yōu)化控制序列。這是更高級(jí)的方法對(duì)算力要求高但在理論上是更優(yōu)解。5.2 傳感器融合單一傳感器有局限融合是趨勢。攝像頭編碼器編碼器提供精確的里程計(jì)信息可以與視覺估計(jì)的位置進(jìn)行融合如卡爾曼濾波提高位置估計(jì)的精度和魯棒性尤其在圖像短暫失效時(shí)。攝像頭慣性測量單元IMU可以提供角速度和加速度信息幫助判斷小車是否打滑、側(cè)滑用于補(bǔ)償控制或進(jìn)行更精確的姿態(tài)估計(jì)。5.3 系統(tǒng)辨識(shí)與自動(dòng)調(diào)參手動(dòng)調(diào)參費(fèi)時(shí)費(fèi)力且未必是最優(yōu)??梢試L試記錄數(shù)據(jù)離線分析在賽道上跑一圈記錄下所有的傳感器數(shù)據(jù)和控制量。在電腦上用MATLAB或Python分析看看在哪些地方控制響應(yīng)不足或過沖針對(duì)性調(diào)整參數(shù)。簡單的自動(dòng)調(diào)參腳本寫一個(gè)腳本通過上位機(jī)自動(dòng)修改參數(shù)、發(fā)車、記錄單圈時(shí)間用一些優(yōu)化算法如爬山法尋找更優(yōu)的參數(shù)組合。雖然比賽規(guī)則通常禁止全自動(dòng)但在備賽階段用于尋找初始優(yōu)參非常有效。寫一個(gè)能跑的智能車程序不難但寫一個(gè)能在各種惡劣環(huán)境下穩(wěn)定、快速完成比賽的智能車程序需要你在每一個(gè)環(huán)節(jié)都深思熟慮反復(fù)打磨。它考驗(yàn)的不僅是編程能力更是對(duì)控制系統(tǒng)理論的深入理解、對(duì)硬件特性的把握、以及解決實(shí)際工程問題的系統(tǒng)思維。這個(gè)過程極其痛苦但也充滿樂趣。當(dāng)你看到自己親手打造的小車沿著賽道風(fēng)馳電掣精準(zhǔn)地劃過每一個(gè)彎道時(shí)那種成就感是無與倫比的。這行代碼調(diào)的這個(gè)參數(shù)就是你和你的小車之間最直接的對(duì)話。本文還有配套的精品資源點(diǎn)擊獲取