前提条件
- 連続速度の軌道を取得するには、軌道内の各軌道が位置と速度の制約 (4 つの境界条件)、つまり前の軌道J i − 1 J_{i-1}を満たす必要があります。Ji − 1終了位置と速度J私はの位置と速度は同じであるため、各軌道を表すために 3 次多項式が使用されます。
- 連続的な加速度を伴う軌道を取得するには、軌道内の各軌道が位置、速度、加速度の制約 (6 つの境界条件)、つまり前の軌道 J i − 1 J_{i-1} を満たす必要があります。Ji − 1終了位置、速度、加速度は次の軌道J i J_{i}と同じでなければなりませんJ私はの位置、速度、加速度は同じであるため、各軌道を表すために 5 次の多項式が使用されます。
文章
軌跡 の場合、通常は連続軌跡を複数の多項式軌跡に分割することができ、各軌跡は5次の多項式で表現されると考える。各軌跡に対応する時間は0 0から0からT i T_iまでT私は終わり、つまりiiの場合iセグメント軌道J i J_iJ私はたとえば、開始時刻は0 0です。0、終了時刻はTi T_iT私は、開始位置、速度、加速度はそれぞれpi p_ip私は、vi v_iv私は和 a i a_i ある私は多段式パスの設定によると、
p = c 0 + c 1 t + c 2 t 2 + c 3 t 3 + c 4 t 4 + c 5 t 5 v = c 1 + 2 c 2 t + 3 c 3 t 2 + 4 c 4 t 3 + 5 c 5 t 4 a = 2 c 2 + 6 c 3 t + 12 c 4 t 2 + 20 c 5 t 3 ジャーク = 6 c 3 + 24 c 4 t + 60 c 5 t 2 スナップ= 24 c 4 + 120 c 5 t 。( 公式 1 ) \begin{aligned} p&=c_{0}+c_{1}t+c_{2}t^2+c_{3}t^3+c_{4}t^4+c_{5 }t^5 \\ v&=\quad\quad c_{1}+2c_{2}t+3c_{3}t^2+4c_{4}t^3+5c_{5}t^4 \\ a&= \quad\quad\quad\quad2c_{2}+6c_{3}t+12c_{4}t^2+20c_{5}t^3 \\ ジャーク&=\quad\quad\quad\quad\quad\quad \ quad6c_{3}+24c_{4}t+60c_{5}t^2 \\ スナップ&=\quad\quad\quad\quad\quad\quad \quad\quad \quad\quad 24c_{4}+120c_{5 }t. \quad\quad(公式1)\\ \end{整列}pvあるジャーク_ _ _スナップ_ _ _=c0+c1t+c2t2+c3t3+c4t4+c5t5=c1+2c _2t+3c_ _3t2+4c _4t3+5c _5t4=2c _2+6c_ _3t+1 2 c4t2+20c _ _5t3=6c_ _3+2 4 c4t+60c_ _ _5t2=2 4 c4+1 2 0 c5と。(公式1)
テイクNo.1 1軌跡の1セグメントを例として、t = 0 t=0t=(式 1) に0を代入すると、最初の軌道の開始点を取得できます:
p 1 ( 0 ) = c 10 、 v 1 ( 0 ) = c 11 、 a 1 ( 0 ) = 2 c 12 。整列} p_1 (0)&=c_{10}, \\ v_1(0)&=c_{11},\\ a_1(0)&=2c_{12}. \end{整列}p1( 0 )v1( 0 )ある1( 0 )=c1 0、=c1 1、=2c _1 2.
t = T 1とするt=T_1t=T1(式 1) を導入すると、軌道の最初のセグメントの最初の端を取得できます。
p 1 ( T 1 ) = c 10 + c 11 ( T 1 − 0 ) + c 12 ( T 1 − 0 ) 2 + c 13 ( T 1 − 0 ) 3 + c 14 ( T 1 − 0 ) 4 + c 15 ( T 1 − 0 ) 5 = c 10 + c 11 T 1 + c 12 T 1 2 + c 13 T 1 3 + c 14 T 1 4 + c 15 T 1 5 、 v 1 ( T 1 ) = c 11 + 2 c 12 ( T 1 − 0 ) + 3 c 13 ( T 1 − 0 ) 2 + 4 c 14 ( T 1 − 0 ) 3 + 5 c 15 ( T 1 − 0 ) 4 = c 11 + 2 c 12 ( T 1 ) + 3 c 13 ( T 1 ) 2 + 4 c 14 ( T 1 ) 3 + 5 c 15 ( T 1 ) 4 、 a 1 ( T 1 ) = 2 c 12 + 6 c 13 ( T 1 − 0 ) + 12 c 14 ( T 1 − 0 ) 2 + 20 c 15 ( T 1 − 0 ) 3 = 2 c 12 + 6 c 13 ( T 1 ) + 12 c 14 ( T 1 ) 2 + 20 c 15 ( T1)3.\begin{整列} p_1(T_1)&=c_{10}+c_{11}(T_1-0)+c_{12}(T_1-0)^2+c_{13}(T_1-0)^3+ c_{14}(T_1-0)^4+c_{15}(T_1-0)^5 \\ & = c_{10}+c_{11}T_1+c_{12}T_1^2+c_{13} T_1^3+c_{14}T_1^4+c_{15}T_1^5, \\ v_1(T_1)&=c_{11}+2c_{12}(T_1-0)+3c_{13}(T_1-0)^2+4c_{14}(T_1-0)^3+5c_{15 }(T_1-0)^4 \\ & = c_{11}+2c_{12}(T_1)+3c_{13}(T_1)^2+4c_{14}(T_1)^3+5c_{15}( T_1)^4、\\ a_1(T_1)&=2c_{12}+6c_{13}(T_1-0)+12c_{14}(T_1-0)^2+20c_{15}(T_1-0)^ 3\\ & = 2c_{12}+6c_{13}(T_1)+12c_{14}(T_1)^2+20c_{15}(T_1)^3。\end{整列}p1( T1)v1( T1)ある1( T1)=c1 0+c1 1( T1−0 )+c1 2( T1−0 )2+c1 3( T1−0 )3+c1 4( T1−0 )4+c1 5( T1−0 )5=c1 0+c1 1T1+c1 2T12+c1 3T13+c1 4T14+c1 5T15、=c1 1+2c _1 2( T1−0 )+3c_ _1 3( T1−0 )2+4c _1 4( T1−0 )3+5c _1 5( T1−0 )4=c1 1+2c _1 2( T1)+3c_ _1 3( T1)2+4c _1 4( T1)3+5c _1 5( T1)4、=2c _1 2+6c_ _1 3( T1−0 )+1 2 c1 4( T1−0 )2+20c _ _1 5( T1−0 )3=2c _1 2+6c_ _1 3( T1)+1 2 c1 4( T1)2+20c _ _1 5( T1)3 .
同様に、2 番目の軌道の開始点を取得できます:
p 2 ( 0 ) = c 20 、 v 2 ( 0 ) = c 21 、 a 2 ( 0 ) = 2 c 22 。 \begin{aligned} p_2( 0)&= c_{20}、\\ v_2(0)&=c_{21}、\\ a_2(0)&=2c_{22}. \end{aligned}p2( 0 )v2( 0 )ある2( 0 )=c2 0、=c2 1、=2c _2 2.
軌道は複数の多項式軌道で構成されるため、次の条件を満たす必要があります。
{ c 10 = p 1 ( 0 ): 開始位置境界条件 c 11 = v 1 ( 0 ): 開始速度境界条件 2 c 12 = a 1 ( 0 ): 開始加速度境界条件 軌道の前のセグメントはジャークを終了し、軌道の後半セグメントの開始スナップは同じであり、ジャーク サイズの制約はありません。つまり、ジャーク 1 ( T 1 ) − ジャーク 2 ( 0 ) = 0 6 c 13 + 24 c 14 T 1 + 60 c 15 T 1 2 − 6 c 23 = 0 前の軌跡の終了スナップは、スナップ サイズの制約がない場合、つまりスナップ 1 ( T 1 ) − スナップ 2 ( 0 ) なしで、次の軌跡の開始スナップと同じです。 = 0 24 c 14 + 120 T 1 − 24 c 24 = 0 前の軌跡 終了位置は軌跡の次のセグメントの開始位置と同じです。つまり、 p 1 ( T 1 ) = p 2 ( 0 ) :c 10 + c 11 T 1 + c 12 T 1 2 + c 13 T 1 3 + c 14 T 1 4 + c 15 T 1 5 = p 2 ( 0 ) c 10 + c 11 T 1 + c 12 T 1 2 + c 13 T 1 3 + c 14 T 1 4 + c 15 T 1 5 − c 20 = 0 前の軌道の終了位置は次の軌道の開始速度と同じです、つまり v 1 ( T 1 ) − v 2 ( 0 ) = 0 c 11 + 2 c 12 T 1 + 3 c 13 T 1 2 + 4 c 14 T 1 3 + 5 c 15 T 1 4 − c 21 = 0 前の軌跡の終了位置は次の軌道の開始加速度と同じです つまり、 a 1 ( T 1 ) − a 2 ( 0 ) = 0 2 c 12 + 6 c 13 T 1 + 12 c 14 T 1 2 + 20 c 15 T 1 3 − 2 c 22 = 0 \left\{\begin {aligned} &c_{10}=p_1(0): 開始位置境界条件\\ &c_{11}=v_1(0): 開始速度境界条件\\ &2c_ {12}=a_1(0): 開始加速度の境界条件\\ &前の軌道の終了ジャークは、次の軌道の開始スナップと同じです。ジャーク サイズの制約はありません。つまり、ジャーク_1(T_1)-ジャーク_2 (0)=0\\ &6c_{13}+24c_{14}T_1+60c_ {15}T_1^2-6c_{23}=0\\ &前の軌道の終了スナップは、前の軌道の開始スナップと同じです。スナップ サイズの制約はありません。つまり、snap_1(T_1)-snap_2(0)=0\\ &24c_ {14}+120T_1-24c_{24}=0\\ &前の軌道の終了位置は次の軌道の開始位置と同じ、つまり p_1(T_1)=p_2(0):\\ &c_{10}+c_{11}T_1+c_{12}T_1^2+c_{13}T_1^3+c_{14}T_1^4+c_{15}T_1^5=p_2(0)\ \ &c_{10}+c_{11}T_1+c_{12}T_1^2+c_{13}T_1^3+c_{14}T_1^4+c_{15}T_1^5-c_{20}=0 \\ &前の軌道の終了位置は次の軌道の開始速度と同じです、つまり、v_1(T_1)-v_2(0)=0\\ &c_{11}+2c_{12}T_1+3c_{ 13}T_1^2+ 4c_{14}T_1^3+5c_{15}T_1^4-c_{21}=0\\ &前の軌道の終了位置は次の軌道の開始加速度と同じです。つまり、a_1(T_1)-a_2(0)= 0\\ &2c_{12}+6c_{13}T_1+12c_{14}T_1^2+20c_{15}T_1^3-2c_{22}=0\\ \end{整列}\右。⎩⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎪⎧c1 0=p1( 0 ):開始位置境界条件c1 1=v1( 0 ):開始速度境界条件2c _1 2=ある1( 0 ):開始加速度境界条件軌道の前のセグメントの終了ジャークは、軌道の次のセグメントの開始ジャークと同じであり、ジャークサイズの制約はありません。つまり、ジャーク1( T1)−ジャーク_ _ _2( 0 )=06c_ _1 3+2 4 c1 4T1+60c_ _ _1 5T12−6c_ _2 3=0軌跡の前のセグメントの終了s n a p は、軌跡の次のセグメントの開始s n a pと同じであり、s n a pサイズの制約はありません。つまり、s n a p1( T1)−スナップ_ _ _2( 0 )=02 4 c1 4+1 2 0 T1−2 4 c2 4=0前の軌道の終了位置は、次の軌道の開始位置、つまりpと同じです。1( T1)=p2( 0 ):c1 0+c1 1T1+c1 2T12+c1 3T13+c1 4T14+c1 5T15=p2( 0 )c1 0+c1 1T1+c1 2T12+c1 3T13+c1 4T14+c1 5T15−c2 0=0前の軌道の終了位置は、次の軌道の開始速度、つまりvと同じです。1( T1)−v2( 0 )=0c1 1+2c _1 2T1+3c_ _1 3T12+4c _1 4T13+5c _1 5T14−c2 1=0前の軌道の終了位置は、次の軌道の開始加速度、つまり と同じです。1( T1)−ある2( 0 )=02c _1 2+6c_ _1 3T1+1 2 c1 4T12+20c _ _1 5T13−2c _2 2=0
上記の制約を行列 Ax=b 形式に変換すると、次のようになります:
x = [ c 10 c 11 c 12 c 13 c 14 c 15 c 20 c 21 c 22 c 23 c 24 c 25 ] x=\begin{bmatrix} c_ {10}\\ c_{11}\\ c_{12} \\ c_{13} \\ c_{14} \\ c_{15} \\ c_{20} \\ c_{21} \\ c_{ 22 } \\ c_{23} \\ c_{24} \\ c_{25} \\ \end{bmatrix}バツ=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡c1 0c1 1c1 2c1 3c1 4c1 5c2 0c2 1c2 2c2 3c2 4c2 5⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
b = [ p 1 ( 0 ) v 1 ( 0 ) a 1 ( 0 ) 0 0 p 2 ( 0 ) 0 0 0 ] b=\begin{bmatrix} {p_1(0)}\\ {v_1(0)} \\ {a_1(0)}\\ 0\\ 0\\ p_2(0)\\ 0\\ 0\\ 0\\ \\ \end{bmatrix}b=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡p1( 0 )v1( 0 )ある1( 0 )00p2( 0 )000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
次のように A 行列を構築します。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 11 | |||||||||||
1 | 1 11 | |||||||||||
2 | 2 22 | |||||||||||
3 | 6 66 | 24T1 24T_12 4T _1 | 60T1 2 60T_1^26 0T _12 | − 6 -6− 6 | ||||||||
4 | 24 242 4 | 120T1 120T_11 2 0 T1 | − 24 -24− 2 4 | |||||||||
5 | 1 11 | T1T_1T1 | T 1 2 T_1^2T12 | T 1 3 T_1^3T13 | T 1 4 T_1^4T14 | T 1 5 T_1^5T15 | ||||||
6 | 1 11 | T1T_1T1 | T 1 2 T_1^2T12 | T 1 3 T_1^3T13 | T 1 4 T_1^4T14 | T 1 5 T_1^5T15 | − 1 -1− 1 | |||||
7 | 1 11 | 2T1 2T_12T_ _1 | 3T123T_1^23T_ _12 | 4T134T_1^34T _13 | 5T145T_1^45T _14 | − 1 -1− 1 | ||||||
8 | 2 22 | 6T 6T6T _ | 12T1212T_1^21 2 T12 | 20T1 3 20T_1^32 0T_ _13 | − 2 -2− 2 | |||||||
9 | … | |||||||||||
10 | 1 11 | T2T_2T2 | T22T_2^2T22 | T23T_2^3T23 | T24T_2^4T24 | T25T_2^5T25 | ||||||
11 | 1 11 | 2T22T_22T_ _2 | 3T223T_2^23T_ _22 | 4T234T_2^34T _23 | 5T245T_2^45T _24 | |||||||
12 | 2 22 | 6T2 6T_26T _2 | 12T2212T_2^21 2 T22 | 20T2320T_2^32 0T_ _23 |
注: 赤は行/列のラベルです。
inline void generate(const Eigen::MatrixXd &inPs,
const Eigen::VectorXd &ts)
{
T1 = ts;
T2 = T1.cwiseProduct(T1);
T3 = T2.cwiseProduct(T1);
T4 = T2.cwiseProduct(T2);
T5 = T4.cwiseProduct(T1);
A.reset();
b.setZero();
A(0, 0) = 1.0;
A(1, 1) = 1.0;
A(2, 2) = 2.0;
b.row(0) = headPVA.col(0).transpose();
b.row(1) = headPVA.col(1).transpose();
b.row(2) = headPVA.col(2).transpose();
for (int i = 0; i < N - 1; i++)
{
A(6 * i + 3, 6 * i + 3) = 6.0;
A(6 * i + 3, 6 * i + 4) = 24.0 * T1(i);
A(6 * i + 3, 6 * i + 5) = 60.0 * T2(i);
A(6 * i + 3, 6 * i + 9) = -6.0;
A(6 * i + 4, 6 * i + 4) = 24.0;
A(6 * i + 4, 6 * i + 5) = 120.0 * T1(i);
A(6 * i + 4, 6 * i + 10) = -24.0;
A(6 * i + 5, 6 * i) = 1.0;
A(6 * i + 5, 6 * i + 1) = T1(i);
A(6 * i + 5, 6 * i + 2) = T2(i);
A(6 * i + 5, 6 * i + 3) = T3(i);
A(6 * i + 5, 6 * i + 4) = T4(i);
A(6 * i + 5, 6 * i + 5) = T5(i);
A(6 * i + 6, 6 * i) = 1.0;
A(6 * i + 6, 6 * i + 1) = T1(i);
A(6 * i + 6, 6 * i + 2) = T2(i);
A(6 * i + 6, 6 * i + 3) = T3(i);
A(6 * i + 6, 6 * i + 4) = T4(i);
A(6 * i + 6, 6 * i + 5) = T5(i);
A(6 * i + 6, 6 * i + 6) = -1.0;
A(6 * i + 7, 6 * i + 1) = 1.0;
A(6 * i + 7, 6 * i + 2) = 2 * T1(i);
A(6 * i + 7, 6 * i + 3) = 3 * T2(i);
A(6 * i + 7, 6 * i + 4) = 4 * T3(i);
A(6 * i + 7, 6 * i + 5) = 5 * T4(i);
A(6 * i + 7, 6 * i + 7) = -1.0;
A(6 * i + 8, 6 * i + 2) = 2.0;
A(6 * i + 8, 6 * i + 3) = 6 * T1(i);
A(6 * i + 8, 6 * i + 4) = 12 * T2(i);
A(6 * i + 8, 6 * i + 5) = 20 * T3(i);
A(6 * i + 8, 6 * i + 8) = -2.0;
b.row(6 * i + 5) = inPs.col(i).transpose();
}
A(6 * N - 3, 6 * N - 6) = 1.0;
A(6 * N - 3, 6 * N - 5) = T1(N - 1);
A(6 * N - 3, 6 * N - 4) = T2(N - 1);
A(6 * N - 3, 6 * N - 3) = T3(N - 1);
A(6 * N - 3, 6 * N - 2) = T4(N - 1);
A(6 * N - 3, 6 * N - 1) = T5(N - 1);
A(6 * N - 2, 6 * N - 5) = 1.0;
A(6 * N - 2, 6 * N - 4) = 2 * T1(N - 1);
A(6 * N - 2, 6 * N - 3) = 3 * T2(N - 1);
A(6 * N - 2, 6 * N - 2) = 4 * T3(N - 1);
A(6 * N - 2, 6 * N - 1) = 5 * T4(N - 1);
A(6 * N - 1, 6 * N - 4) = 2;
A(6 * N - 1, 6 * N - 3) = 6 * T1(N - 1);
A(6 * N - 1, 6 * N - 2) = 12 * T2(N - 1);
A(6 * N - 1, 6 * N - 1) = 20 * T3(N - 1);
b.row(6 * N - 3) = tailPVA.col(0).transpose();
b.row(6 * N - 2) = tailPVA.col(1).transpose();
b.row(6 * N - 1) = tailPVA.col(2).transpose();
A.factorizeLU();
A.solve(b);
return;