本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例
二十五、控制分配问题
控制分配对于冗余驱动的系统的含义可以通过以下例子进行理解,一般来说,四旋翼就可以使得飞机产生一个总的推力和三轴力矩,但是有时候为了安全,会采用六旋翼或八旋翼,那如何使用这六个或八个旋翼产生一个总的推力和三轴力矩就是控制分配问题。
对于上图中四个旋翼的情况,当其转速等比例增大时,向上的推力就会变大,四个旋翼转速等比例减小时,推力就会减小。再比如,我们可以把后两个旋翼的转速增大,前两个旋翼的转速减小,维持总推力不变,使其绕y轴旋转,进行姿态变换,如上面第一个四旋翼示意图所示,同理,我们可以实现绕x轴进行旋转,如上面第二个四旋翼示意图所示。我们可以把某对角线上的两个转向相同的旋翼的转速增大,而另一个对角线上的两个转向相同的旋翼的转速减小,来实现绕z轴旋转,如上面的第三个四旋翼示意图所示。
当我们有更多个旋翼时,如何实现以上的姿态变换,也就是控制分配问题,即如何计算出每个旋翼的转速,来得到期望的总推力和三轴力矩,我们可以采用优化的方法来进行计算。
假设第n个电机在水平面上与x轴的夹角(逆时针)为 ϕ N \phi_{\mathbf{N}} ϕN,与中心原点的距离为 r N r_{\mathbf{N}} rN,我们用 η i \eta_{i} ηi表示该旋翼是否可正常使用,若可正常使用,则其值为1,若发生故障,则其值为0。电机的推力和转速的平方成正比, μ \mu μ是跟空气动力相关的常数项,所以某个旋翼的推力 F i F_i Fi可表示为下式
F i = η i ⋅ μ ⋅ ω i 2 F_i=\eta_i\cdot\mu\cdot\color{red}{\omega_i^2} Fi=ηi⋅μ⋅ωi2
某个旋翼沿着z轴产生的力矩也与转速的平方成比例关系, κ \kappa κ是与产生力矩相关的空气动力学常数,力矩与转速反向,用 sign ( ω i ) \operatorname{sign}(\omega_i) sign(ωi)表示他的转向,所以某个旋翼的力矩 T i T_i Ti可表示为下式
T i = − η i ⋅ sign ( ω i ) ⋅ κ ⋅ ω i 2 T_i=-\eta_i\cdot\operatorname{sign}(\omega_i)\cdot\kappa\cdot\color{red}{\omega_i^2} Ti=−ηi⋅sign(ωi)⋅κ⋅ωi2
因此,实际总推力和横摇/俯仰/偏航力矩计算如下:
[ f t o t a l τ r o l l τ p i t c h τ y a w ] = [ t 1 ⋯ t N l 1 ⋯ l N m 1 ⋯ m N n 1 ⋯ n N ] [ ω 1 2 ⋮ ω N 2 ] \begin{bmatrix}f_\mathrm{total}\\\tau_\mathrm{roll}\\\tau_\mathrm{pitch}\\\tau_\mathrm{yaw}\end{bmatrix}=\begin{bmatrix}t_1&\cdots&t_N\\l_1&\cdots&l_N\\m_1&\cdots&m_N\\n_1&\cdots&n_N\end{bmatrix}\color{red}{\begin{bmatrix}\omega_1^2\\\vdots\\\omega_N^2\end{bmatrix}} ftotalτrollτpitchτyaw = t1l1m1n1⋯⋯⋯⋯tNlNmNnN ω12⋮ωN2
其中,上式中的常数矩阵中的元素计算方式如下:
t i = η i ⋅ μ l i = η i ⋅ μ ⋅ r i ⋅ sin ( φ i ) m i = η i ⋅ μ ⋅ r i ⋅ cos ( φ i ) n i = − η i ⋅ κ ⋅ s i g n ( ω i ) \begin{aligned} &t_{i}&& =\eta_{i}\cdot\mu \\ &\boldsymbol{l}_{i}&& =\eta_i\cdot\mu\cdot r_i\cdot\sin(\varphi_i) \\ &m_{i}&& =\eta_i\cdot\mu\cdot r_i\cdot\cos(\varphi_i) \\ &n_{i}&& =-\eta_i\cdot\kappa\cdot\mathrm{sign}(\omega_i) \end{aligned} tilimini=ηi⋅μ=ηi⋅μ⋅ri⋅sin(φi)=ηi⋅μ⋅ri⋅cos(φi)=−ηi⋅κ⋅sign(ωi)
所以,该优化问题的目标是使得推力、力矩的实际值与期望值的偏差尽可能的小,即使得下式的值尽可能的小
∥ [ f ˉ t o t a l τ ˉ r o l l τ ˉ p i t c h τ ˉ y a w ] − [ t 1 ⋯ t N l 1 ⋯ l N m 1 ⋯ m N n 1 ⋯ n N ] [ ω 1 2 ⋮ ω N 2 ] ∥ W 2 \left\|\begin{bmatrix}\color{red}{\bar{f}_\mathrm{total}}\\\color{red}{\bar{\tau}_\mathrm{roll}}\\\color{red}{\bar{\tau}_\mathrm{pitch}}\\\color{red}{\bar{\tau}_\mathrm{yaw}}\end{bmatrix}-\begin{bmatrix}t_1&\cdots&t_N\\l_1&\cdots&l_N\\m_1&\cdots&m_N\\n_1&\cdots&n_N\end{bmatrix}\color{blue}{\begin{bmatrix}\omega_1^2\\\vdots\\\omega_N^2\end{bmatrix}}\right\|_W^2 fˉtotalτˉrollτˉpitchτˉyaw − t1l1m1n1⋯⋯⋯⋯tNlNmNnN ω12⋮ωN2 W2
我们优化的变量是转速的平方,电机出厂时即确定了其上下限,即其需要满足下式
ω m i n 2 ≤ ω i 2 ≤ ω max 2 , ∀ i ∈ { 1 , … , N } \omega_{\mathrm{min}}^2\leq\omega_i^2\leq\omega_{\max}^2,\forall i\in\{1,\ldots,N\} ωmin2≤ωi2≤ωmax2,∀i∈{1,…,N}
同时,我们要减少旋翼速度的不连续跳变,即使得上一下转速与下一次转速之间的跳变尽可能的小,即使得下式的值尽可能的小
∥ [ ω ˉ 1 2 ⋮ ω ˉ N 2 ] − [ ω 1 2 ⋮ ω N 2 ] ∥ 2 \left\|\color{red}{\begin{bmatrix}\bar{\omega}_1^2\\\vdots\\\bar{\omega}_N^2\end{bmatrix}}-\color{blue}{\begin{bmatrix}\omega_1^2\\\vdots\\\omega_N^2\end{bmatrix}}\right\|^2 ωˉ12⋮ωˉN2 − ω12⋮ωN2 2
此外,推力和力矩还需要满足一些安全约束,如下式所示:
A [ t 1 ⋯ t N l 1 ⋯ l N m 1 ⋯ m N n 1 ⋯ n N ] [ ω 1 2 ⋮ ω N 2 ] ≤ b A\begin{bmatrix}t_1&\cdots&t_N\\l_1&\cdots&l_N\\m_1&\cdots&m_N\\n_1&\cdots&n_N\end{bmatrix}\color{blue}{{\begin{bmatrix}\omega_1^2\\\vdots\\\omega_N^2\end{bmatrix}}} \leq b A t1l1m1n1⋯⋯⋯⋯tNlNmNnN ω12⋮ωN2 ≤b
设当前某个旋翼的转速平方为 ω ˉ i 2 \bar{\omega}_i^2 ωˉi2,则其迭代式可表示成下式,其中 ν i \color{green}{\nu_i} νi是增量,也是经过下式转换后的新的优化变量
ω i 2 = ω ˉ i 2 + ν i \omega_i^2=\bar{\omega}_i^2+\nu_i ωi2=ωˉi2+νi
因此,该问题最终变为求取 ν i \color{green}{\nu_i} νi使得下式最小,即使得推力、力矩的实际值与期望值之间的偏差尽可能小,同时使得两次迭代间转速的变化尽可能得小
min ν 1 , … , ν N ∥ [ f ˉ t o t a l τ ˉ r o l l τ ˉ p i t c h τ ˉ y a w ] − [ t 1 ⋯ t N l 1 ⋯ l N m 1 ⋯ m N n 1 ⋯ n N ] [ ω ˉ 1 2 + ν 1 ⋮ ω ˉ N 2 + ν N ] ∥ W 2 + ρ ∥ [ ν 1 ⋮ ν N ] ∥ 2 \min_{\nu_1,\ldots,\nu_N}\left\|\begin{bmatrix}\bar{f}_\mathrm{total}\\\bar{\tau}_\mathrm{roll}\\\bar{\tau}_\mathrm{pitch}\\\bar{\tau}_\mathrm{yaw}\end{bmatrix}-\begin{bmatrix}t_1&\cdots&t_N\\l_1&\cdots&l_N\\m_1&\cdots&m_N\\n_1&\cdots&n_N\end{bmatrix}\begin{bmatrix}\bar{\omega}_1^2+\nu_1\\\vdots\\\bar{\omega}_N^2+\nu_N\end{bmatrix}\right\|_W^2+\rho\left\|\begin{bmatrix}\color{green}\nu_1\\\color{green}\vdots\\\color{green}\nu_N\end{bmatrix}\right\|^2 ν1,…,νNmin fˉtotalτˉrollτˉpitchτˉyaw − t1l1m1n1⋯⋯⋯⋯tNlNmNnN ωˉ12+ν1⋮ωˉN2+νN W2+ρ ν1⋮νN 2
所求的 ν i \color{green}{\nu_i} νi还需要满足以下不等式约束
[ ω m i n 2 − ω ˉ 1 2 ⋮ ω m i n 2 − ω ˉ N 2 ] ≤ [ ν 1 ⋮ ν N ] ≤ [ ω m a x 2 − ω ˉ 1 2 ⋮ ω m a x 2 − ω ˉ N 2 ] A [ t 1 ⋯ t N l 1 ⋯ l N m 1 ⋯ m N n 1 ⋯ n N ] [ ω ˉ 1 2 + ν 1 ⋮ ω ˉ N 2 + ν N ] ≤ b \begin{aligned}&\begin{bmatrix}\omega_{\mathrm{min}}^2-\bar{\omega}_1^2\\\vdots\\\omega_{\mathrm{min}}^2-\bar{\omega}_N^2\end{bmatrix}\leq\begin{bmatrix}\color{green}\nu_1\\\color{green}\vdots\\\color{green}\nu_N\end{bmatrix}\leq\begin{bmatrix}\omega_{\mathrm{max}}^2-\bar{\omega}_1^2\\\vdots\\\omega_{\mathrm{max}}^2-\bar{\omega}_N^2\end{bmatrix}\\&A\begin{bmatrix}t_1&\cdots&t_N\\l_1&\cdots&l_N\\m_1&\cdots&m_N\\n_1&\cdots&n_N\end{bmatrix}\begin{bmatrix}\bar{\omega}_1^2+\color{green}\nu_1\\\vdots\\\bar{\omega}_N^2+\color{green}\nu_N\end{bmatrix}\leq b\end{aligned} ωmin2−ωˉ12⋮ωmin2−ωˉN2 ≤ ν1⋮νN ≤ ωmax2−ωˉ12⋮ωmax2−ωˉN2 A t1l1m1n1⋯⋯⋯⋯tNlNmNnN ωˉ12+ν1⋮ωˉN2+νN ≤b
对于以上严格凸的带不等式约束的QP问题,由于优化变量的维度较低(N<10),且严格凸的,使用QP方法求解时,它的精确解可以在线性时间内得到。
二十六、碰撞距离计算问题
在下图所示的例子中,障碍物由一系列的不规则多边形组成,有效计算碰撞距离是机器人导航的关键功能,那么如何计算机器人与这些障碍物的最近距离呢(也即下图中的蓝色向量)?
假设如下图所示的障碍物用一系列半空间(不等式)的交去表示(H-representation),这一系列的半空间有可能是冗余的,即存在一些不等式不在障碍物的边界上,如 x 1 + x 2 + x 3 ≤ 1 x 1 + x 2 + x 3 ≤ 2 \begin{array}{c}x_1+x_2+x_3\leq1\\x_1+x_2+x_3\leq2\end{array} x1+x2+x3≤1x1+x2+x3≤2中的第二个式子显然是冗余的。
我们只需要找到一个与机器人所在位置 x r o b o t x_{robot} xrobot最近的x,其在构成障碍物的这一系列不等式的内部,即满足不等式 A P x ≤ b P A_{\mathcal{P}}\color{red}{x}\color{black} \leq b_{\mathcal{P}} APx≤bP,即该问题可转换为以下QP问题,可以使用之前介绍的方法求解,把每个障碍物都过一遍,既可以找到当前机器人与环境中障碍物的最近距离。
min x ∈ R d ∥ x − x r o b o t ∥ 2 s . t . A P x ≤ b P \begin{aligned}&\min_{\color{black}{x\in\mathbb{R}^d}}\|\color{black}{x-x_{\mathrm{robot}}}\|^2\\&\mathrm{s.t.~}A_{\mathcal{P}}\color{black}{x\leq b_{\mathcal{P}}}\end{aligned} x∈Rdmin∥x−xrobot∥2s.t. APx≤bP
。
假设障碍物不是由H-representation表示的,而是由V-representation表示的,即障碍物是由包含一堆点的最小凸包表示的,这些点中同样存在冗余的点
。
第一种处理思路是,一个点处于由点集构成的凸包的内部或者边界上时,它一定可以表示成v1~vm的一个凸组合,即
x ∈ P : = c o n v { v 1 , … , v m } x\in\mathcal{P}:=\mathrm{conv}\{v_1,\ldots,v_m\} x∈P:=conv{v1,…,vm}
if and only if there are λ i \lambda_{i} λi and Σ i = 1 m λ i = 1 \Sigma_{i=1}^m\lambda_i=1 Σi=1mλi=1 such that x = Σ i = 1 m λ i v i x=\Sigma_{i=1}^m\lambda_iv_i x=Σi=1mλivi
我们可以以 λ i \color{red}{\lambda_i} λi为优化变量,来最小化由这一系列 λ i \color{red}{\lambda_i} λi构成的x与机器人所在位置 x r o b o t x_{robot} xrobot之间的距离,则该问题转换为以下带等式和不等式约束的优化问题:
min λ ∈ R m ∥ ( v 1 , … , v m ) λ − x r o b o t ∥ 2 \min_{\lambda\in\mathbb{R}^m}\|(v_1,\ldots,v_m)\boldsymbol{\lambda}-x_{\mathrm{robot}}\|^2 λ∈Rmmin∥(v1,…,vm)λ−xrobot∥2
s . t . λ ≥ 0 , 1 T λ = 1 \mathrm{s.t.~}\color{red}{\lambda}\geq0,\mathrm{~}1^\mathrm{T}\color{red}{\lambda}=1 s.t. λ≥0, 1Tλ=1
这是一个QP问题,它有有m维变量和(m+1)约束。当存在大量冗余顶点时,该QP具有较高的维度,可以采用PHR增广拉格朗日算法进行迭代求解。通过解的稀疏性来精确求解仍然是可能的,但比较复杂。
第二种更高效的处理思路是,找一个支撑平面,分割开机器人与障碍物,因此,我们可以以最大化机器人与该支撑平面的距离为优化目标,来寻求这样一个支撑平面,该支撑平面可用下式表示:
{ x ∈ R d ∣ y T ( x − x r o b o t ) ≤ y T y } \left\{x\in\mathbb{R}^d\mid y^\mathrm{T}(x-x_\mathrm{robot})\leq y^\mathrm{T}y\right\} {x∈Rd∣yT(x−xrobot)≤yTy}
该优化问题可表示为(为非凸问题):
max y ∈ R d y T y , s . t . ( v i − x r o b o t ) T y ≥ y T y , ∀ i ∈ { 1 , … , m } \begin{aligned}&\max_{y\in\mathbb{R}^d}y^\mathrm{T}y,\\&\mathrm{s.t.~}(v_i-x_\mathrm{robot})^\mathrm{T}y\geq y^\mathrm{T}y,\mathrm{~}\forall i\in\{1,\ldots,m\}\end{aligned} y∈RdmaxyTy,s.t. (vi−xrobot)Ty≥yTy, ∀i∈{1,…,m}
Notice that if we use z = y / ( y T y ) or equivalently y = z / ( z T z ) \text{Notice that if we use }z=y/\big(y^\text{T}y\big)\text{or equivalently }y=z/\big(z^\text{T}z\big) Notice that if we use z=y/(yTy)or equivalently y=z/(zTz),因此,该QP优化问题又可以表示为(为凸问题):
min z ∈ R d z T z , s . t . ( v i − x r o b o t ) T z ≥ 1 , ∀ i ∈ { 1 , … , m } \begin{aligned}&\min_{z\in\mathbb{R}^d}z^\mathrm{T}z,\\&\mathrm{s.t.~}(v_i-x_\mathrm{robot})^\mathrm{T}z\geq1,\mathrm{~}\forall i\in\{1,\ldots,m\}\end{aligned} z∈RdminzTz,s.t. (vi−xrobot)Tz≥1, ∀i∈{1,…,m}
不可行性意味着发生碰撞,否则最优解 x = y + x r o b o t = z / ( z T z ) + x r o b o t x=y+x_\mathrm{robot}=z/(z^\mathrm{T}z)+x_\mathrm{robot} x=y+xrobot=z/(zTz)+xrobot
二十七、非线性模型预测控制
比如自动驾驶中跟踪参考轨迹时,需要同时控制车辆纵向加速度和转向角,也即输入量,状态量选为后轮位置坐标x、y,航向角 ϕ \phi ϕ和速度v
s k + 1 = F ( s k , u k ) : = f ( s k , u k ) τ + s k s_{k+1}=F(s_k,u_k):=f(s_k,u_k)\tau+s_k sk+1=F(sk,uk):=f(sk,uk)τ+sk
其中:
s k = [ x k y k ϕ k v k ] , u k = [ a k δ k ] , τ is a constant duration s_k=\begin{bmatrix}x_k\\y_k\\\phi_k\\v_k\end{bmatrix},u_k=\begin{bmatrix}a_k\\\delta_k\end{bmatrix},\tau\text{is a constant duration} sk= xkykϕkvk ,uk=[akδk],τis a constant duration
在MPC模型预测控制中,给定了每个 x k x_k xk和 y k y_k yk对应的期望值 x k r e f x_k^{ref} xkref和 y k r e f y_k^{ref} ykref,并希望加速度的变化尽可能的小,转向角的变化尽可能得小,因此可得到以下目标函数:
J ( s 1 , … , s N , u 0 , … , u N ) : = ∑ k = 1 N [ ( x k − x k r e f ) 2 + ( y k − y k r e f ) 2 + w v ( a k − a k − 1 ) 2 + w δ ( δ k − δ k − 1 ) 2 ] \color{blue}{J(s_1,\ldots,s_N,u_0,\ldots,u_N):=\sum_{k=1}^N[(x_k-x_k^\mathrm{ref})^2+(y_k-y_k^\mathrm{ref})^2+w_v(a_k-a_{k-1})^2+w_\delta(\delta_k-\delta_{k-1})^2]} J(s1,…,sN,u0,…,uN):=k=1∑N[(xk−xkref)2+(yk−ykref)2+wv(ak−ak−1)2+wδ(δk−δk−1)2]
其还需满足下面的不等式约束:
∀ k ∈ { 0 , … , N } a min ≤ a k ≤ a m a x δ m i n ≤ δ k ≤ δ m a x G ( s k , u k ) ≤ 0 v m i n ≤ v k ≤ v m a x \begin{aligned} &\forall k \in\{0,\ldots,N\} \\ &a_{\min}\leq a_{k}\leq a_{\mathrm{max}} \\ &\delta_{\mathrm{min}}\leq\delta_{k}\leq\delta_{\mathrm{max}}& G(s_k,u_k)\leq0 \\ &v_{\mathrm{min}}\leq v_{k}\leq v_{\mathrm{max}} \end{aligned} ∀k∈{0,…,N}amin≤ak≤amaxδmin≤δk≤δmaxvmin≤vk≤vmaxG(sk,uk)≤0
将上面的问题写成带约束优化的形式,如下所示:
min s 1 , … , s N , u 0 , … , u N J ( s 1 , … , s N , u 0 , … , u N ) \min_{s_1,\ldots,s_N,u_0,\ldots,u_N}J(s_1,\ldots,s_N,u_0,\ldots,u_N) s1,…,sN,u0,…,uNminJ(s1,…,sN,u0,…,uN)
s . t . F ( s k , u k ) = s k + 1 , ∀ i ∈ { 0 , … , N } G ( s k , u k ) ≤ 0 , ∀ i ∈ { 0 , … , N } \begin{aligned}\mathrm{s.t.}\quad&F(\color{black}{s_k,u_k})=\color{black}{s_{k+1}},\mathrm{~}\forall\mathrm{~}i\in\{0,\ldots,N\}\\&G(\color{black}{s_k,u_k})\leq0,\quad\forall\mathrm{~}i\in\{0,\ldots,N\}\end{aligned} s.t.F(sk,uk)=sk+1, ∀ i∈{0,…,N}G(sk,uk)≤0,∀ i∈{0,…,N}
路径点较多时,N较大,该优化问题的维度可能比较高,可以用前面介绍的PHR增广拉格朗日方法求解。另一种思路是省去上面等式约束中不必要的部分,即每个 s k s_k sk都可以用前面的s和u表示, s k s_k sk是 u 0 u_0 u0到 u k u_k uk的函数,所以它必然可以写成 u 0 u_0 u0到 u N u_N uN的函数,代入到目标函数,就可以把优化变量 s 0 s_0 s0到 s N s_N sN消去,如下所示:
min u 0 : N J ( s 1 ( u 0 : N ) , … , s N ( u 0 : N ) , u 0 : N ) s . t . G ( s k ( u 0 : N ) , u k ) ≤ 0 , ∀ i ∈ { 0 , … , N } \begin{aligned}\min_{\color{black}{u_{0:N}}}J(s_1(\color{black}{u_{0:N}}),\ldots,s_N(\color{black}{u_{0:N}}),\color{black}{u_{0:N}})\\\mathrm{s.t.~}G(s_k(\color{black}{u_{0:N}}),\color{black}{u_k})\leq0,\mathrm{~}\forall i\in\{0,\ldots,N\}\end{aligned} u0:NminJ(s1(u0:N),…,sN(u0:N),u0:N)s.t. G(sk(u0:N),uk)≤0, ∀i∈{0,…,N}
上面的优化问题同样可以通过PHR增广拉格朗日方法求取
效果演示:
参考资料:
1、数值最优化方法(高立 编著)
2、机器人中的数值优化