5次多項式の軌跡

前提条件

  • 連続速度の軌道を取得するには、軌道内の各軌道が位置と速度の制約 (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 c51
テイク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( T10 )+c1 2( T10 )2+c1 3( T10 )3+c1 4( T10 )4+c1 5( T10 )5=c1 0+c1 1T1+c1 2T12+c1 3T13+c1 4T14+c1 5T15=c1 1+2c _1 2( T10 )+3c_ _1 3( T10 )2+4c _1 4( T10 )3+5c _1 5( T10 )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( T10 )+1 2 c1 4( T10 )2+20c _ _1 5( T10 )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 5T126c_ _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 T12 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 5T15c2 0=0前の軌道終了位置は次の軌道開始速度つまりvと同じです1( T1)v2( 0 )=0c1 1+2c _1 2T1+3c_ _1 3T12+4c _1 4T13+5c _1 5T14c2 1=0前の軌道終了位置は次の軌道開始加速度つまり と同じです1( T1)ある2( 0 )=02c _1 2+6c_ _1 3T1+1 2 c1 4T12+20c _ _1 5T132c _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 -66
4 24 242 4 120T1 120T_11 2 0 T1 − 24 -242 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 -11
7 1 11 2T1 2T_12T_ _1 3T123T_1^23T_ _12 4T134T_1^34T _13 5T145T_1^45T _14 − 1 -11
8 2 22 6T 6T6T _ 12T1212T_1^21 2 T12 20T1 3 20T_1^32 0T_ _13 − 2 -22
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;

おすすめ

転載: blog.csdn.net/qq_16775293/article/details/125621501
おすすめ