使用路径规划可以得到一系列的路径点,如下图所示有5个路径点,这条路径是很曲折的,这不利于机器人的移动,试想一个机器人直接沿着这条路径进行移动,当到达一个路径点后速度减到零,原地旋转,指向下一个路径点,再继续移动,这不仅智障,而且浪费能量。于是我们就想,能不能规划出一条轨迹,使机器人能够在每一个路径点处能够平滑过渡,从而表现得机灵一点。这就是轨迹规划问题。
![]() |
![]() |
|---|---|
| 路径规划得到的路径点 | 轨迹优化得到的轨迹(橙色) |
二次规划(Quadratic Programming, QP)
由于轨迹规划问题可以归结为一个二次规划问题,所以这里先对二次规划进行一个简单的介绍
二次型
含有 n n n个变量 x = x 1 , x 2 , ⋯ , x n − 1 , x n x=x_1,x_2,\cdots,x_{n-1},x_n x=x1,x2,⋯,xn−1,xn的二次齐次函数:
f ( x 1 , x 2 , ⋯ , x n ) = a 11 x 1 2 + a 22 x 2 2 + ⋯ + a n n x n 2 + 2 a 12 x 1 x 2 + 2 a 13 x 1 x 3 + ⋯ + 2 a n − 1 , n x n − 1 x n \begin{aligned} f(x_1,x_2,\cdots,x_n)&=a_{11}x_1^2+a_{22}x_2^2+\cdots+a_{nn}x_n^2\\ &+2a_{12}x_1x_2+2a_{13}x_1x_3+\cdots+2a_{n-1,n}x_{n-1}x_n \end{aligned} f(x1,x2,⋯,xn)=a11x12+a22x22+⋯+annxn2+2a12x1x2+2a13x1x3+⋯+2an−1,nxn−1xn
称为二次型。取 a i j = a j i a_{ij}=a_{ji} aij=aji,则有 2 a i j x i x j = a i j x i x j + a j i x j x i 2a_{ij}x_ix_j=a_{ij}x_ix_j+a_{ji}x_jx_i 2aijxixj=aijxixj+ajixjxi,上式可表示为:
f = ∑ i , j = 1 n a i j x i x j f=\sum_{i,j=1}^na_{ij}x_ix_j f=i,j=1∑naijxixj
矩阵表示为:
f = x T A x f=x^TAx f=xTAx
二次规划问题
当目标函数 f f f为二次型,且约束为线性约束时,该优化问题就是二次规划问题,一般形式表述如下:
m i n x f ( x ) = 1 2 x T Q x + q T x s . t . A x = b G x ≤ h \begin{aligned} \mathop{min}\limits_{x} f(x)&=\frac{1}{2}x^TQx+q^Tx\\ s.t. Ax&=b\\ Gx&≤h \end{aligned} xminf(x)s.t.AxGx=21xTQx+qTx=b≤h
二次规划是一类凸优化问题,目前有很多商业或者开源的求解器来求解这类问题,不再赘述
轨迹表示形式
使用路径规划可以得到一系列的路径点,这些路径点是不带时间信息的,而轨迹则是时间 t t t的函数,一般用 n n n阶多项式表示,即:
f ( t ) = p 0 + p 1 t + p 2 t 2 + ⋯ + p n t n = ∑ i = 0 n p i t i \begin{aligned} f(t)&=p_0+p_1t+p_2t^2+\cdots+p_nt^n\\ &=\sum_{i=0}^np_it^i \end{aligned} f(t)=p0+p1t+p2t2+⋯+pntn=i=0∑npiti
其中 p 0 , p 1 , ⋯ , p n p_0,p_1,\cdots,p_n p0,p1,⋯,pn是轨迹参数,也是我们的优化参数。将 f ( t ) f(t) f(t)写成向量相乘形式,得到:
f ( t ) = [ 1 t ⋯ t n ] [ p 0 p 1 ⋮ p n ] f(t)=\begin{bmatrix}1&t&\cdots&t^n\end{bmatrix}\begin{bmatrix}p_0\\p_1\\\vdots\\p_n\end{bmatrix} f(t)=[1t⋯tn]
p0p1⋮pn
对轨迹函数求导,还能写出速度、加速度、jerk等参数随时间变化的函数:
v e l ( t ) = f ( 1 ) ( t ) = [ 0 1 2 t 3 t 2 ⋯ n ! ( n − 1 ) ! t n − 1 ] ⋅ p a c c ( t ) = f ( 2 ) ( t ) = [ 0 0 2 6 t ⋯ n ! ( n − 2 ) ! t n − 2 ] ⋅ p j e r k ( t ) = f ( 3 ) ( t ) = [ 0 0 0 6 ⋯ n ! ( n − 3 ) ! t n − 3 ] ⋅ p \begin{aligned} vel(t)&=f^{(1)}(t)=\begin{bmatrix}0&1&2t&3t^2&\cdots&\frac{n!}{(n-1)!}t^{n-1}\end{bmatrix}\cdot p\\ acc(t)&=f^{(2)}(t)=\begin{bmatrix}0&0&2&6t&\cdots&\frac{n!}{(n-2)!}t^{n-2}\end{bmatrix}\cdot p\\ jerk(t)&=f^{(3)}(t)=\begin{bmatrix}0&0&0&6&\cdots&\frac{n!}{(n-3)!}t^{n-3}\end{bmatrix}\cdot p\\ \end{aligned} vel(t)acc(t)jerk(t)=f(1)(t)=[012t3t2⋯(n−1)!n!tn−1]⋅p=f(2)(t)=[0026t⋯(n−2)!n!tn−2]⋅p=f(3)(t)=[0006⋯(n</

轨迹优化是机器人路径规划的重要环节,从路径规划得到的离散点,通过多项式轨迹平滑技术如最小jerk算法,确保机器人运动的连续性和平滑性。本文介绍了轨迹优化的数学模型,包括二次规划和最小jerk的概念,以及如何构建目标函数和约束条件,最后展示了Python实现的一维轨迹优化过程。


最低0.47元/天 解锁文章
3476





