当前位置:   article > 正文

TOPP问题(Time-Optimal Path Parameterization)详细解析(附代码)_time-optimal path tracking for robots: a convex op

time-optimal path tracking for robots: a convex optimization approach

题目来源

深蓝学院课程《机器人中的数值优化》(主讲:汪哲培博士)最后大作业。

参考资料

  • 课程ppt与视频
  • 助教和大佬的提示和讨论
  • Verscheure D et al. Time-optimal path tracking for robots: A convex optimization approach. IEEE Transactions on Automatic Control. 2009 Sep 22;54(10):2318-27.

任务描述

已知一个空间的路径,需要控制机械臂、无人机等去沿着它运动(如下图所示),但如何才能在满足运动约束的条件下最快地完成它呢?这就是我们要研究的问题。

在这里插入图片描述

该问题的整体求解思路为:
在这里插入图片描述

非线性控制问题建模为凸优化问题

设路径的表达方式为:随长度s变化的位置向量 q ( s ) q(s) q(s)。随路径变化的速率的平方为 b ( s ) b(s) b(s),随路径参数变化的加速度大小为 a ( s ) a(s) a(s)。即:

a ( s ) = d 2 s d t 2 a(s)=\frac{\text{d}^2s}{\text{d}t^2} a(s)=dt2d2s b ( s ) = ( d s d t ) 2 b(s)=(\frac{\text{d}s}{\text{d}t})^2 b(s)=(dtds)2

二者的关系为: b ′ ( s ) = 2 a ( s ) b'(s)=2a(s) b(s)=2a(s),这是因为中学物理讲过的 v s 2 − v 0 2 = 2 a s v_s^2 - v_0^2=2as vs2v02=2as
我们最终的目标是得到时间最优的行进速率,即 b ( s ) \sqrt{b(s)} b(s)

优化目标最短时间可写作:

T = ∫ 0 T 1 d t = ∫ 0 L 1 d s / d t d s = ∫ 0 L 1 b ( s ) d s T=\int_{0}^{T}1dt= \int_{0}^{L}\frac{1}{ds/dt} ds = \int_{0}^{L}\frac{1}{\sqrt{b(s)}} ds T=0T1dt=0Lds/dt1ds=0Lb(s) 1ds

实际速度(随时间变化)为:

d q d t = q ′ ( s ) b ( s ) \frac{\mathrm{d} q}{\mathrm{d} t} ={q}' (s)\sqrt{b(s)} dtdq=q(s)b(s)

实际加速度(随时间变化)为:

d 2 q d t 2 = d ( q ′ ( s ) b ( s ) ) d s d s d t = q ′ ′ ( s ) b ( s ) + q ′ ( s ) a ( s ) \frac{\mathrm{d}^2 q}{\mathrm{d} t^2}=\frac{\mathrm{d} ({q}' (s)\sqrt{b(s)})}{\mathrm{d} s} \frac{\mathrm{d} s}{\mathrm{d} t} =q''(s)b(s)+q'(s)a(s) dt2d2q=dsd(q(s)b(s) )dtds=q′′(s)b(s)+q(s)a(s)

然后可以得到关于以函数 b ( s ) , a ( s ) b(s),a(s) b(s),a(s) 为优化变量的优化问题模型:
在这里插入图片描述

蓝色为已知量。这个优化问题是凸的。

【为什么式凸的?:凸优化问题即目标函数和约束条件都是凸的。首先说明优化目标函数是凸的:本问题自变量为函数,则优化目标函数是凸的就是在说,任意函数 b 1 ( s ) b_1(s) b1(s) b 2 ( s ) b_2(s) b2(s)以及 0 ≤ θ ≤ 1 0 \le \theta \le 1 0θ1满足:

∫ 0 L 1 θ b 1 ( s ) + ( 1 − θ ) b 2 ( s ) d s ≤ θ ∫ 0 L 1 b 1 ( s ) d s + ( 1 − θ ) ∫ 0 L 1 b 2 ( s ) d s \int_{0}^{L}\frac{1}{\sqrt{\theta b_1(s)+(1-\theta)b_2(s)}}\mathrm{d}s \le \theta \int_{0}^{L}\frac{1}{\sqrt{b_1(s)}}\mathrm{d}s +(1-\theta) \int_{0}^{L}\frac{1}{\sqrt{b_2(s)}}\mathrm{d}s 0Lθb1(s)+(1θ)b2(s) 1dsθ0Lb1(s) 1ds+(1θ)0Lb2(s) 1ds

由于被积函数大于0,积分可以看作加法,为凸函数,故可把积分去掉,得到其充分条件为:

1 θ x + ( 1 − θ ) y ≤ θ 1 x + ( 1 − θ ) 1 y \frac{1}{\sqrt{\theta x+(1-\theta)y}} \le \theta \frac{1}{\sqrt{x}}+(1-\theta) \frac{1}{\sqrt{y}} θx+(1θ)y 1θx 1+(1θ)y 1

亦即 1 x \frac{1}{\sqrt{x}} x 1为凸函数。该充分条件显然成立,所以目标函数为凸函数。

约束方面,导数是个线性操作,所以第二个约束是凸的。第四个约束不等号左边是无穷范数和放射变换,它们都是凸的,所以该约束是凸的。对于速度约束,该不等式等价于 ∣ ∣ ( q ′ ( s ) ) 2 b ( s ) ∣ ∣ ∞ ≤ v m a x 2 ||(q'(s))^2b(s)||_\infty \le v_{max}^2 ∣∣(q(s))2b(s)vmax2,是线性的,所以是凸的。注:开根号是个非凸函数,与该约束是凸的并不矛盾,因为“约束是凸的”不是指左边函数是凸的,而是指解集是凸集,“左边函数是凸的”是“解集是凸的”的充分非必要条件。】

转化成离散的大规模凸优化问题

我们无法直接处理以连续函数为自变量的优化问题,所以对其进行离散:

在这里插入图片描述在这里插入图片描述

进行如上图的离散,对于目标函数和约束分别进行离散可以得到:

在这里插入图片描述

【补充解释第一项:上图中离散后的线段 b k b k + 1 b^kb^{k+1} bkbk+1表达式设为: b ( s ) = α s + β , α = b k + 1 − b k s k + 1 − s k b(s) = \alpha s+\beta, \alpha = \frac{b^{k+1}-b^k}{s^{k+1}-s^k} b(s)=αs+β,α=sk+1skbk+1bk

s k s k + 1 s^ks^{k+1} sksk+1段的积分为:

∫ s k s k + 1 1 b ( s ) d s = 2 α b ( s ) 1 / 2 ∣ s k s k + 1 = 2 α ( b k + 1 − b k ) = 2 s k + 1 − s k b k + 1 − b k ( b k + 1 − b k ) = 2 s k + 1 − s k b k + 1 + b k

sksk+11b(s)ds=2αb(s)1/2|sksk+1=2α(bk+1bk)=2sk+1skbk+1bk(bk+1bk)=2sk+1skbk+1+bk
sksk+1b(s) 1ds=α2b(s)1/2sksk+1=α2(bk+1 bk )=2bk+1bksk+1sk(bk+1 bk )=2bk+1 +bk sk+1sk
然后求和即可得到】

由此得到优化问题:
在这里插入图片描述

把离散问题转换成SOCP形式

思路大概是,通过引入一些变量进行一些紧的放缩,把表达形式凑成SOCP形式。

首先改造目标函数,增加隐变量 c k , d k c^k,d^k ck,dk,其满足:

c k ≤ b k c^k \le \sqrt{b^k} ckbk 1 c k + 1 + c k ≤ d k \frac{1}{c^{k+1}+c^k} \le d^k ck+1+ck1dk

则可以得到 1 b k + 1 + b k ≤ d k \frac{1}{\sqrt{b^{k+1}}+\sqrt{b^k}} \le d^k bk+1 +bk 1dk,以上每一步等号都可以取到,则 min ⁡ 1 b k + 1 + b k ⟺ min ⁡ d k \min \frac{1}{\sqrt{b^{k+1}}+\sqrt{b^k}} \Longleftrightarrow \min d^k minbk+1 +bk 1mindk,同时 b k , c k , d k b^k,c^k,d^k bk,ck,dk需要满足上面两个约束。该约束可写作锥的形式(乘开验证即可得到):
在这里插入图片描述

经过转换可以得到该优化问题的SOCP表达形式:

  • 优化目标:

min ⁡ a k , b k , c k , d k ∑ k = 0 K − 1 2 ( s k + 1 − s k ) d k \min_{a^k,b^k,c^k,d^k} \sum_{k=0}^{K-1}2(s^{k+1}-s^k)d^k minak,bk,ck,dkk=0K12(sk+1sk)dk ,

  • 锥约束:

∥ 2 c k + 1 + c k − d k ∥ 2 ≤ c k + 1 + c k + d k , ( 0 ≤ k ≤ K − 1 ) \left \|

2ck+1+ckdk
\right \| _2 \le c^{k+1}+c^k+d^k, (0 \le k \le K-1) 2ck+1+ckdk 2ck+1+ck+dk,(0kK1)

∥ 2 c k b k − 1 ∥ 2 ≤ b k + 1 , ( 0 ≤ k ≤ K ) \left \|

2ckbk1
\right \| _2 \le b^k+1, (0 \le k \le K) 2ckbk1 2bk+1,(0kK)

  • 等式约束:

2 ( s k + 1 − s k ) a k + b k − b k + 1 = 0 , ( 0 ≤ k ≤ K − 1 ) 2(s^{k+1}-s^k)a^k+b^k-b^{k+1}=0, (0 \le k \le K-1) 2(sk+1sk)ak+bkbk+1=0,(0kK1)

∥ q ′ ( s 0 ) ∥ 2 2 b 0 = v s t a r t 2 \left \| q'(s^0) \right \|_2^2 b^0 =v^2_{start} q(s0) 22b0=vstart2

∥ q ′ ( s k ) ∥ 2 2 b K = v e n d 2 \left \| q'(s^k) \right \|_2^2 b^K=v^2_{end} q(sk) 22bK=vend2

  • 不等式约束:

− b k ≤ 0 , ( 0 ≤ k ≤ K ) -b_k \le 0, (0 \le k \le K) bk0,(0kK)

( ( q y ′ ( s k ) ) 2 + ( q x ′ ( s k ) ) 2 ) b k − v m a x 2 ≤ 0 , ( 0 ≤ k ≤ K ) \left ( \left ( q'_y(s^k) \right )^2 +\left ( q'_x(s^k) \right )^2 \right ) b^k - v^2_{max} \le 0 , (0 \le k \le K) ((qy(sk))2+(qx(sk))2)bkvmax20,(0kK)

q x ′ ′ ( s k ) b k + q x ′ ( s k ) a k − a m a x ≤ 0 , ( 0 ≤ k ≤ K − 1 ) q''_x(s^k) b^k + q'_x(s^k) a^k - a_{max}\le 0, (0 \le k \le K-1) qx′′(sk)bk+qx(sk)akamax0,(0kK1)

q y ′ ′ ( s k ) b k + q y ′ ( s k ) a k − a m a x ≤ 0 , ( 0 ≤ k ≤ K − 1 ) q''_y(s^k) b^k + q'_y(s^k) a^k - a_{max} \le 0, (0 \le k \le K-1) qy′′(sk)bk+qy(sk)akamax0,(0kK1)

− q x ′ ′ ( s k ) b k − q x ′ ( s k ) a k − a m a x ≤ 0 , ( 0 ≤ k ≤ K − 1 ) -q''_x(s^k) b^k - q'_x(s^k) a^k -a_{max}\le 0, (0 \le k \le K-1) qx′′(sk)bkqx(sk)akamax0,(0kK1)

− q y ′ ′ ( s k ) b k − q y ′ ( s k ) a k − a m a x ≤ 0 , ( 0 ≤ k ≤ K − 1 ) -q''_y(s^k) b^k - q'_y(s^k) a^k -a_{max}\le 0, (0 \le k \le K-1) qy′′(sk)bkqy(sk)akamax0,(0kK1)

优化问题求解

使用锥增广拉格朗日方法求解。
增广拉格朗日函数为:

L ( a , b , c , d , λ , μ , σ ) = ∑ k = 0 K − 1 2 ( s k + 1 − s k ) d k + ρ 2 { ∑ i = 1 2 K + 1 ∥ P k i ( μ i ρ − u i ) ∥ 2 + ∑ i = 1 K + 1 ∥ h i ( x ) + λ i ρ ∥ 2 + ∑ i = 1 6 K + 2 ∥ g i ( x ) + σ i ρ ∥ 2 } \mathcal{L}(a,b,c,d,\lambda,\mu,\sigma) = \sum_{k=0}^{K-1}2(s^{k+1}-s^k) d^k + \frac{\rho}{2}\left \{ \sum_{i=1}^{2K+1} \left \| \mathcal{P_{k_i}}\left (\frac{\mu_i}{\rho} -u_i \right ) \right \|^2+ \sum_{i=1}^{K+1} \left \| h_i(x)+\frac{\lambda_i}{\rho} \right \|^2+ \sum_{i=1}^{6K+2} \left \| g_i(x)+\frac{\sigma_i}{\rho} \right \|^2 \right \} L(a,b,c,d,λ,μ,σ)=k=0K12(sk+1sk)dk+2ρ{i=12K+1 Pki(ρμiui) 2+i=1K+1 hi(x)+ρλi 2+i=16K+2 gi(x)+ρσi 2}

其中,第一类锥约束中 u k = [ c k + 1 + c k + d k 2 c k + 1 + c k − d k ] , ( 0 ≤ k ≤ K − 1 ) u_k=

[ck+1+ck+dk2ck+1+ckdk]
, (0 \le k \le K-1) uk= ck+1+ck+dk2ck+1+ckdk ,(0kK1) ;第二类锥约束中 u k = [ b k + 1 2 c k b k − 1 ] , ( 0 ≤ k ≤ K ) u_k=
[bk+12ckbk1]
, (0 \le k \le K)
uk= bk+12ckbk1 ,(0kK)

增广拉格朗日函数每项的导数分别为:

  • 目标函数: ∂ L ∂ d k = 2 ( s k + 1 − s k ) \frac{\partial \mathcal{L}}{\partial d^k} = 2(s^{k+1}-s^k) dkL=2(sk+1sk)
  • 第一类锥约束: ∂ L ∂ ( c k , c k + 1 , d k ) = ρ [ 1 1 1 0 0 0 1 1 − 1 ] P k i ( μ k ρ − u k ) \frac{\partial \mathcal{L}}{\partial (c^k,c^{k+1},d^k)} =\rho
    [111000111]
    \mathcal{P_{k_i}}\left (\frac{\mu_k}{\rho} -u_k\right )
    (ck,ck+1,dk)L=ρ 101101101 Pki(ρμkuk)
    , u k = [ c k + 1 + c k + d k 2 c k + 1 + c k − d k ] , ( 0 ≤ k ≤ K − 1 ) u_k=
    [ck+1+ck+dk2ck+1+ckdk]
    , (0 \le k \le K-1)
    uk= ck+1+ck+dk2ck+1+ckdk ,(0kK1)
  • 第二类锥约束: ∂ L ∂ ( b k , c k ) = ρ [ 1 0 1 0 2 0 ] P k i ( μ i ρ − u i ) \frac{\partial \mathcal{L}}{\partial (b^k,c^k)} =\rho
    [101020]
    \mathcal{P_{k_i}}\left (\frac{\mu_i}{\rho} -u_i \right )
    (bk,ck)L=ρ[100210]Pki(ρμiui)
    , u k = [ b k + 1 2 c k b k − 1 ] , ( 0 ≤ k ≤ K ) u_k=
    [bk+12ckbk1]
    , (0 \le k \le K)
    uk= bk+12ckbk1 ,(0kK)
  • 其余皆为线性约束,其形如: ∂ L ∂ ( b k ) = ρ ∂ h ∂ ( b k ) ( h i ( x ) + λ i ρ ) \frac{\partial \mathcal{L}}{\partial (b^k)} =\rho\frac{\partial h}{\partial (b^k)} \left ( h_i(x)+\frac{\lambda_i}{\rho} \right ) (bk)L=ρ(bk)h(hi(x)+ρλi)

参数更新和终止条件如ppt所示:
在这里插入图片描述在这里插入图片描述

代码实现

从公式到代码会有很多细节不同,以下仅个人实现过程~

1. 首先明确优化变量:

设待优化变量 x = ( b 0 , . . . , b K , a 0 , . . . , a K − 1 , c 1 , . . . , c K , d 0 , . . . , d K ) x=(b^0,...,b^K,a^0,...,a^{K-1}, c^1,...,c^K,d^0,...,d^K) x=(b0,...,bK,a0,...,aK1,c1,...,cK,d0,...,dK)

2. 明确已知条件

根据之前的作业,我们已经得到分段三次多项式轨迹 p ( t ) p(t) p(t),用它作为本次task的输入路径。在求解该分段轨迹的时候,我们把参数t解释为时间,把导数解释为速度,在求解过程中控制相邻多项式轨迹段端点导数们相等,即速度、加速度相等。而本问题中,要把它视作路径而不是轨迹,所以t不是时间。为减少误解,下文把自变量写作u,即路径 p ( u ) p(u) p(u)
除此之外参数还已知最大速度最大加速度,可以是随路径长度变化的曲线。本文为方便,取为恒值。

3. 重要参数 s k , q ′ ( s k ) , q ′ ′ ( s k ) s^k, q'(s^k), q''(s^k) sk,q(sk),q′′(sk)的求解

q ( s ) = p ( u ) q(s) = p(u) q(s)=p(u),二者函数值相同,自变量不同。为了得到离散的s,首先均匀地离散u,设每个轨迹段被分成r小段,每小段端点是 u k u^k uk对应的点,则整条分段多项式轨迹的小段数 K = r * 多项式个数。然后按照 离散的u => p(u) => q(s) => s 的顺序得到离散的s。需要明确的是这种离散方式得到的s不是等距分布的。具体表达式为:

  • 路径长度s:曲线路径被离散为分段“匀加速运动”,所以s的递推公式为 s k + 1 = s k + ∣ ∣ p ′ ( u k ) ∣ ∣ + ∣ ∣ p ′ ( u k + 1 ) ∣ ∣ 2 d u s^{k+1} = s^k + \frac{||p'(u^k)||+||p'(u^{k+1})||}{2} du sk+1=sk+2∣∣p(uk)∣∣+∣∣p(uk+1)∣∣du d u = 分段多项式轨迹中 u 的取值范围 K du=\frac{分段多项式轨迹中u的取值范围}{K} du=K分段多项式轨迹中u的取值范围
  • 位置对轨迹长度的导数 q ′ ( s ) q'(s) q(s):相当于路径切向单位向量,即 q ′ ( s ) = p ′ ( u ) ∣ ∣ p ′ ( u ) ∣ ∣ q'(s) = \frac{p'(u)}{||p'(u)||} q(s)=∣∣p(u)∣∣p(u)
  • 位置对轨迹长度的二次导数 q ′ ′ ( s ) q''(s) q′′(s):对 q ′ ( s ) q'(s) q(s)用链式法则求导,可以得到精确值的表达式: q x ′ ′ ( s ) = ( d 2 p x ( u ) d u 2 d p y ( u ) d u − d 2 p y ( u ) d u 2 d p x ( u ) d u ) d p y ( u ) d u ( d u d s ) 4 q_x''(s) = \left ( \frac{\mathrm{d^2} p_x(u)}{\mathrm{d} u^2} \frac{\mathrm{d} p_y(u)}{\mathrm{d} u} - \frac{\mathrm{d^2} p_y(u)}{\mathrm{d} u^2} \frac{\mathrm{d} p_x(u)}{\mathrm{d} u} \right ) \frac{\mathrm{d} p_y(u)}{\mathrm{d} u} \left ( \frac{\mathrm{d} u}{\mathrm{d} s} \right ) ^4 qx′′(s)=(du2d2px(u)dudpy(u)du2d2py(u)dudpx(u))dudpy(u)(dsdu)4
    q y ′ ′ ( s ) = ( d 2 p y ( u ) d u 2 d p x ( u ) d u − d 2 p x ( u ) d u 2 d p y ( u ) d u ) d p x ( u ) d u ( d u d s ) 4 q_y''(s) = \left ( \frac{\mathrm{d^2} p_y(u)}{\mathrm{d} u^2} \frac{\mathrm{d} p_x(u)}{\mathrm{d} u} - \frac{\mathrm{d^2} p_x(u)}{\mathrm{d} u^2} \frac{\mathrm{d} p_y(u)}{\mathrm{d} u} \right ) \frac{\mathrm{d} p_x(u)}{\mathrm{d} u} \left ( \frac{\mathrm{d} u}{\mathrm{d} s} \right ) ^4 qy′′(s)=(du2d2py(u)dudpx(u)du2d2px(u)dudpy(u))dudpx(u)(dsdu)4
    其中 d u d s = 1 ∣ ∣ p ′ ( u ) ∣ ∣ \frac{\mathrm{d} u}{\mathrm{d} s} = \frac{1}{||p'(u)||} dsdu=∣∣p(u)∣∣1。注意,这里有个小量的四次方倒数,实际操作中数值极不稳定。取而代之,采用精确度不高的数值微分法求解导数: q ′ ′ ( s k ) = q ′ ( s k + 1 ) − q ′ ( s k ) s k + 1 − s k q''(s^k) = \frac{q'(s^{k+1} )- q'(s^{k})}{s^{k+1} - s^{k}} q′′(sk)=sk+1skq(sk+1)q(sk),数值稳定性好很多,而且简单。

4. 代码

代码库地址:·gitee上的代码仓库
运行结果:
在这里插入图片描述在这里插入图片描述

代码中尚存在的问题:

  • 优化偶尔失败,推测原因为一些中间量求解的数值稳定性和准确度不够高。
  • 理论上应该先做搜索得到全局路径,再进行轨迹优化。没有写全局路径搜索,所以测试的时候,需要初始直线路径避开死胡同。

最后并同样重要

这项任务耗时远远超过预想,陷入一些思维误区,花了好长时间捋顺思路并调通代码,希望对大家有一些帮助。另外,本人代码水平有限,如果发现本文和代码中有错误,希望可以告知我~如果代码对你有帮助并且你有更好的实现,希望可以分享一下~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/737650
推荐阅读
相关标签
  

闽ICP备14008679号