動(dòng)學(xué)解算與PID閉環(huán)控制實(shí)戰(zhàn)指南)
麥克納姆輪底盤在機(jī)器人圈子里已經(jīng)不是什么新鮮東西了但真正能把“跑得直、轉(zhuǎn)得穩(wěn)、橫移不飄”做到位的人其實(shí)不多。問題通常出在兩個(gè)環(huán)節(jié)一是運(yùn)動(dòng)學(xué)解算沒吃透四個(gè)輪子的速度分配全靠感覺二是電機(jī)閉環(huán)沒調(diào)好轉(zhuǎn)速指令下去了實(shí)際輪子根本沒跟上。如果你是做機(jī)器人競賽、AGV小車或者服務(wù)機(jī)器人底盤的這篇文章正好能幫你把這兩個(gè)核心問題一次性理清楚。全文不繞彎子直接講運(yùn)動(dòng)學(xué)公式推導(dǎo)、代碼實(shí)現(xiàn)、硬件搭法和PID調(diào)參的實(shí)戰(zhàn)經(jīng)驗(yàn)。先說清楚這篇內(nèi)容能解決什么當(dāng)你給底盤一個(gè)速度指令時(shí)四個(gè)麥克納姆輪各自該轉(zhuǎn)多快這是運(yùn)動(dòng)學(xué)解算的事當(dāng)你發(fā)出轉(zhuǎn)速指令后電機(jī)是否真的轉(zhuǎn)到了目標(biāo)轉(zhuǎn)速這是PID閉環(huán)控制的事。兩件事連起來就是一套完整的底盤運(yùn)動(dòng)控制方案。以下是基于我多次實(shí)際調(diào)底盤的經(jīng)驗(yàn)整理出來的完整流程適合有單片機(jī)基礎(chǔ)、正在做移動(dòng)機(jī)器人底盤的開發(fā)者參考。1. 麥克納姆輪底盤運(yùn)動(dòng)解算的基礎(chǔ)認(rèn)知1.1 麥輪為什么能“橫著走”麥克納姆輪和普通輪子最大的區(qū)別在于輪轂周圍斜向安裝了一圈無動(dòng)力的小輥?zhàn)?。這些輥?zhàn)优c輪子主軸之間一般是45度夾角輥?zhàn)颖旧砜梢栽谑艿絺?cè)向力時(shí)自由轉(zhuǎn)動(dòng)。正因?yàn)檩佔(zhàn)拥拇嬖谳喿愚D(zhuǎn)動(dòng)時(shí)施加給地面的摩擦力方向并不是沿著輪子軸線而是沿著輥?zhàn)拥妮S線分解開了。打個(gè)比方普通輪子像是你穿了一雙防滑鞋走路每一步都嚴(yán)格踩在前進(jìn)方向上麥克納姆輪則像是穿著旱冰鞋卻把腳歪著踩地面吃到的力自然就分了方向。單個(gè)麥輪產(chǎn)生的推力并不正對正前方而是有一個(gè)斜向分量。四個(gè)輪子的斜向推力經(jīng)過矢量疊加后就實(shí)現(xiàn)了前進(jìn)、橫移、旋轉(zhuǎn)以及任意組合的斜向運(yùn)動(dòng)。這也解釋了為什么麥輪底盤容易出問題任何一個(gè)輪子哪怕只有一點(diǎn)速度偏差疊加出來的合力就不是你想要的方向車身就會(huì)跑偏或者打轉(zhuǎn)。所以麥輪底盤對四個(gè)輪子的轉(zhuǎn)速一致性要求極高這種一致性的保障只能靠閉環(huán)控制來完成這也是本文后續(xù)要重點(diǎn)展開的內(nèi)容。1.2 底盤運(yùn)動(dòng)學(xué)模型從速度到輪速描述一個(gè)麥輪底盤在平面上的運(yùn)動(dòng)通常用三個(gè)自由度就夠了沿車身坐標(biāo)系x軸的前進(jìn)速度vx、沿y軸的橫移速度vy、以及繞底盤中心旋轉(zhuǎn)的角速度omega。你給控制器的目標(biāo)量往往是這三個(gè)值控制器需要做的是把這三個(gè)值轉(zhuǎn)換成四個(gè)輪子的轉(zhuǎn)速。這里有一點(diǎn)特別容易踩坑vx和vy的方向是相對于車身坐標(biāo)系還是世界坐標(biāo)系做底盤控制時(shí)一般是相對于車身坐標(biāo)系。如果你想讓小車在世界坐標(biāo)系里沿某個(gè)方向走需要在外部先做一次坐標(biāo)旋轉(zhuǎn)而不是直接丟給底盤。很多人在這一步搞混導(dǎo)致小車在旋轉(zhuǎn)過程中運(yùn)動(dòng)路線完全錯(cuò)誤。運(yùn)動(dòng)學(xué)逆解的基本思路是假設(shè)底盤是一個(gè)剛體那么底盤上任意一點(diǎn)的速度等于質(zhì)心的平移速度疊加因自身旋轉(zhuǎn)產(chǎn)生的線速度。四個(gè)輪子安裝在底盤四個(gè)角上已知車輛半寬b和半軸距a于是每個(gè)輪子中心點(diǎn)的線速度就可以用vx、vy和omega表示出來。由于輪子的安裝方向左前、右前、左后、右后以及輥?zhàn)有苯欠较蚋鞑幌嗤總€(gè)輪子的輪軸方向上的速度分量表達(dá)式也不一樣。這個(gè)推導(dǎo)過程不復(fù)雜但是相當(dāng)繁瑣下面直接給出最終結(jié)果。2. 運(yùn)動(dòng)學(xué)逆解與正解核心代碼實(shí)現(xiàn)2.1 運(yùn)動(dòng)學(xué)公式里的參數(shù)到底怎么設(shè)先定義幾個(gè)參數(shù)vx表示底盤沿車身前方方向的線速度單位取m/svy表示沿車身左方向的線速度單位取m/somega表示底盤逆時(shí)針方向的角速度單位取rad/s。另外需要兩個(gè)機(jī)械尺寸參數(shù)L代表前后輪軸距的一半也就是底盤中心到前輪中心的縱向距離W代表左右輪距的一半也就是底盤中心到左輪中心的橫向距離。這里需要特別提醒L和W一定要量準(zhǔn)。我見過不少人直接把底盤的長和寬除以2就填進(jìn)去了但很多底盤的重心并不在幾何中心如果重心偏得厲害這個(gè)算法在急加速和急停的時(shí)候會(huì)出現(xiàn)可見的車身旋轉(zhuǎn)。嚴(yán)謹(jǐn)?shù)淖龇ㄊ菍?shí)測底盤四輪接地點(diǎn)的幾何中心若重心明顯偏移要么修正L和W的值要么在控制層加一點(diǎn)角速度前饋補(bǔ)償。單位也務(wù)必統(tǒng)一。麥輪運(yùn)動(dòng)學(xué)解算最明顯的錯(cuò)誤之一就是vx、vy用m/somega用rad/s結(jié)果輪子速度算出來之后直接乘了輪半徑換算成角速度時(shí)把π寫錯(cuò)導(dǎo)致實(shí)際轉(zhuǎn)速差好幾倍。這類問題一旦出現(xiàn)小車的表現(xiàn)會(huì)非常詭異——前進(jìn)速度基本正常但一轉(zhuǎn)向就擰成一團(tuán)。建議在程序里所有中間量都用SI單位制只在輸出給電機(jī)驅(qū)動(dòng)器之前再轉(zhuǎn)換為電機(jī)的實(shí)際轉(zhuǎn)速單位。2.2 C語言實(shí)現(xiàn)運(yùn)動(dòng)學(xué)逆解四行公式解決四個(gè)輪子運(yùn)動(dòng)學(xué)逆解的正確公式以常見的“X型”麥輪布局為例前輪八字朝外展開如下// 輸入vx 前后速度vy 左右速度omega 旋轉(zhuǎn)角速度 // 輸出四個(gè)輪子的線速度m/s void kinematics_inverse(float vx, float vy, float omega, float *fl, float *fr, float *rl, float *rr) { // 機(jī)械參數(shù) float L 0.15f; // 半軸距單位米 float W 0.18f; // 半輪距單位米 *fl vx - vy - (L W) * omega; *fr vx vy (L W) * omega; *rl vx vy - (L W) * omega; *rr vx - vy (L W) * omega; }看到這里你可能有個(gè)疑問為什么系數(shù)是(LW)而不是別的因?yàn)榻撬俣萶mega在四個(gè)輪子位置產(chǎn)生的切向線速度大小是omega乘以該點(diǎn)到質(zhì)心的距離取半軸距與半輪距之和即可。如果底盤不是嚴(yán)格的矩形分布比如輪子前后距離和左右距離差別很大系數(shù)就要分別處理但大多數(shù)底盤都是矩形分布直接用(LW)沒有問題。算出來的結(jié)果單位是m/s下一步需要除以輪子的半徑得到輪子的角速度rad/s再根據(jù)減速比換算成電機(jī)的目標(biāo)轉(zhuǎn)速rpm或編碼器計(jì)數(shù)速度。這一步在正式寫代碼時(shí)必須做好單位換算核心原因是后面的PID控制需要的是“每秒編碼器脈沖數(shù)”這種離散反饋值而不是連續(xù)物理量。// 線速度轉(zhuǎn)輪子角速度 float wheel_linear_velocity fl; // m/s float wheel_angular_velocity wheel_linear_velocity / wheel_radius; // rad/s float motor_speed_rpm wheel_angular_velocity * 60.0f / (2.0f * M_PI) * gear_ratio;整體流程就是設(shè)定速度 → 逆解得到四輪線速度 → 除以半徑并乘減速比 → 得到目標(biāo)轉(zhuǎn)速 → 送入PID循環(huán)與編碼器反饋值做差輸出PWM占空比。2.3 運(yùn)動(dòng)學(xué)正解閉環(huán)反饋的數(shù)據(jù)來源運(yùn)動(dòng)學(xué)正解用在什么地方主要是兩個(gè)方面一是里程計(jì)推算二是閉環(huán)控制中的速度觀測。逆解是把“期望速度”變成“輪子目標(biāo)轉(zhuǎn)速”而正解是把“四個(gè)輪子的實(shí)際轉(zhuǎn)速”反推回“底盤當(dāng)前的實(shí)際速度”。有了這個(gè)實(shí)際速度你才能知道小車當(dāng)前是不是真的在按照指令走。正解的公式其實(shí)就是把逆解那組方程反解出來。因?yàn)槿齻€(gè)未知量、四個(gè)方程是超定方程組簡單處理方式是取線性組合。void kinematics_forward(float fl, float fr, float rl, float rr, float *vx, float *vy, float *omega) { float L 0.15f; float W 0.18f; *vx (fl fr rl rr) / 4.0f; *vy (-fl fr rl - rr) / 4.0f; *omega (-fl fr - rl rr) / (4.0f * (L W)); }這個(gè)正解公式的意義在于你把四個(gè)編碼器的實(shí)際讀數(shù)讀回來就能解出底盤的真實(shí)速度和角速度。然后在主控里做一個(gè)觀測器或者直接用這個(gè)值與目標(biāo)值做比較就能判斷底盤是不是跑歪了。精度要求高的場景會(huì)再用IMU數(shù)據(jù)對這個(gè)結(jié)果做融合但基礎(chǔ)的正解已經(jīng)能應(yīng)付大多數(shù)情況。有一點(diǎn)要說明因?yàn)榫幋a器反饋的是輪子的轉(zhuǎn)速而麥克納姆輪在實(shí)際轉(zhuǎn)動(dòng)時(shí)輥?zhàn)訒?huì)產(chǎn)生一定的滑移所以正解算出來的底盤速度和真實(shí)地面上走過的速度會(huì)有誤差。這個(gè)誤差在軟質(zhì)地面上尤其明顯硬質(zhì)平整地面會(huì)好很多。這也是麥輪底盤做高精度里程計(jì)時(shí)的先天短板需要配合其他傳感器修正。3. 硬件選型與底盤閉環(huán)控制的搭建3.1 電機(jī)、編碼器、驅(qū)動(dòng)板怎么搭配才不拖后腿運(yùn)動(dòng)學(xué)解算做得再好硬件跟不上也白搭。麥克納姆輪底盤對電機(jī)的要求有兩點(diǎn)響應(yīng)快、轉(zhuǎn)速反饋精度足。響應(yīng)快主要看電機(jī)和驅(qū)動(dòng)器的動(dòng)態(tài)特性轉(zhuǎn)速反饋精度取決于編碼器分辨率。個(gè)人建議選帶霍爾編碼器的直流減速電機(jī)或者帶編碼器的無刷電機(jī)。直流減速電機(jī)便宜、控制簡單、低速力矩足夠適合中小型底盤無刷電機(jī)效率高、壽命長適合高速場景。編碼器分辨率建議至少每圈300線以上如果控制轉(zhuǎn)速范圍較大最好直接上500線甚至1000線。我用過200線的編碼器低速時(shí)PID的反饋信號抖動(dòng)明顯調(diào)穩(wěn)需要花不少功夫后來換成500線之后低速穩(wěn)定性一下就上來了。驅(qū)動(dòng)板的選擇主要看電流。很多小車主控板上的電機(jī)驅(qū)動(dòng)電流不夠帶載啟動(dòng)或者遇到輕微的卡頓時(shí)電機(jī)會(huì)瞬間掉速PID拼命補(bǔ)PWM也無濟(jì)于事。穩(wěn)妥的做法是估算底盤滿載時(shí)單電機(jī)峰值電流然后驅(qū)動(dòng)板額定電流留出50%以上裕量。主控方面STM32F103系列跑四個(gè)電機(jī)的編碼器計(jì)數(shù)和PID循環(huán)夠用如果還要跑運(yùn)動(dòng)規(guī)劃、SLAM之類的高負(fù)載任務(wù)建議換更高性能的芯片或多核架構(gòu)。3.2 為什么必須上PID閉環(huán)開環(huán)直驅(qū)到底差在哪開環(huán)控制是什么就是你給電機(jī)一個(gè)PWM占空比電機(jī)努力轉(zhuǎn)但你完全不關(guān)心它實(shí)際轉(zhuǎn)速。占空比和轉(zhuǎn)速之間不是嚴(yán)格的線性關(guān)系尤其是直流電機(jī)負(fù)載一變、電池電壓一變同樣的占空比轉(zhuǎn)速就變了。麥輪底盤四個(gè)輪子如果各自轉(zhuǎn)速和期望值有偏差底盤走的軌跡就會(huì)歪這一點(diǎn)我在開環(huán)狀態(tài)下試過非常多次在平整的地面還能勉強(qiáng)直行一上斜坡一個(gè)輪子打滑整個(gè)車的方向當(dāng)場就崩了。閉環(huán)控制的思路則是編碼器實(shí)時(shí)測量電機(jī)轉(zhuǎn)速PID控制器根據(jù)“目標(biāo)轉(zhuǎn)速”和“實(shí)際轉(zhuǎn)速”的誤差動(dòng)態(tài)調(diào)節(jié)PWM占空比讓實(shí)際轉(zhuǎn)速不斷靠近目標(biāo)轉(zhuǎn)速。這有點(diǎn)像你開車時(shí)踩油門控制車速眼睛編碼器看到車速慢了腳PID就稍微加點(diǎn)油門車速快了就松一點(diǎn)。不需要知道路面坡度、風(fēng)阻這些具體參數(shù)只需要根據(jù)偏差修正就行。對麥輪底盤而言PID閉環(huán)最核心的價(jià)值不是讓單個(gè)輪子轉(zhuǎn)得更精準(zhǔn)而是讓四個(gè)輪子之間的誤差被有效收斂這樣疊加出來的底盤運(yùn)動(dòng)才穩(wěn)定。實(shí)測下來四輪閉環(huán)之后底盤直線行駛的偏移量能比開環(huán)縮小十倍以上。3.3 轉(zhuǎn)速環(huán)PID的實(shí)現(xiàn)編碼器測速與PWM輸出在STM32上做轉(zhuǎn)速閉環(huán)典型做法是用定時(shí)器編碼器模式采集正交編碼器信號同時(shí)用另一個(gè)定時(shí)器產(chǎn)生PWM驅(qū)動(dòng)電機(jī)。編碼器模式會(huì)自動(dòng)對A、B相進(jìn)行4倍頻處理500線編碼器實(shí)際測速分辨率就是2000個(gè)脈沖每圈這在大多數(shù)底盤控制里足夠細(xì)膩。轉(zhuǎn)速采集有兩個(gè)常用途徑一種是在固定時(shí)間窗口內(nèi)數(shù)脈沖數(shù)簡單但低速時(shí)更新頻率太低另一種是測量相鄰兩個(gè)脈沖之間的時(shí)間間隔也就是所謂的M法、T法、M/T法測速。工程上常用的方案是M法測速加低速切換具體來說當(dāng)轉(zhuǎn)速高時(shí)數(shù)脈沖當(dāng)轉(zhuǎn)速低時(shí)測脈寬兩者結(jié)合可以在寬速度范圍內(nèi)都保持較好的分辨率。PID計(jì)算頻率建議設(shè)在100Hz到1000Hz之間。我做一些室內(nèi)小車用的200Hz已經(jīng)能滿足大多數(shù)底盤控制場景。頻率太低會(huì)讓響應(yīng)滯后底盤原地旋轉(zhuǎn)時(shí)能明顯感覺到“遲頓感”頻率太高也沒有必要因?yàn)橹绷麟姍C(jī)自身的機(jī)電時(shí)間常數(shù)就在幾十毫秒量級你算得再快電機(jī)也跟不上。PID輸出量最終映射到PWM占空比。這里要注意電機(jī)驅(qū)動(dòng)有死區(qū)PWM小于一定占空比時(shí)電機(jī)根本不轉(zhuǎn)。一般做法是設(shè)置一個(gè)最小占空比閾值比如5%低于閾值的輸出直接歸零避免電機(jī)嗡嗡響在PID輸出進(jìn)入這個(gè)區(qū)間時(shí)做分段線性映射讓電機(jī)在低速時(shí)也有平滑的轉(zhuǎn)速響應(yīng)。4. PID調(diào)參實(shí)戰(zhàn)從拉不開車到穩(wěn)定跟速4.1 調(diào)參前必須完成的三個(gè)準(zhǔn)備動(dòng)作拿到一套新的底盤別急著調(diào)PID參數(shù)先把下面三項(xiàng)基礎(chǔ)工作做完否則調(diào)半天你也說不清問題是參數(shù)問題還是機(jī)械問題。第一確認(rèn)四個(gè)電機(jī)的轉(zhuǎn)動(dòng)方向與編碼器反饋極性一致。給一個(gè)正PWM時(shí)前左輪應(yīng)該正轉(zhuǎn)同時(shí)編碼器計(jì)數(shù)值應(yīng)該增加。如果方向反了PID會(huì)變成一個(gè)正反饋系統(tǒng)輸出越調(diào)越大聽起來跟失控一樣。最好在代碼里做一個(gè)開環(huán)測試手動(dòng)給固定占空比觀察每個(gè)輪子的轉(zhuǎn)向和編碼器的計(jì)數(shù)方向記錄下來形成一張對照表。第二測定電機(jī)的最大轉(zhuǎn)速和PWM的滿量程范圍。比如你的PWM周期是20000Hz滿幅占空比對應(yīng)1000那么先測出空載條件下電機(jī)能到達(dá)的最大編碼器計(jì)數(shù)速度。這一步?jīng)Q定了你的目標(biāo)轉(zhuǎn)速不會(huì)超出實(shí)際能力范圍PID積分項(xiàng)也不會(huì)因?yàn)橐恢憋柡投?。第三合理設(shè)置速度反饋的濾波。編碼器測速天生帶有量化噪聲尤其在低速時(shí)相鄰兩次測量值可能跳變很大。如果你直接把這個(gè)噪聲喂給PID的微分項(xiàng)會(huì)導(dǎo)致PWM輸出抖得厲害。建議在PID計(jì)算之前對測量值做一階低通濾波或者直接用滑動(dòng)平均再送入控制器。濾波系數(shù)不要太大否則會(huì)帶來延遲我的經(jīng)驗(yàn)是截止頻率放在轉(zhuǎn)速環(huán)帶寬的三到五倍。4.2 手把手調(diào)三參數(shù)先把P調(diào)穩(wěn)再加I和D調(diào)PID的第一步是先把I和D置零只保留比例P。給底盤一個(gè)恒定轉(zhuǎn)速目標(biāo)從較小的P值開始比如P10觀察電機(jī)實(shí)際轉(zhuǎn)速跟隨情況。如果轉(zhuǎn)速偏小而且穩(wěn)定在一個(gè)較低的值說明P太小逐步加大P值如果轉(zhuǎn)速出現(xiàn)周期性的持續(xù)振蕩說明P已經(jīng)過大回退一點(diǎn)找一個(gè)“臨界穩(wěn)定但不振蕩”的點(diǎn)在這個(gè)點(diǎn)附近P通常是最合適的初始值。一個(gè)我常用的判斷方法是讓底盤從靜止突然加速到目標(biāo)轉(zhuǎn)速記錄轉(zhuǎn)速階躍響應(yīng)曲線。P偏小時(shí)響應(yīng)曲線上升很慢永遠(yuǎn)到不了目標(biāo)值P合適時(shí)響應(yīng)曲線能快速到達(dá)目標(biāo)附近且不超調(diào)P偏大時(shí)曲線會(huì)在目標(biāo)值上下反復(fù)穿越形成振蕩。當(dāng)我調(diào)試一個(gè)全新的底盤時(shí)通常在半天內(nèi)就能利用這個(gè)現(xiàn)象找到一個(gè)不錯(cuò)的P初值。P定下來之后再引入積分I。積分的作用是消除穩(wěn)態(tài)誤差。所謂穩(wěn)態(tài)誤差就是P控制下轉(zhuǎn)速穩(wěn)定在目標(biāo)轉(zhuǎn)速的95%附近而始終追不上那剩下的5%。這時(shí)逐步加大I轉(zhuǎn)速會(huì)越來越接近目標(biāo)值。I太大的表現(xiàn)是轉(zhuǎn)速出現(xiàn)低頻振蕩周期比較長并且會(huì)緩慢上下漂移聽著電機(jī)像在“喘氣”。一旦看到這個(gè)現(xiàn)象立刻把I降下來。最后加微分D。D的作用是抑制超調(diào)相當(dāng)于提前踩剎車。編碼器噪聲大的情況下D會(huì)產(chǎn)生高頻抖動(dòng)這時(shí)候反而會(huì)讓系統(tǒng)發(fā)熱變大、聲音刺耳。所以D寧小勿大一般從零開始每次增加一點(diǎn)點(diǎn)觀察階躍響應(yīng)是否變得更干脆。如果發(fā)現(xiàn)加了D之后響應(yīng)反而變差或者電機(jī)聲音變尖說明D帶來的噪聲放大已經(jīng)壓過了它的抑制作用。4.3 實(shí)戰(zhàn)中的常見問題與排查速查表調(diào)參過程中最怕的其實(shí)是各種奇奇怪怪的現(xiàn)象分不清到底是哪個(gè)環(huán)節(jié)出了問題。我把這些年遇到的典型問題和對應(yīng)的排查思路整理成了下面這張表對照排查可以節(jié)約大量時(shí)間?,F(xiàn)象可能原因排查與對策底盤直行時(shí)往一邊偏同側(cè)輪子轉(zhuǎn)速偏低或輪子打滑用上位機(jī)同時(shí)讀四輪反饋轉(zhuǎn)速找出異常輪檢查驅(qū)動(dòng)輸出和機(jī)械阻力原地旋轉(zhuǎn)時(shí)車身畫圈運(yùn)動(dòng)學(xué)逆解的L/W參數(shù)不準(zhǔn)重新實(shí)測半軸距和半輪距檢查坐標(biāo)方向定義與公式是否匹配電機(jī)發(fā)出高頻嘯叫底盤抖動(dòng)PID微分項(xiàng)被編碼器噪聲放大降低D增加測速濾波檢查編碼器線纜是否遠(yuǎn)離電機(jī)動(dòng)力線目標(biāo)轉(zhuǎn)速低時(shí)電機(jī)一頓一頓PWM死區(qū)沒有處理或PID輸出低于啟動(dòng)閾值增加最小PWM輸出映射再疊加一個(gè)小幅前饋高速轉(zhuǎn)向時(shí)底盤有甩尾感轉(zhuǎn)速環(huán)響應(yīng)跟不上或者底盤重心偏高增加PID帶寬換低重心底盤必要時(shí)對加速度做限幅四輪都轉(zhuǎn)但底盤不走麥克納姆輪輥?zhàn)幽p或卡死檢查輥?zhàn)邮欠耢`活轉(zhuǎn)動(dòng)麥輪對地面清潔度要求較高排查這類問題有一個(gè)通用的思路先單輪后整車。把四個(gè)輪子分別獨(dú)立給相同的轉(zhuǎn)速指令觀察它們的實(shí)際反饋是否一致。這個(gè)測試能直接暴露機(jī)械阻力、驅(qū)動(dòng)故障和編碼器問題。四輪轉(zhuǎn)速一致了再上整車的運(yùn)動(dòng)測試這時(shí)候如果還有問題基本都集中在運(yùn)動(dòng)學(xué)解算和整車機(jī)械上了。5. 一個(gè)容易被忽略的細(xì)節(jié)速度限幅與梯形加減速調(diào)好PID之后很多人在實(shí)際跑動(dòng)中仍然會(huì)碰到一個(gè)問題底盤給一個(gè)較高的目標(biāo)速度小車猛地一下沖出去車身明顯有振蕩甚至發(fā)出“嘣”的一聲機(jī)械撞擊。這不是PID沒調(diào)好而是速度指令的突變程度太大了。任何物理系統(tǒng)都有慣性和響應(yīng)極限你直接給階躍速度指令PID控制器一定會(huì)在極短時(shí)間輸出大幅值從而引起過沖。解決方法是給目標(biāo)速度加一個(gè)斜率限幅或者梯形加減速規(guī)劃。通俗地說別讓目標(biāo)速度瞬間從0跳到1m/s而是讓它在0.2秒內(nèi)平滑地從0升到1m/s。這個(gè)008秒的斜率可以根據(jù)底盤的加速度能力來設(shè)定比如設(shè)定最大加速度為2m/s^2那么在程序里每毫秒增加的目標(biāo)速度不能超過0.002m/s。梯形加減速比S型曲線更容易實(shí)現(xiàn)且對大多數(shù)底盤足夠了。實(shí)測下來加了梯形加減速之后PID的調(diào)參壓力大幅降低因?yàn)槟繕?biāo)速度不再跳變PID的微分項(xiàng)也不會(huì)被激發(fā)底盤的啟停更加平順。這個(gè)方法的性價(jià)比特別高強(qiáng)烈建議操作。我個(gè)人的經(jīng)驗(yàn)是在PID閉環(huán)的代碼架構(gòu)里把運(yùn)動(dòng)學(xué)逆解、速度規(guī)劃、PID循環(huán)分成三個(gè)獨(dú)立的模塊。運(yùn)動(dòng)學(xué)逆解只負(fù)責(zé)狀態(tài)轉(zhuǎn)換速度規(guī)劃負(fù)責(zé)生成平滑的目標(biāo)值PID只負(fù)責(zé)跟蹤。模塊之間通過結(jié)構(gòu)體傳參調(diào)參和排查問題都會(huì)非常方便尤其是后面要加入里程計(jì)融合、導(dǎo)航控制時(shí)這種分層的設(shè)計(jì)能省下大量時(shí)間。6. 更進(jìn)一步的擴(kuò)展方向主體功能跑通之后你可以在這個(gè)基礎(chǔ)上做幾個(gè)有意思的擴(kuò)展。第一個(gè)是加入IMU閉環(huán)融合用陀螺儀數(shù)據(jù)修正底盤的角速度誤差。因?yàn)辂溳喸谶\(yùn)動(dòng)時(shí)輥?zhàn)哟蚧瑫?huì)導(dǎo)致實(shí)際角速度和期望角速度有偏差I(lǐng)MU的角速度反饋能有效校正這個(gè)問題讓底盤旋轉(zhuǎn)更加精準(zhǔn)。第二個(gè)是整車的速度觀測器。比如通過四個(gè)輪子的碼盤反饋跑運(yùn)動(dòng)學(xué)正解得到底盤的估計(jì)速度再和IMU數(shù)據(jù)做互補(bǔ)濾波或卡爾曼濾波得到一個(gè)更準(zhǔn)確的速度和位姿估計(jì)。這個(gè)數(shù)據(jù)是后續(xù)做自動(dòng)導(dǎo)航、路徑跟蹤的基礎(chǔ)。第三個(gè)是加入模型參考自適應(yīng)控制或者前饋。有些高端底盤在PID前饋里加入電流環(huán)的補(bǔ)償讓電機(jī)在變負(fù)載條件下依然有穩(wěn)定的轉(zhuǎn)速。這些內(nèi)容本質(zhì)上還是在底層閉環(huán)上做文章基礎(chǔ)仍然是Motion Solve加上經(jīng)典的PID控制先把基礎(chǔ)做好再做這些擴(kuò)展會(huì)容易很多。說到底麥克納姆輪底盤控制并不是一個(gè)高不可攀的技術(shù)它核心就是運(yùn)動(dòng)學(xué)解算加閉環(huán)控制。我最深的體會(huì)是調(diào)好的底盤和沒調(diào)好的底盤開起來完全是兩臺車。技術(shù)點(diǎn)不復(fù)雜但每一步都需要細(xì)心和耐心尤其是機(jī)械參數(shù)測量和PID調(diào)參?;ㄒ粋€(gè)周末把這兩塊拿下你就能擁有一臺指哪走哪的麥輪底盤后面做路徑規(guī)劃、視覺導(dǎo)航都有了穩(wěn)固的底層支撐。