器人軌跡規(guī)劃實(shí)戰(zhàn):從五次多項(xiàng)式到S型曲線的算法實(shí)現(xiàn)與參數(shù)整定)
1. 項(xiàng)目概述從“筆記”到“體系”的跨越看到“機(jī)器人運(yùn)動(dòng)學(xué)筆記3——林沛群”這個(gè)標(biāo)題很多剛?cè)胄械呐笥芽赡軙?huì)覺(jué)得這大概就是某個(gè)課程或教材的第三篇學(xué)習(xí)筆記。但如果你在機(jī)器人領(lǐng)域特別是機(jī)械臂控制、軌跡規(guī)劃這些方向上摸爬滾打過(guò)一陣子就會(huì)明白“林沛群”這個(gè)名字背后所代表的體系化知識(shí)有多重要。這不僅僅是一篇筆記更像是一把鑰匙幫你打開(kāi)從理論公式到實(shí)際代碼、從理想模型到復(fù)雜現(xiàn)實(shí)環(huán)境的那扇門(mén)。我自己在剛接觸機(jī)器人運(yùn)動(dòng)學(xué)時(shí)也經(jīng)歷過(guò)一段“知道每個(gè)公式但連不起來(lái)”的迷茫期。正運(yùn)動(dòng)學(xué)、逆運(yùn)動(dòng)學(xué)、雅可比矩陣、軌跡規(guī)劃……每個(gè)概念單獨(dú)看似乎都懂了但一到實(shí)際項(xiàng)目中比如想讓機(jī)械臂平滑地畫(huà)個(gè)圓或者讓無(wú)人機(jī)在動(dòng)態(tài)障礙物中穿行就發(fā)現(xiàn)理論和實(shí)操之間隔著一道鴻溝。后來(lái)系統(tǒng)地學(xué)習(xí)了以林沛群老師為代表的經(jīng)典機(jī)器人學(xué)教材和課程體系才真正把這些知識(shí)點(diǎn)串聯(lián)成一個(gè)可以指導(dǎo)實(shí)踐的系統(tǒng)。所以這篇“筆記3”我理解其核心價(jià)值在于它通常是整個(gè)運(yùn)動(dòng)學(xué)知識(shí)體系中承上啟下的關(guān)鍵部分很可能聚焦于軌跡規(guī)劃與生成——這正是將靜態(tài)的“位姿”轉(zhuǎn)化為動(dòng)態(tài)的“動(dòng)作”的核心環(huán)節(jié)。無(wú)論你是正在啃教科書(shū)的學(xué)生還是需要為機(jī)械臂、移動(dòng)機(jī)器人或無(wú)人機(jī)編寫(xiě)控制算法的工程師理解軌跡規(guī)劃的原理與實(shí)現(xiàn)都是將機(jī)器人從“能擺姿勢(shì)”變成“會(huì)干活”的必經(jīng)之路。它直接回答了“機(jī)器人如何從A點(diǎn)優(yōu)雅、高效、安全地運(yùn)動(dòng)到B點(diǎn)”這個(gè)最實(shí)際的問(wèn)題。接下來(lái)我將結(jié)合自己多年的開(kāi)發(fā)與調(diào)試經(jīng)驗(yàn)為你深度拆解機(jī)器人軌跡規(guī)劃背后的設(shè)計(jì)思路、核心算法、實(shí)操要點(diǎn)以及那些教科書(shū)里不會(huì)寫(xiě)的“坑”。2. 軌跡規(guī)劃的核心思路與方案選型軌跡規(guī)劃顧名思義就是為機(jī)器人的關(guān)節(jié)或末端執(zhí)行器規(guī)劃出一條隨時(shí)間變化的運(yùn)動(dòng)路徑。但這絕非簡(jiǎn)單的“起點(diǎn)連終點(diǎn)”。一個(gè)優(yōu)秀的軌跡規(guī)劃方案必須在多個(gè)相互制約的目標(biāo)中取得平衡。2.1 規(guī)劃層面的核心考量我們到底在規(guī)劃什么在動(dòng)手寫(xiě)代碼之前必須想清楚規(guī)劃的目標(biāo)和約束這直接決定了后續(xù)算法和參數(shù)的選擇。1. 規(guī)劃的空間關(guān)節(jié)空間 vs. 笛卡爾空間這是第一個(gè)關(guān)鍵抉擇。關(guān)節(jié)空間軌跡規(guī)劃直接規(guī)劃每個(gè)關(guān)節(jié)的角度、角速度、角加速度隨時(shí)間的變化。它的最大優(yōu)點(diǎn)是計(jì)算相對(duì)簡(jiǎn)單且能保證關(guān)節(jié)位置始終可達(dá)因?yàn)橐?guī)劃的就是關(guān)節(jié)值。缺點(diǎn)是末端執(zhí)行器在笛卡爾空間即我們真實(shí)看到的三維空間中的路徑是不可預(yù)測(cè)的可能產(chǎn)生奇怪的弧線甚至可能與障礙物發(fā)生干涉。笛卡爾空間軌跡規(guī)劃先規(guī)劃末端執(zhí)行器在三維空間中的位置和姿態(tài)位姿隨時(shí)間的變化軌跡然后通過(guò)逆運(yùn)動(dòng)學(xué)實(shí)時(shí)解算出每個(gè)關(guān)節(jié)應(yīng)有的角度。它的優(yōu)點(diǎn)是末端路徑直觀、可控易于避障和實(shí)現(xiàn)精確的路徑跟蹤如焊接、涂膠。缺點(diǎn)是計(jì)算量大需要實(shí)時(shí)逆解且可能遇到逆運(yùn)動(dòng)學(xué)無(wú)解或奇異點(diǎn)的問(wèn)題。實(shí)操心得對(duì)于大多數(shù)抓取、搬運(yùn)等點(diǎn)到點(diǎn)任務(wù)關(guān)節(jié)空間規(guī)劃因其簡(jiǎn)單可靠而更常用。但對(duì)于嚴(yán)格遵循空間路徑的任務(wù)如激光切割、弧焊或者需要視覺(jué)伺服進(jìn)行在線糾偏的場(chǎng)景笛卡爾空間規(guī)劃是必須的。在實(shí)際項(xiàng)目中我經(jīng)常采用混合策略長(zhǎng)距離移動(dòng)用關(guān)節(jié)空間規(guī)劃以求快速接近目標(biāo)或精細(xì)操作時(shí)切換為笛卡爾空間規(guī)劃以求精準(zhǔn)。2. 規(guī)劃的約束邊界條件與平滑性一條軌跡不能只關(guān)心起點(diǎn)和終點(diǎn)。我們必須定義運(yùn)動(dòng)過(guò)程中的“行為規(guī)范”邊界條件最基本的是起點(diǎn)和終點(diǎn)的位置、速度、加速度值。通常我們希望機(jī)器人在起點(diǎn)和終點(diǎn)是靜止的即速度、加速度為零。但有些場(chǎng)景下可能需要“接續(xù)”上一條運(yùn)動(dòng)這就要求起點(diǎn)具有非零的速度或加速度。平滑性這是軌跡質(zhì)量的靈魂。我們不僅要求位置連續(xù)更要求速度、加速度甚至加加速度Jerk連續(xù)。速度不連續(xù)意味著瞬時(shí)無(wú)限加速度會(huì)引發(fā)沖擊和振動(dòng)加速度不連續(xù)則意味著扭矩突變對(duì)電機(jī)和減速器造成損害。高階的連續(xù)性如加加速度連續(xù)能帶來(lái)更柔順的運(yùn)動(dòng)感受減少機(jī)械磨損。3. 優(yōu)化的目標(biāo)時(shí)間、能量與平滑度在滿足上述約束的前提下我們還要追求更優(yōu)時(shí)間最優(yōu)在電機(jī)扭矩、速度極限內(nèi)以最短時(shí)間完成運(yùn)動(dòng)。這是提高生產(chǎn)效率的關(guān)鍵。能量最優(yōu)規(guī)劃一條使電機(jī)總能耗最低的軌跡對(duì)于電池供電的移動(dòng)機(jī)器人或需要長(zhǎng)時(shí)間運(yùn)行的設(shè)備尤為重要。平滑最優(yōu)最小化加速度或加加速度的平方積分以獲得最平滑、振動(dòng)最小的運(yùn)動(dòng)。在實(shí)際工程中這些目標(biāo)往往是沖突的需要根據(jù)具體應(yīng)用進(jìn)行權(quán)衡。例如生產(chǎn)線上的機(jī)械臂通常追求時(shí)間最優(yōu)而用于精密測(cè)量的機(jī)器人則更看重平滑性。2.2 常用軌跡規(guī)劃算法選型解析了解了需求我們來(lái)看看工具箱里有哪些趁手的“兵器”。以下是幾種最經(jīng)典和實(shí)用的軌跡規(guī)劃方法。1. 多項(xiàng)式插值法最基礎(chǔ)的平滑工具這是入門(mén)必學(xué)的方法。其思想是用一個(gè)多項(xiàng)式函數(shù)來(lái)描述位置隨時(shí)間的變化。多項(xiàng)式的階數(shù)決定了能滿足的邊界條件數(shù)量。三次多項(xiàng)式3rd-order能滿足起點(diǎn)和終點(diǎn)的位置、速度約束。這是最常用、最簡(jiǎn)單的平滑軌跡生成方法。給定起點(diǎn)位置q0、終點(diǎn)位置qf、運(yùn)動(dòng)時(shí)間tf并假設(shè)起止速度為零可以唯一確定一條軌跡。其加速度為線性變化在起點(diǎn)和終點(diǎn)存在跳變。五次多項(xiàng)式5th-order能滿足起點(diǎn)和終點(diǎn)的位置、速度、加速度約束。因此它可以生成加速度連續(xù)加加速度有界的軌跡運(yùn)動(dòng)更加平滑。在需要更高質(zhì)量運(yùn)動(dòng)的場(chǎng)合五次多項(xiàng)式是更優(yōu)的選擇。為什么選擇五次而非七次或更高這是一個(gè)典型的工程權(quán)衡。五次多項(xiàng)式已經(jīng)能滿足絕大多數(shù)工業(yè)場(chǎng)景對(duì)平滑性的要求位置、速度、加速度連續(xù)。更高階的多項(xiàng)式雖然能提供更高階的連續(xù)性但會(huì)帶來(lái)更復(fù)雜的計(jì)算、可能產(chǎn)生不必要的振蕩龍格現(xiàn)象且對(duì)參數(shù)誤差更敏感。因此五次多項(xiàng)式是平滑性、計(jì)算復(fù)雜度和實(shí)用性之間的一個(gè)“甜點(diǎn)”。2. 梯形速度曲線工業(yè)界的“老黃?!比绻悴鸾膺^(guò)大多數(shù)PLC或低端機(jī)器人控制器的運(yùn)動(dòng)指令其底層很可能就是梯形速度曲線。它將運(yùn)動(dòng)過(guò)程分為三段勻加速段、勻速段、勻減速段。速度曲線呈梯形故名。優(yōu)點(diǎn)概念極其簡(jiǎn)單計(jì)算量極小易于實(shí)現(xiàn)和理解。電機(jī)始終以最大加速度加速或減速能快速達(dá)到穩(wěn)定速度在點(diǎn)到點(diǎn)快速定位中效率很高。缺點(diǎn)加速度不連續(xù)在加速段到勻速段、勻速段到減速段的切換點(diǎn)加速度存在階躍跳變。這會(huì)導(dǎo)致機(jī)械沖擊即所謂的“急動(dòng)”產(chǎn)生噪音和振動(dòng)不適合高速精密場(chǎng)合。3. S型速度曲線S-Curve平滑性的升級(jí)為了解決梯形曲線的加速度突變問(wèn)題S型曲線被引入。它在加速度的變化上也增加了平滑過(guò)渡即加加速度Jerk被限制為恒定值。速度曲線呈“S”形加速度曲線呈梯形。優(yōu)點(diǎn)速度、加速度均連續(xù)運(yùn)動(dòng)非常平滑柔順能極大減少對(duì)機(jī)械結(jié)構(gòu)的沖擊適用于高速、高精度、需要良好動(dòng)態(tài)性能的場(chǎng)景如半導(dǎo)體封裝、精密裝配機(jī)器人。缺點(diǎn)算法比梯形復(fù)雜參數(shù)更多需要設(shè)定最大加加速度Jerk規(guī)劃時(shí)間可能稍長(zhǎng)。通常有7段加加速、勻加速、減加速、勻速、加減速、勻減速、減減速或更多段。4. 樣條曲線復(fù)雜路徑的“藝術(shù)家”當(dāng)運(yùn)動(dòng)路徑不是簡(jiǎn)單的點(diǎn)到點(diǎn)而是由空間中的一系列路徑點(diǎn)Waypoints定義時(shí)就需要樣條曲線。它用分段多項(xiàng)式函數(shù)連接所有路徑點(diǎn)并保證在連接點(diǎn)處具有指定的連續(xù)性如C2連續(xù)即位置、速度、加速度連續(xù)。常用類型B樣條、NURBS樣條。B樣條具有局部支撐性修改一個(gè)控制點(diǎn)只影響局部曲線非常適合交互式軌跡編輯。NURBS則可以精確表示圓錐曲線在CAD/CAM領(lǐng)域應(yīng)用廣泛。應(yīng)用場(chǎng)景機(jī)器人打磨復(fù)雜曲面、無(wú)人機(jī)繞飛預(yù)設(shè)航點(diǎn)、機(jī)械臂執(zhí)行復(fù)雜的繪畫(huà)或焊接路徑。在實(shí)際項(xiàng)目選型時(shí)我通常會(huì)遵循這個(gè)決策鏈如果只是簡(jiǎn)單的點(diǎn)到點(diǎn)快速定位對(duì)平滑性要求不高梯形或三次多項(xiàng)式足矣如果對(duì)運(yùn)動(dòng)平滑性有要求希望減少振動(dòng)和噪音五次多項(xiàng)式或S型曲線是標(biāo)配如果路徑由多個(gè)點(diǎn)定義且要求整體平滑那么必須使用樣條插值。3. 從理論到代碼核心算法實(shí)現(xiàn)與參數(shù)整定懂了原理我們就要把它變成代碼。這里我以最經(jīng)典、最實(shí)用的五次多項(xiàng)式軌跡規(guī)劃和S型速度曲線規(guī)劃為例帶你走一遍從公式推導(dǎo)到代碼實(shí)現(xiàn)再到參數(shù)整定的全過(guò)程。3.1 五次多項(xiàng)式軌跡的推導(dǎo)與實(shí)現(xiàn)假設(shè)我們規(guī)劃單個(gè)關(guān)節(jié)從角度θ0運(yùn)動(dòng)到θf(wàn)總時(shí)間為tf。我們希望起止速度、加速度均為零。 我們?cè)O(shè)軌跡方程為θ(t) a0 a1*t a2*t2 a3*t3 a4*t? a5*t?對(duì)應(yīng)的速度、加速度方程為v(t) a1 2*a2*t 3*a3*t2 4*a4*t3 5*a5*t?a(t) 2*a2 6*a3*t 12*a4*t2 20*a5*t3代入六個(gè)邊界條件θ(0) θ0θ(tf) θf(wàn)v(0) 0v(tf) 0a(0) 0a(tf) 0可以解出六個(gè)系數(shù)a0 θ0a1 0a2 0a3 10*(θf(wàn) - θ0) / tf3a4 -15*(θf(wàn) - θ0) / tf?a5 6*(θf(wàn) - θ0) / tf?Python代碼實(shí)現(xiàn)示例import numpy as np import matplotlib.pyplot as plt def quintic_polynomial_traj(q0, qf, t, tf): 計(jì)算五次多項(xiàng)式軌跡在時(shí)間t時(shí)刻的位置、速度、加速度。 參數(shù): q0: 起始位置 qf: 終止位置 t: 當(dāng)前時(shí)間 (可以是標(biāo)量或數(shù)組) tf: 總運(yùn)動(dòng)時(shí)間 返回: pos, vel, acc: 位置, 速度, 加速度 # 計(jì)算系數(shù) a0 q0 a1 0.0 a2 0.0 a3 10.0 * (qf - q0) / (tf ** 3) a4 -15.0 * (qf - q0) / (tf ** 4) a5 6.0 * (qf - q0) / (tf ** 5) # 計(jì)算軌跡 t_normalized t / tf pos a0 a1*t a2*t**2 a3*t**3 a4*t**4 a5*t**5 vel a1 2*a2*t 3*a3*t**2 4*a4*t**3 5*a5*t**4 acc 2*a2 6*a3*t 12*a4*t**2 20*a5*t**3 return pos, vel, acc # 示例規(guī)劃從0到90度π/2弧度用時(shí)2秒的軌跡 q0 0.0 qf np.pi / 2 tf 2.0 time_array np.linspace(0, tf, 500) pos, vel, acc quintic_polynomial_traj(q0, qf, time_array, tf) # 繪圖 fig, axes plt.subplots(3, 1, figsize(10, 8)) axes[0].plot(time_array, pos, labelPosition (rad)) axes[0].set_ylabel(Position) axes[0].legend() axes[0].grid(True) axes[1].plot(time_array, vel, labelVelocity (rad/s), colororange) axes[1].set_ylabel(Velocity) axes[1].legend() axes[1].grid(True) axes[2].plot(time_array, acc, labelAcceleration (rad/s2), colorgreen) axes[2].set_ylabel(Acceleration) axes[2].set_xlabel(Time (s)) axes[2].legend() axes[2].grid(True) plt.tight_layout() plt.show()運(yùn)行這段代碼你將得到位置、速度、加速度均連續(xù)且起止為零的完美平滑曲線。這就是五次多項(xiàng)式的魅力。3.2 S型速度曲線的七段式算法詳解S型曲線規(guī)劃稍復(fù)雜但理解了其分段思想后也很清晰。我們以最常見(jiàn)的七段式S曲線為例包含加加速、勻加速、減加速、勻速、加減速、勻減速、減減速段。規(guī)劃的核心是確定每個(gè)階段的時(shí)間。我們需要用戶提供或系統(tǒng)預(yù)設(shè)幾個(gè)關(guān)鍵參數(shù)q0,qf: 起始和終點(diǎn)位置。v_max: 最大允許速度。a_max: 最大允許加速度。j_max: 最大允許加加速度 (Jerk)。規(guī)劃步驟如下計(jì)算最大可能達(dá)到的速度假設(shè)有足夠長(zhǎng)的距離讓速度從0加速到v_max再減速到0。加速段包含加加速和減加速所能達(dá)到的速度為v_reach a_max2 / (2 * j_max) a_max * (t3 - t1)但更常見(jiàn)的算法是先假設(shè)能達(dá)到v_max然后檢查距離是否足夠。判斷是否能達(dá)到v_max計(jì)算從0加速到v_max再減速到0所需的最小距離S_min。如果總位移D |qf - q0|大于S_min則運(yùn)動(dòng)包含勻速段否則為三角形速度曲線無(wú)勻速段實(shí)際能達(dá)到的最大速度v_actual小于v_max。分段計(jì)算時(shí)間加加速段時(shí)間T_j a_max / j_max如果D S_min有勻速段勻加速段時(shí)間T_a (v_max / a_max) - T_j勻速段時(shí)間T_v (D / v_max) - (v_max / a_max)這里簡(jiǎn)化了實(shí)際需考慮對(duì)稱性如果D S_min無(wú)勻速段需要重新計(jì)算實(shí)際能達(dá)到的最大速度v_actual公式涉及解二次方程。根據(jù)各段時(shí)間生成每一段的軌跡每一段都是加加速度恒定j_max,0,-j_max的段因此速度是二次曲線位置是三次曲線??梢苑侄斡?jì)算。由于其計(jì)算過(guò)程較為繁瑣這里不展開(kāi)全部公式但理解這個(gè)分段邏輯至關(guān)重要。在實(shí)際的機(jī)器人控制器或高級(jí)運(yùn)動(dòng)控制卡中這些計(jì)算都已固化成庫(kù)函數(shù)。我們使用時(shí)更多是如何設(shè)置合理的v_max,a_max,j_max參數(shù)。3.3 關(guān)鍵參數(shù)整定如何設(shè)置v_max, a_max, j_max參數(shù)整定是軌跡規(guī)劃從“能用”到“好用”的關(guān)鍵也是最體現(xiàn)經(jīng)驗(yàn)的地方。v_max(最大速度)理論依據(jù)由電機(jī)的額定轉(zhuǎn)速和減速比決定。v_max (關(guān)節(jié)空間) 電機(jī)額定轉(zhuǎn)速 / 減速比。實(shí)操技巧不要一開(kāi)始就拉到理論最大值。先從較低值如30%-50%開(kāi)始測(cè)試。過(guò)高的速度會(huì)導(dǎo)致跟蹤誤差增大在伺服周期內(nèi)可能無(wú)法及時(shí)調(diào)整。對(duì)于多關(guān)節(jié)協(xié)同運(yùn)動(dòng)末端速度還受到雅可比矩陣和奇異點(diǎn)的影響需要綜合評(píng)估。a_max(最大加速度)理論依據(jù)由電機(jī)的最大扭矩和負(fù)載的轉(zhuǎn)動(dòng)慣量決定。a_max 電機(jī)最大扭矩 / (減速比2 * 負(fù)載轉(zhuǎn)動(dòng)慣量)。這是一個(gè)簡(jiǎn)化公式實(shí)際還需考慮摩擦力等因素。實(shí)操技巧加速度直接影響電機(jī)的電流扭矩。過(guò)高的加速度會(huì)導(dǎo)致電機(jī)瞬間過(guò)流報(bào)警。一個(gè)非常實(shí)用的調(diào)試方法是監(jiān)聽(tīng)電機(jī)驅(qū)動(dòng)器的電流或扭矩反饋。在空載和負(fù)載情況下分別運(yùn)行規(guī)劃好的軌跡觀察峰值扭矩是否接近但不超過(guò)驅(qū)動(dòng)器的限流值或電機(jī)的過(guò)載能力留出約20%的安全裕度。j_max(最大加加速度)這是S曲線平滑度的核心控制參數(shù)。它直接決定了加速度變化的“急緩”程度。理論依據(jù)較難精確計(jì)算與機(jī)械系統(tǒng)的剛性、共振頻率有關(guān)。一個(gè)經(jīng)驗(yàn)法則是j_max (2 ~ 4) * a_max / T_settle其中T_settle是你希望系統(tǒng)從加速度突變中穩(wěn)定下來(lái)的時(shí)間。實(shí)操心得j_max是調(diào)試振動(dòng)和噪音的最有效旋鈕。如果運(yùn)動(dòng)結(jié)束時(shí)機(jī)械臂有明顯“點(diǎn)頭”或振動(dòng)說(shuō)明j_max太大加速度變化太猛激發(fā)了機(jī)械結(jié)構(gòu)的共振。應(yīng)逐步減小j_max直到振動(dòng)消失。但j_max太小又會(huì)使運(yùn)動(dòng)變得“綿軟”延長(zhǎng)運(yùn)動(dòng)時(shí)間。這是一個(gè)需要反復(fù)聽(tīng)噪音、看振動(dòng)、測(cè)精度來(lái)權(quán)衡的過(guò)程。參數(shù)整定流程總結(jié)根據(jù)電機(jī)和機(jī)械參數(shù)計(jì)算v_max和a_max的理論上限。在控制器中設(shè)置保守的初始值如理論值的50%。運(yùn)行軌跡使用示波器或調(diào)試軟件觀察關(guān)節(jié)實(shí)際位置跟蹤誤差、電機(jī)電流/扭矩。優(yōu)先調(diào)整j_max消除末端振動(dòng)和異響。然后調(diào)整a_max在電流/扭矩不超限的前提下盡量增大以縮短加速時(shí)間。最后調(diào)整v_max在跟蹤誤差可接受的范圍內(nèi)盡量增大以提高平均速度。記錄不同負(fù)載下的最優(yōu)參數(shù)必要時(shí)可以在控制器中做負(fù)載辨識(shí)和參數(shù)自適應(yīng)。4. 多軸協(xié)同與笛卡爾空間規(guī)劃實(shí)戰(zhàn)單個(gè)關(guān)節(jié)的運(yùn)動(dòng)規(guī)劃是基礎(chǔ)但機(jī)器人是一個(gè)多軸協(xié)同的系統(tǒng)。更重要的是我們最終關(guān)心的是末端執(zhí)行器在三維空間中的運(yùn)動(dòng)。4.1 多關(guān)節(jié)軌跡的同步與插值當(dāng)我們?yōu)?軸機(jī)械臂規(guī)劃一條軌跡時(shí)并不是簡(jiǎn)單地為每個(gè)關(guān)節(jié)獨(dú)立計(jì)算一條五次多項(xiàng)式曲線。我們必須確保所有關(guān)節(jié)同時(shí)開(kāi)始、同時(shí)結(jié)束否則末端路徑會(huì)亂套。實(shí)現(xiàn)方法歸一化時(shí)間為每個(gè)關(guān)節(jié)規(guī)劃時(shí)使用相同的運(yùn)動(dòng)總時(shí)間tf。這是最基本的要求。插值同步在實(shí)際控制時(shí)控制器在每個(gè)控制周期如1ms計(jì)算當(dāng)前時(shí)間t然后同時(shí)調(diào)用所有關(guān)節(jié)的軌跡函數(shù)θ_i(t)得到該時(shí)刻所有關(guān)節(jié)的目標(biāo)位置一并發(fā)送給伺服驅(qū)動(dòng)器。這個(gè)“同時(shí)”非常關(guān)鍵保證了運(yùn)動(dòng)的協(xié)調(diào)性。處理各關(guān)節(jié)位移不同關(guān)節(jié)1可能需要轉(zhuǎn)180度關(guān)節(jié)6可能只轉(zhuǎn)30度。如果都用相同的tf那么位移大的關(guān)節(jié)其平均速度、加速度必然更大。因此在設(shè)定v_max,a_max時(shí)需要以“短板關(guān)節(jié)”為基準(zhǔn)。即運(yùn)動(dòng)總時(shí)間tf應(yīng)由那個(gè)需要最長(zhǎng)時(shí)間由于其位移大或能力弱的關(guān)節(jié)來(lái)決定。其他能力強(qiáng)的關(guān)節(jié)“遷就”這個(gè)最慢的關(guān)節(jié)用更低的百分比運(yùn)行。4.2 笛卡爾空間直線與圓弧規(guī)劃在笛卡爾空間最常見(jiàn)的兩種路徑是直線和圓弧。1. 直線軌跡規(guī)劃給定起點(diǎn)位姿T_start和終點(diǎn)點(diǎn)位姿T_end規(guī)劃末端工具中心點(diǎn)TCP沿空間直線運(yùn)動(dòng)。核心步驟位置插值對(duì)起點(diǎn)和終點(diǎn)的位置向量進(jìn)行線性插值。P(t) P_start s(t) * (P_end - P_start)其中s(t)是一個(gè)從0到1的標(biāo)量函數(shù)可以是前面講過(guò)的任何平滑曲線如五次多項(xiàng)式歸一化。姿態(tài)插值這是難點(diǎn)。姿態(tài)通常用四元數(shù)或旋轉(zhuǎn)矩陣表示。不能直接對(duì)歐拉角進(jìn)行線性插值會(huì)導(dǎo)致方向錯(cuò)誤。必須使用球面線性插值SLERP。對(duì)于四元數(shù)q_start和q_endSLERP能保證插值出的中間姿態(tài)是繞固定軸的最短旋轉(zhuǎn)路徑。實(shí)時(shí)逆解對(duì)每個(gè)插值出的中間位姿T(t)調(diào)用逆運(yùn)動(dòng)學(xué)IK求解器得到該時(shí)刻對(duì)應(yīng)的關(guān)節(jié)角度θ(t)。這就是為什么笛卡爾規(guī)劃計(jì)算量大的原因——每個(gè)控制周期都要算一次IK。2. 圓弧軌跡規(guī)劃給定不在同一直線上的三個(gè)點(diǎn)起點(diǎn)、中間點(diǎn)、終點(diǎn)規(guī)劃TCP經(jīng)過(guò)這三點(diǎn)的圓弧路徑。核心步驟確定圓弧平面與圓心根據(jù)三點(diǎn)坐標(biāo)計(jì)算所在平面和圓心。角度參數(shù)化將圓弧用圓心角參數(shù)化角度從0到θ_total。位置計(jì)算根據(jù)當(dāng)前角度計(jì)算圓弧上的點(diǎn)坐標(biāo)。姿態(tài)處理通常需要定義姿態(tài)沿路徑的變化規(guī)則例如工具軸線始終垂直于圓弧平面法向恒定或工具方向根據(jù)切向動(dòng)態(tài)調(diào)整常用于焊接。同樣需要實(shí)時(shí)逆解。重要提示在笛卡爾空間規(guī)劃中必須進(jìn)行奇異性檢查。當(dāng)機(jī)械臂接近或處于奇異構(gòu)型時(shí)逆運(yùn)動(dòng)學(xué)解可能不存在或趨于無(wú)窮大導(dǎo)致關(guān)節(jié)速度暴增。在規(guī)劃階段就需要檢測(cè)路徑是否經(jīng)過(guò)奇異區(qū)域并提前進(jìn)行重規(guī)劃或觸發(fā)保護(hù)。4.3 與ROS2 MoveIt的集成實(shí)踐對(duì)于使用ROS2的開(kāi)發(fā)者M(jìn)oveIt是進(jìn)行軌跡規(guī)劃的首選框架。它封裝了復(fù)雜的規(guī)劃算法提供了強(qiáng)大的接口?;臼褂昧鞒淘O(shè)置規(guī)劃場(chǎng)景包括機(jī)器人模型、當(dāng)前狀態(tài)、障礙物信息等。設(shè)置規(guī)劃目標(biāo)可以是關(guān)節(jié)空間目標(biāo)JointConstraint也可以是笛卡爾空間目標(biāo)PoseTarget。選擇規(guī)劃器MoveIt支持多種規(guī)劃器如OMPL用于全局路徑規(guī)劃、CHOMP、STOMP用于梯度優(yōu)化的軌跡規(guī)劃。對(duì)于簡(jiǎn)單的點(diǎn)到點(diǎn)規(guī)劃其內(nèi)部也使用類似五次多項(xiàng)式的插值。執(zhí)行規(guī)劃調(diào)用plan()函數(shù)獲得一個(gè)RobotTrajectory對(duì)象里面包含了帶時(shí)間戳的軌跡點(diǎn)序列。執(zhí)行軌跡通過(guò)MoveGroupInterface執(zhí)行規(guī)劃好的軌跡。一個(gè)常見(jiàn)的坑MoveIt規(guī)劃出的軌跡時(shí)間可能不理想。MoveIt的默認(rèn)規(guī)劃器可能為了避障或優(yōu)化其他指標(biāo)生成一條時(shí)間很長(zhǎng)或速度很慢的軌跡。這時(shí)我們需要設(shè)置速度/加速度縮放因子move_group.setMaxVelocityScalingFactor(0.5)和setMaxAccelerationScalingFactor(0.5)但這是上限規(guī)劃器不一定用到。使用“軌跡時(shí)間參數(shù)化”工具M(jìn)oveIt提供了IterativeParabolicTimeParameterization等類可以對(duì)規(guī)劃出的路徑點(diǎn)序列重新進(jìn)行時(shí)間分配使其滿足你設(shè)定的v_max和a_max約束。這通常是獲得一條時(shí)間最優(yōu)、平滑軌跡的關(guān)鍵后處理步驟。// 偽代碼示例使用時(shí)間參數(shù)化 robot_trajectory::RobotTrajectory trajectory(robot_model, planning_group); // ... 從規(guī)劃器獲得初始路徑無(wú)時(shí)間信息 trajectory_processing::IterativeParabolicTimeParameterization time_param; bool success time_param.computeTimeStamps(trajectory, max_velocity_scaling_factor, max_acceleration_scaling_factor); if(success) { // 現(xiàn)在trajectory中的每個(gè)點(diǎn)都有了時(shí)間戳可以執(zhí)行了 }5. 動(dòng)態(tài)環(huán)境與實(shí)時(shí)避障規(guī)劃框架淺析“復(fù)雜靜態(tài)環(huán)境與動(dòng)態(tài)障礙物下的無(wú)人機(jī)實(shí)時(shí)軌跡規(guī)劃”是當(dāng)前的研究熱點(diǎn)其思想對(duì)機(jī)械臂在動(dòng)態(tài)環(huán)境如與人協(xié)作中工作也有借鑒意義。這類框架通常采用分層規(guī)劃架構(gòu)。5.1 分層規(guī)劃架構(gòu)全局規(guī)劃層基于已知的靜態(tài)地圖如SLAM構(gòu)建的規(guī)劃一條從起點(diǎn)到終點(diǎn)的粗略路徑。常用算法如A*、D*、RRT*快速探索隨機(jī)樹(shù)等。這層規(guī)劃不考慮動(dòng)力學(xué)只考慮幾何可行性。局部規(guī)劃層這是實(shí)現(xiàn)實(shí)時(shí)避障的核心。它只關(guān)注機(jī)器人周圍一小片區(qū)域局部代價(jià)地圖負(fù)責(zé)跟隨全局路徑的同時(shí)避開(kāi)突然出現(xiàn)的動(dòng)態(tài)障礙物。經(jīng)典算法動(dòng)態(tài)窗口法DWA適用于差分輪式機(jī)器人。它會(huì)在當(dāng)前速度空間內(nèi)采樣多組可行的速度對(duì)線速度、角速度模擬短期軌跡并評(píng)估每條軌跡的得分考慮目標(biāo)朝向、障礙物距離、速度等選擇最優(yōu)的一組執(zhí)行。優(yōu)化方法如模型預(yù)測(cè)控制MPC。它將未來(lái)一段時(shí)間內(nèi)的控制問(wèn)題轉(zhuǎn)化為一個(gè)優(yōu)化問(wèn)題在每一步都求解一個(gè)有限時(shí)域的最優(yōu)控制序列只執(zhí)行第一步然后滾動(dòng)優(yōu)化。MPC能顯式地處理機(jī)器人的動(dòng)力學(xué)約束和障礙物約束性能更好但計(jì)算量也更大。軌跡優(yōu)化與執(zhí)行層將局部規(guī)劃器輸出的路徑可能只是一系列路徑點(diǎn)通過(guò)前面所述的軌跡生成方法如S型曲線轉(zhuǎn)化為平滑、可執(zhí)行的速度、加速度命令下發(fā)給底層電機(jī)控制器。5.2 實(shí)時(shí)性的挑戰(zhàn)與應(yīng)對(duì)在動(dòng)態(tài)環(huán)境中規(guī)劃必須足夠快。無(wú)人機(jī)以每秒數(shù)米的速度飛行要求規(guī)劃周期在幾十毫秒以內(nèi)。算法輕量化局部規(guī)劃算法必須高效。DWA、人工勢(shì)場(chǎng)法等計(jì)算量相對(duì)較小。感知信息處理感知如視覺(jué)、激光雷達(dá)的頻率和延遲至關(guān)重要。需要使用高效的感知算法和濾波如卡爾曼濾波來(lái)預(yù)測(cè)障礙物的運(yùn)動(dòng)狀態(tài)。硬件加速在高端應(yīng)用中會(huì)使用GPU或?qū)S糜?jì)算芯片來(lái)加速規(guī)劃算法的求解特別是MPC這類優(yōu)化問(wèn)題。對(duì)于機(jī)械臂的實(shí)時(shí)避障思路類似但動(dòng)力學(xué)更復(fù)雜。通常會(huì)在笛卡爾空間或關(guān)節(jié)空間建立機(jī)器人的碰撞模型在規(guī)劃時(shí)快速進(jìn)行碰撞檢測(cè)。ROS中的MoveIt就集成了FCLFlexible Collision Library庫(kù)來(lái)做這件事。6. 開(kāi)發(fā)、調(diào)試與問(wèn)題排查全記錄理論再完美也要經(jīng)過(guò)調(diào)試的洗禮。下面是我在多年機(jī)器人開(kāi)發(fā)中在軌跡規(guī)劃環(huán)節(jié)踩過(guò)的坑和總結(jié)的經(jīng)驗(yàn)。6.1 仿真不可或缺的第一步在讓真機(jī)動(dòng)起來(lái)之前一定要在仿真環(huán)境里充分測(cè)試。仿真平臺(tái)選擇Gazebo ROS/ROS2功能強(qiáng)大物理仿真相對(duì)真實(shí)適合算法驗(yàn)證和系統(tǒng)集成測(cè)試??梢阅M傳感器、環(huán)境交互是當(dāng)前最主流的選擇。CoppeliaSim (前V-REP)圖形化好易上手內(nèi)置多種機(jī)器人模型和傳感器適合快速原型驗(yàn)證和教學(xué)。MATLAB/Simulink在控制算法設(shè)計(jì)、模型在環(huán)MIL仿真方面有巨大優(yōu)勢(shì)特別適合基于模型的設(shè)計(jì)流程。Webots也是一個(gè)成熟的商業(yè)仿真平臺(tái)在學(xué)術(shù)界和工業(yè)界都有應(yīng)用。仿真要測(cè)什么軌跡正確性末端是否按預(yù)期路徑運(yùn)動(dòng)姿態(tài)是否正確關(guān)節(jié)限位規(guī)劃出的軌跡是否導(dǎo)致關(guān)節(jié)角度超出物理限位奇異性軌跡是否經(jīng)過(guò)或接近奇異點(diǎn)觀察雅可比矩陣條件數(shù)或關(guān)節(jié)速度是否異常增大。自碰撞機(jī)械臂的不同連桿之間是否會(huì)發(fā)生碰撞動(dòng)力學(xué)可行性所需的關(guān)節(jié)扭矩是否超過(guò)電機(jī)能力這需要準(zhǔn)確的動(dòng)力學(xué)模型。6.2 真機(jī)調(diào)試從“能動(dòng)”到“好用”仿真通過(guò)后上真機(jī)要格外小心。上電前檢查清單急停開(kāi)關(guān)確保功能正常且操作員手放在附近。物理限位確認(rèn)機(jī)械限位開(kāi)關(guān)安裝牢固有效。軟件限位在控制器中設(shè)置的軟件限位是否比物理限位更保守負(fù)載參數(shù)動(dòng)力學(xué)模型中的負(fù)載質(zhì)量、質(zhì)心、慣量參數(shù)是否與真實(shí)負(fù)載匹配不匹配會(huì)導(dǎo)致力控不準(zhǔn)但更會(huì)影響軌跡跟蹤的精度。低速空載試運(yùn)行將v_max,a_max,j_max參數(shù)設(shè)置為正常值的10%-20%。單軸低速點(diǎn)動(dòng)確認(rèn)運(yùn)動(dòng)方向與預(yù)期一致這是新手常犯的錯(cuò)電機(jī)相位接反或坐標(biāo)系定義反了會(huì)導(dǎo)致災(zāi)難。運(yùn)行規(guī)劃好的簡(jiǎn)單軌跡如單關(guān)節(jié)往復(fù)運(yùn)動(dòng)觀察實(shí)際位置與目標(biāo)位置的跟蹤誤差。在示波器或調(diào)試界面上這個(gè)誤差曲線應(yīng)該是一個(gè)圍繞零點(diǎn)的小幅波動(dòng)。如果出現(xiàn)持續(xù)的正偏差或負(fù)偏差說(shuō)明可能存在摩擦力未補(bǔ)償或增益偏低。逐步加載與參數(shù)整定帶上真實(shí)負(fù)載重復(fù)低速測(cè)試。逐步增大v_max和a_max同時(shí)密切監(jiān)控電機(jī)電流和驅(qū)動(dòng)器溫度。如果出現(xiàn)過(guò)流報(bào)警或發(fā)熱嚴(yán)重說(shuō)明a_max設(shè)得太高或者動(dòng)力學(xué)參數(shù)不準(zhǔn)導(dǎo)致扭矩計(jì)算錯(cuò)誤。使用前面提到的“聽(tīng)、看、測(cè)”方法調(diào)整j_max消除振動(dòng)。測(cè)試極端位置和姿態(tài)下的軌跡確保在全工作空間內(nèi)性能穩(wěn)定。6.3 常見(jiàn)問(wèn)題排查速查表下表羅列了軌跡規(guī)劃與執(zhí)行中常見(jiàn)的問(wèn)題、可能原因及排查思路。問(wèn)題現(xiàn)象可能原因排查思路與解決方法運(yùn)動(dòng)結(jié)束時(shí)機(jī)械臂劇烈振動(dòng)或“點(diǎn)頭”j_max加加速度設(shè)置過(guò)大激發(fā)了結(jié)構(gòu)共振或者軌跡規(guī)劃未考慮機(jī)械柔性。1.優(yōu)先降低j_max這是最有效的手段。2. 檢查機(jī)械結(jié)構(gòu)是否緊固消除間隙。3. 考慮在控制環(huán)中加入低通濾波器或陷波濾波器濾除共振頻率。電機(jī)跟隨誤差大特別是高速時(shí)1.v_max/a_max超出電機(jī)能力。2. 伺服環(huán)PID增益偏低。3. 摩擦力補(bǔ)償不足。4. 軌跡規(guī)劃頻率與控制頻率不匹配。1. 降低v_max/a_max。2. 適當(dāng)提高速度環(huán)增益需注意穩(wěn)定性。3. 進(jìn)行摩擦力辨識(shí)與補(bǔ)償。4. 確保軌跡插值周期與伺服控制周期一致或成整數(shù)倍關(guān)系。笛卡爾空間規(guī)劃時(shí)奇異點(diǎn)附近關(guān)節(jié)速度突變軌跡路徑經(jīng)過(guò)或接近機(jī)器人奇異構(gòu)型如腕部奇異、肘部奇異。1. 在規(guī)劃階段進(jìn)行奇異性檢測(cè)避免路徑經(jīng)過(guò)奇異區(qū)域。2. 使用阻尼最小二乘法DLS等魯棒逆運(yùn)動(dòng)學(xué)解法在奇異點(diǎn)附近提供阻尼限制關(guān)節(jié)速度。3. 重新設(shè)計(jì)任務(wù)路徑避開(kāi)奇異姿態(tài)。MoveIt規(guī)劃時(shí)間過(guò)長(zhǎng)或失敗1. 規(guī)劃場(chǎng)景過(guò)于復(fù)雜障礙物多。2. 規(guī)劃參數(shù)設(shè)置不當(dāng)如規(guī)劃時(shí)間限制太短。3. 起點(diǎn)或終點(diǎn)在不可達(dá)位置或奇異點(diǎn)。1. 簡(jiǎn)化碰撞檢測(cè)模型或使用更寬松的碰撞檢查。2. 增加planning_time參數(shù)。3. 嘗試不同的規(guī)劃算法如從RRT換為EST。4. 檢查起點(diǎn)和終點(diǎn)的位姿是否合理嘗試微調(diào)。實(shí)際軌跡與仿真軌跡差異大1. 仿真模型與真實(shí)機(jī)器人動(dòng)力學(xué)參數(shù)不一致摩擦、慣量等。2. 真實(shí)世界存在未建模的干擾如線纜拉扯、地面不平等。3. 編碼器分辨率或校準(zhǔn)問(wèn)題。1. 進(jìn)行系統(tǒng)辨識(shí)更新仿真模型參數(shù)。2. 在控制中增加干擾觀測(cè)器DOB或自適應(yīng)控制律。3. 檢查并校準(zhǔn)編碼器零點(diǎn)。多軸協(xié)同運(yùn)動(dòng)時(shí)末端路徑抖動(dòng)各關(guān)節(jié)軌跡未嚴(yán)格同步或某個(gè)關(guān)節(jié)通常是負(fù)載最大的響應(yīng)慢成為瓶頸。1. 檢查軌跡插值代碼確保所有關(guān)節(jié)在同一時(shí)刻采樣。2. 分析各關(guān)節(jié)的跟蹤誤差找出性能最差的關(guān)節(jié)。降低整體v_max/a_max或單獨(dú)優(yōu)化該關(guān)節(jié)的伺服增益。3. 考慮使用基于模型的前饋控制補(bǔ)償重力、科氏力等耦合項(xiàng)。軌跡規(guī)劃是連接上層決策與底層控制的橋梁其質(zhì)量直接決定了機(jī)器人運(yùn)動(dòng)的性能、精度和壽命。它不是一個(gè)一蹴而就的參數(shù)設(shè)置而是一個(gè)需要結(jié)合理論、仿真和大量實(shí)地調(diào)試的迭代過(guò)程。從理解多項(xiàng)式與S曲線的數(shù)學(xué)本質(zhì)到在ROS中調(diào)用MoveIt的API再到在車間里聽(tīng)著電機(jī)聲音調(diào)整Jerk參數(shù)每一步都充滿了工程實(shí)踐的智慧。希望這篇融合了筆記總結(jié)與項(xiàng)目經(jīng)驗(yàn)的長(zhǎng)文能幫你構(gòu)建起關(guān)于機(jī)器人軌跡規(guī)劃的完整知識(shí)圖譜和實(shí)踐方法論。記住好的軌跡是讓機(jī)器人既快又穩(wěn)、既準(zhǔn)又順的藝術(shù)。