轨迹跟踪—线性 MPC 控制算法
轨迹跟踪—线性 MPC 控制算法
在自动驾驶和无人车领域的路径规划常常被分为运动轨迹生成与车辆路径跟踪控制两个部分。传统的基于几何条件的跟踪算法如pure-pursuit由于没有考虑车辆运动学导致控制精度和稳定性等方面存在不足,因此目前大部分采用线性MPC控制算法,从而平衡控制精度与计算量。
本文首先介绍通用的MPC控制流程,对这一基于优化的控制理论有一定的认知。然后对常见的差速运动模型和自行车模型进行运动学分析,接着针对轨迹跟踪问题介绍如何将通用MPC算法应用至轨迹跟踪问题。最后基于开源代码对整体代码流程进行进一步的理解。
MPC控制算法
状态量zzz:系统的状态(也可认为是系统输出量),通常可以构成一个空间,如车辆状态(x,y,θ)T∈SE2(x,y,\theta)^T \in SE2(x,y,θ)T∈SE2
控制量uuu:系统的输入量,不同的系统模型有不同的控制参数
系统模型:描述系统输入与输出的精确关系,通常是非线性的关系。
采用增量的形式对系统模型进行表达:
zk+1=f(zk)+g(uk)z_{k+1} = f(z_k) + g(u_k) zk+1=f(zk)+g(uk)
线性系统模型:系统模型的线性化结果,用于近似求解,具有速度快、不会陷入局部极值的优势。
zk+1=A∗zk+B∗uk+Cz_{k+1} = A * z_{k} + B * u_k + C zk+1=A∗zk+B∗uk+C
其中,矩阵A,BA,BA,B的求解过程如下:
- 非线性模型离散化
zk+1=zk+zk˙(zk,uk)dtz_{k+1}=z_{k} + \dot{z_k}(z_k, u_k)dtzk+1=zk+zk˙(zk,uk)dt - 在zˉ,uˉ\bar{z},\bar{u}zˉ,uˉ位置进行泰勒展开
zk+1=zk+(zk˙(zˉ,uˉ)+∂zk˙∂z(zk−zˉ)+∂zk˙∂u(uk−uˉ))dtz_{k+1} = z_k + (\dot{z_k}(\bar{z},\bar{u}) + \frac{\partial \dot{z_k}}{\partial z}(z_k - \bar{z}) + \frac{\partial \dot{z_k}}{\partial u}(u_k - \bar{u}))dtzk+1=zk+(zk˙(zˉ,uˉ)+∂z∂zk˙(zk−zˉ)+∂u∂zk˙(uk−uˉ))dt
zk+1=(I+dt∂zk˙∂z)zk+dt∂zk˙∂uuk+(zk˙(zˉ,uˉ)−∂zk˙∂zzˉ−∂zk˙∂uuˉ)dtz_{k+1} = (I+dt\frac{\partial \dot{z_k}}{\partial z}) z_k + dt\frac{\partial \dot{z_k}}{\partial u}u_k + (\dot{z_k}(\bar{z},\bar{u}) - \frac{\partial \dot{z_k}}{\partial z}\bar{z} - \frac{\partial \dot{z_k}}{\partial u} \bar{u})dtzk+1=(I+dt∂z∂zk˙)zk+dt∂u∂zk˙uk+(zk˙(zˉ,uˉ)−∂z∂zk˙zˉ−∂u∂zk˙uˉ)dt
因此有:
A=(I+dt∂zk˙∂z)A=(I+dt\frac{\partial \dot{z_k}}{\partial z})A=(I+dt∂z∂zk˙)
B=dt∂zk˙∂uB=dt\frac{\partial \dot{z_k}}{\partial u}B=dt∂u∂zk˙
C=(zk˙(zˉ,uˉ)−∂zk˙∂zzˉ−∂zk˙∂uuˉ)dtC=(\dot{z_k}(\bar{z},\bar{u}) - \frac{\partial \dot{z_k}}{\partial z}\bar{z} - \frac{\partial \dot{z_k}}{\partial u} \bar{u})dtC=(zk˙(zˉ,uˉ)−∂z∂zk˙zˉ−∂u∂zk˙uˉ)dt - 对于导数∂zk˙∂z,∂zk˙∂u\frac{\partial \dot{z_k}}{\partial z},\frac{\partial \dot{z_k}}{\partial u}∂z∂zk˙,∂u∂zk˙,则需要根据具体模型得到。
目标函数:系统的期望状态,即当前控制系统最优的、理想的目标,采用最小化或最大化某个函数表达。
例如,对于轨迹跟踪问题:
1)跟踪的误差尽可能小
2)加速度尽量小,保证运动平滑
3)…
约束项:系统状态的先验约束(硬约束,一定不能违背的部分)
例如,
1)初始状态不变
2)满足线性模型
3)…
问题求解
问题:在满足约束条件的前提下,计算得到最优的控制量uuu,使得目标函数最小。
具体来说就是将问题转换为二次规划问题即,
- 目标函数用状态量表达 + 线性模型表达成一个二次函数形式。
- 约束用状态量线性函数表达
由于模型被线性化,因此得到的目标函数总是一个多维二次函数,而约束条件为线性的。因此本问题可以直接采用二次规划的方法进行求解。具体可参考凸优化、数值优化等书籍。
具体的例子将在后续进行分析。
车辆运动学
自行车模型
状态向量
z=[x,y,v,ϕ]Tz = [x,y,v,\phi]^T z=[x,y,v,ϕ]T
其中,x,y,ϕx,y,\phix,y,ϕ为车辆在世界坐标系下的位置及角度。vvv为车辆当前的速度。
控制量
u=[a,δ]Tu = [a, \delta]^T u=[a,δ]T
其中,aaa为车辆加速度,而δ\deltaδ为前轮转向角度
自行车模型如下图所示:
根据几何关系有
vx=vcos(θ)v_x=v \cos(\theta)vx=vcos(θ)vy=vsin(θ)v_y=v \sin(\theta)vy=vsin(θ)
R=Ltan(δ)R = \frac{L}{\tan(\delta)}R=tan(δ)L
且有
ω=vR=vtanδL\omega=\frac{v}{R}=\frac{v \tan{\delta}}{L}ω=Rv=Lvtanδ
状态向量的导数
z˙=[vcos(ϕ)vsin(ϕ)avtanδL]\dot{z} = \left[\begin{matrix} v \cos(\phi) \\ v \sin(\phi)\\ a \\ \frac{v \tan{\delta}}{L} \end{matrix}\right] z˙=⎣⎢⎢⎡vcos(ϕ)vsin(ϕ)aLvtanδ⎦⎥⎥⎤
因此有:
∂z˙∂z=[00cos(ϕ)−vsin(ϕ)00sin(ϕ)vcos(ϕ)000000tanδL0]\frac{\partial \dot{z}}{\partial z}=\left[\begin{matrix} 0 & 0 & cos(\phi) & -v \sin(\phi) \\ 0 & 0 & sin(\phi) & v \cos(\phi)\\ 0 & 0 & 0 & 0\\ 0 & 0 & \frac{\tan{\delta}}{L} & 0 \end{matrix}\right]∂z∂z˙=⎣⎢⎢⎡00000000cos(ϕ)sin(ϕ)0Ltanδ−vsin(ϕ)vcos(ϕ)00⎦⎥⎥⎤
∂z˙∂u=[0000100vLcos2(δ)]\frac{\partial \dot{z}}{\partial u}=\left[\begin{matrix} 0 & 0 \\ 0 & 0 \\ 1 & 0 \\ 0 & \frac{v}{L \cos^2(\delta)} \end{matrix}\right]∂u∂z˙=⎣⎢⎢⎡0010000Lcos2(δ)v⎦⎥⎥⎤
最终得到线性模型:
zk+1=A∗zk+B∗uk+Cz_{k+1} = A * z_{k} + B * u_k + C zk+1=A∗zk+B∗uk+C
A=(I+dt∂zk˙∂z)=[10cos(ϕ)dt−vsin(ϕ)dt01sin(ϕ)dtvcos(ϕ)dt001000tanδLdt1]A = (I+dt\frac{\partial \dot{z_k}}{\partial z})=\left[\begin{matrix} 1 & 0 & cos(\phi)dt & -v \sin(\phi) dt\\ 0 & 1 & sin(\phi)dt & v \cos(\phi) dt\\ 0 & 0 & 1 & 0\\ 0 & 0 & \frac{\tan{\delta}}{L} dt & 1 \end{matrix}\right] A=(I+dt∂z∂zk˙)=⎣⎢⎢⎡10000100cos(ϕ)dtsin(ϕ)dt1Ltanδdt−vsin(ϕ)dtvcos(ϕ)dt01⎦⎥⎥⎤
B=dt∂zk˙∂u=[0000dt00vLcos2(δ)dt]B=dt\frac{\partial \dot{z_k}}{\partial u}=\left[\begin{matrix} 0 & 0 \\ 0 & 0 \\ dt & 0 \\ 0 & \frac{v}{L \cos^2(\delta)} dt \end{matrix}\right] B=dt∂u∂zk˙=⎣⎢⎢⎡00dt0000Lcos2(δ)vdt⎦⎥⎥⎤
C=(zk˙(zˉ,uˉ)−∂zk˙∂zzˉ−∂zk˙∂uuˉ)dt=[vsin(ϕ)ϕdt−vcos(ϕ)ϕdt0−vδLcos2(δ)dt]C=(\dot{z_k}(\bar{z},\bar{u}) - \frac{\partial \dot{z_k}}{\partial z}\bar{z} - \frac{\partial \dot{z_k}}{\partial u} \bar{u})dt=\left[\begin{matrix} v \sin(\phi)\phi dt\\ -v \cos(\phi)\phi dt \\ 0 \\ -\frac{v\delta}{L\cos^2(\delta)} dt \end{matrix}\right]C=(zk˙(zˉ,uˉ)−∂z∂zk˙zˉ−∂u∂zk˙uˉ)dt=⎣⎢⎢⎡vsin(ϕ)ϕdt−vcos(ϕ)ϕdt0−Lcos2(δ)vδdt⎦⎥⎥⎤
差速模型
状态向量
z=[x,y,ϕ]Tz = [x,y,\phi]^T z=[x,y,ϕ]T
其中,x,y,ϕx,y,\phix,y,ϕ为车辆在世界坐标系下的位置及角度。
控制量
u=[vr,vl]Tu = [v_r, v_l]^T u=[vr,vl]T
分别为左轮速度vlv_lvl和右轮速度vrv_rvr。
状态向量的导数
z˙=[vr+vl2cos(ϕ)vr+vl2sin(ϕ)vr−vlD]\dot{z} = \left[\begin{matrix} \frac{v_r + v_l}{2}\cos(\phi) \\ \frac{v_r + v_l}{2} \sin(\phi)\\ \frac{v_r - v_l}{D} \end{matrix}\right] z˙=⎣⎡2vr+vlcos(ϕ)2vr+vlsin(ϕ)Dvr−vl⎦⎤
因此有:
∂z˙∂z=[00−vr+vl2sin(ϕ)00vr+vl2cos(ϕ)000]\frac{\partial \dot{z}}{\partial z}=\left[\begin{matrix} 0 & 0 & -\frac{v_r + v_l}{2} \sin(\phi) \\ 0 & 0 & \frac{v_r + v_l}{2} \cos(\phi) \\ 0 & 0 & 0 \\ \end{matrix}\right]∂z∂z˙=⎣⎡000000−2vr+vlsin(ϕ)2vr+vlcos(ϕ)0⎦⎤
∂z˙∂u=[cos(ϕ)2cos(ϕ)2sin(ϕ)2sin(ϕ)21D−1D]\frac{\partial \dot{z}}{\partial u}=\left[\begin{matrix} \frac{\cos(\phi)}{2} & \frac{\cos(\phi)}{2} \\ \frac{\sin(\phi)}{2} & \frac{\sin(\phi)}{2} \\ \frac{1}{D} & -\frac{1}{D} \\ \end{matrix}\right]∂u∂z˙=⎣⎡2cos(ϕ)2sin(ϕ)D12cos(ϕ)2sin(ϕ)−D1⎦⎤
最终得到线性模型:
zk+1=A∗zk+B∗uk+Cz_{k+1} = A * z_{k} + B * u_k + C zk+1=A∗zk+B∗uk+C
A=(I+dt∂zk˙∂z)=[10−vr+vl2sin(ϕ)dt01vr+vl2cos(ϕ)dt001]A = (I+dt\frac{\partial \dot{z_k}}{\partial z})=\left[\begin{matrix} 1 & 0 & -\frac{v_r + v_l}{2} \sin(\phi) dt \\ 0 & 1 & \frac{v_r + v_l}{2} \cos(\phi) dt\\ 0 & 0 & 1 \\ \end{matrix}\right] A=(I+dt∂z∂zk˙)=⎣⎡100010−2vr+vlsin(ϕ)dt2vr+vlcos(ϕ)dt1⎦⎤
B=dt∂zk˙∂u=[cos(ϕ)2dtcos(ϕ)2dtsin(ϕ)2dtsin(ϕ)2dt1Ddt−1Ddt]B=dt\frac{\partial \dot{z_k}}{\partial u}=\left[\begin{matrix} \frac{\cos(\phi)}{2} dt & \frac{\cos(\phi)}{2} dt \\ \frac{\sin(\phi)}{2} dt & \frac{\sin(\phi)}{2} dt \\ \frac{1}{D} dt & -\frac{1}{D} dt \\ \end{matrix}\right] B=dt∂u∂zk˙=⎣⎡2cos(ϕ)dt2sin(ϕ)dtD1dt2cos(ϕ)dt2sin(ϕ)dt−D1dt⎦⎤
C=(zk˙(zˉ,uˉ)−∂zk˙∂zzˉ−∂zk˙∂uuˉ)dt=[vr+vl2sin(ϕ)ϕdt−vr+vl2cos(ϕ)ϕdt0]C=(\dot{z_k}(\bar{z},\bar{u}) - \frac{\partial \dot{z_k}}{\partial z}\bar{z} - \frac{\partial \dot{z_k}}{\partial u} \bar{u})dt=\left[\begin{matrix} \frac{v_r + v_l}{2}\sin(\phi)\phi dt\\ -\frac{v_r + v_l}{2} \cos(\phi)\phi dt \\ 0 \end{matrix}\right]C=(zk˙(zˉ,uˉ)−∂z∂zk˙zˉ−∂u∂zk˙uˉ)dt=⎣⎡2vr+vlsin(ϕ)ϕdt−2vr+vlcos(ϕ)ϕdt0⎦⎤
算法流程
将控制时间以dtdtdt的间隔进行离散成t0−t3t_0-t_3t0−t3四个时刻。根据上一次优化得到的控制量u0−u2u_0-u_2u0−u2能够根据非线性模型预测得到四个时刻的状态即x0−x3x_0-x_3x0−x3。并且由参考轨迹给出参考位置xref,0−3x_{ref,0-3}xref,0−3
目标函数:
控制量尽可能小
cost1=∥u0∥2+∥u1∥2+∥u2∥2cost_1 = \|u_0\|^2+\|u_1\|^2+\|u_2\|^2cost1=∥u0∥2+∥u1∥2+∥u2∥2控制量的变化尽可能小
cost2=∥u1−u0∥2+∥u2−u1∥2cost_2 = \|u_1 - u_0\|^2+\|u_2-u_1\|^2cost2=∥u1−u0∥2+∥u2−u1∥2中间状态均尽可能接近目标状态
cost3=∥xref,0−x0∥+∥xref,1−x1∥+∥xref,2−x2∥cost_3=\|x_{ref,0} - x_0\|+\|x_{ref,1} - x_1\|+\|x_{ref,2} - x_2\|cost3=∥xref,0−x0∥+∥xref,1−x1∥+∥xref,2−x2∥结束状态尽可能接近目标状态(权重更大)
cost4=∥xref,3−x3∥2cost_4=\|x_{ref,3} - x_3\|^2cost4=∥xref,3−x3∥2
最终目标为加权和:
cost=w1⋅cost1+w2⋅cost2+w3⋅cost3+w4⋅cost4cost = w_1 \cdot cost_1 + w_2 \cdot cost_2 + w_3 \cdot cost_3 + w_4 \cdot cost_4 cost=w1⋅cost1+w2⋅cost2+w3⋅cost3+w4⋅cost4
约束条件:
- 满足线性模型 xt+1=Axt+But+Cx_{t+1}=A x_t + B u_t + Cxt+1=Axt+But+C
x1=A0x0+B0u0+C0x2=A1x1+B1u1+C1x3=A2x2+B2u2+C2x_1 = A_0 x_0 + B_0 u_0 + C_0\\ x_2 = A_1 x_1 + B_1 u_1 + C_1 \\ x_3 = A_2 x_2 + B_2 u_2 + C_2 x1=A0x0+B0u0+C0x2=A1x1+B1u1+C1x3=A2x2+B2u2+C2
其中,A0−2,B0−2,C0−2A_{0-2},B_{0-2},C_{0-2}A0−2,B0−2,C0−2分别为模型在xˉ0−2\bar{x}_{0-2}xˉ0−2处,分别进行泰勒展开计算得到。而 xˉ0−2\bar{x}_{0-2}xˉ0−2则为根据上一次优化结果预测系统在t0−2t_{0-2}t0−2时刻的状态。 - 控制量的变化小于最大允许值 ∣ut+1−ut∣<maxu⋅dt|u_{t+1}-u_t|<max_{u}\cdot dt∣ut+1−ut∣<maxu⋅dt
- 初始状态始终保持不变 x0=xlast,0x_0=x_{last,0}x0=xlast,0
- 其他
- 最大、最小速度约束
- 最大控制量约束
求解:
cost=w1⋅cost1+w2⋅cost2+w3⋅cost3+w4⋅cost4=w1⋅(∥u0∥2+∥u1∥2+∥u2∥2)+w2⋅(∥u1−u0∥2+∥u2−u1∥2)+w3⋅(∥xref,0−x0∥2+∥xref,1−x1∥2+∥xref,2−x2∥2)+w4⋅∥xref,3−x3∥2\begin{aligned} cost = & w_1 \cdot cost_1 + w_2 \cdot cost_2 + w_3 \cdot cost_3 + w_4 \cdot cost_4 \\ =&w_1 \cdot (\|u_0\|^2+\|u_1\|^2+\|u_2\|^2) + \\ &w_2 \cdot (\|u_1 - u_0\|^2+\|u_2-u_1\|^2) + \\ &w_3 \cdot (\|x_{ref,0} - x_0\|^2+\|x_{ref,1} - x_1\|^2+\|x_{ref,2} - x_2\|^2) + \\ & w_4 \cdot \|x_{ref,3} - x_3\|^2 \end{aligned}cost==w1⋅cost1+w2⋅cost2+w3⋅cost3+w4⋅cost4w1⋅(∥u0∥2+∥u1∥2+∥u2∥2)+w2⋅(∥u1−u0∥2+∥u2−u1∥2)+w3⋅(∥xref,0−x0∥2+∥xref,1−x1∥2+∥xref,2−x2∥2)+w4⋅∥xref,3−x3∥2
其中前两项为[u0,u1,u2]T[u_0,u_1,u_2]^T[u0,u1,u2]T的二次函数,后面两项中有:
x0=xlast,0=constx1=A0x0+B0u0+C0=B0u0+C0′x2=A1x1+B1u1+C1=A1(B0u0+C0′)+B1u1+C1=A1B0u0+B1u1+C1′x3=A2x2+B2u2+C2=A2(A1B0u0+B1u1+C1′)+B2u2+C2=A2A1B0u1+A2B1u0+B2u2+C2′\begin{aligned} x_0 &= x_{last,0} = const \\ x_1 &= A_0 x_0 + B_0 u_0 +C_0 = B_0u_0 + C^{'}_0 \\ x_2 &= A_1 x_1 + B_1 u_1 +C_1 = A_1 (B_0u_0 + C^{'}_0) + B_1 u_1 +C_1 \\ &= A_1 B_0 u_0 +B_1 u_1 + C^{'}_1\\ x_3 &= A_2 x_2 + B_2 u_2 +C_2=A_2 (A_1 B_0 u_0 +B_1 u_1 + C^{'}_1) + B_2 u_2 +C_2 \\ &= A_2A_1B_0 u_1 + A_2 B_1 u_0 + B_2 u2 + C^{'}_2 \end{aligned}x0x1x2x3=xlast,0=const=A0x0+B0u0+C0=B0u0+C0′=A1x1+B1u1+C1=A1(B0u0+C0′)+B1u1+C1=A1B0u0+B1u1+C1′=A2x2+B2u2+C2=A2(A1B0u0+B1u1+C1′)+B2u2+C2=A2A1B0u1+A2B1u0+B2u2+C2′
因此后面两项均同样为[u0,u1,u2]T[u_0,u_1,u_2]^T[u0,u1,u2]T的二次函数,因此代价函数整体都是二次的,可直接采用二次规划算法进行求解。
轨迹跟踪—线性 MPC 控制算法相关推荐
- MPC算法轨迹跟踪控制资源
点击文末卡片,加入会员全年无限制学习后台(MPC各矩阵的底层逻辑.MPC纵向控制.模型验证.MPC自适应巡航控制.非线性系统如何线性化及MPC动力学跟踪任何轨迹.约束添加及新求解器的求解.轨迹规划.纵 ...
- 基于运动学模型的轨迹跟踪控制
章四 基于运动学模型的轨迹跟踪控制 MPC(4)基于运动学模型的轨迹跟踪控制器设计 无人驾驶车辆模型预测控制(龚建伟)第四章 基于运动学模型的轨迹跟踪控制(仿真部分) 无人车辆在惯性坐标系中,车辆必须 ...
- 1、MPC 算法(模型预测控制算法(MPC算法)轨迹跟踪控制)
MPC 跟踪圆形轨迹/直线轨迹 MPC 跟踪双移线轨迹 MPC 进行局部路径规划+轨迹跟踪 MPC跟踪直线轨迹 N MPC 对直线轨迹进行跟踪 MPC 算法跟踪五次多项式曲线 以上为目录 推荐学习的软 ...
- 基于动力学模型的无人驾驶车辆MPC轨迹跟踪算法及carsim+matlab联合仿真学习笔记
目录 1 模型推导及算法分析 1.1 模型推导 1.1.1 车辆动力学模型 1.1.2 线性时变预测模型推导 1.2 模型预测控制器设计 1.2.1 目标函数设计 1.2.2 约束设计 2 代码解析 ...
- 无人车系统(十一):轨迹跟踪模型预测控制(MPC)原理与python实现【40行代码】
前面介绍的PID,pure pursuit方法,Stanley方法都只是利用当前的系统误差来设计控制器.人们对这些控制器的设计过程中都利用了构建模型对无人车未来状态的估计(或者说利用模型估计未来的运动 ...
- MPC实现自动驾驶轨迹跟踪
本文继MPC运动学方法实现轨迹跟踪推导进行matlab代码实现,虽然你们找到的参考书都是simulink carsim联仿,我却坚持使用纯代码仿真,因为牛逼. 代码模板沿用了LQR轨迹跟踪算法Pyth ...
- 基于MPC的移动机器人轨迹跟踪控制qpOASES例程
参考了 一个模型预测控制(MPC)的简单实现 https://www.cnblogs.com/zhjblogs/p/13880682.html 与 基于MPC的移动机器人轨迹跟踪控制matlab例程 ...
- 使用webots的MPC的移动机器人轨迹跟踪控制
上一篇文章中使用MPC对机器人的一个方向自由度进行了控制, 基于MPC的移动机器人轨迹跟踪控制qpOASES例程 现在使用速度与角速度对机器人进行平面运动控制. 所以机器人的控制量为U=[v ;w], ...
- ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试
ROS功能包|mav_control_rw(基于MPC的无人机轨迹跟踪控制)---gazebo仿真测试 gazebo仿真测试 gazebo仿真测试 启动gazebo并加载无人机模型 $ roslaun ...
- MPC轨迹跟踪——基于ROS系统和全向车实验平台
前言 之前写过一次MPC,但代码框架非常杂乱,所以做出了更新.内存大一点吧,我的虚拟机内存8G,跑过一次仿真,后面重启就打不开了.建议备份一个新的虚拟机来跑仿真. 思路 思路就是/path_palnn ...
最新文章
- Android依赖注入:Google Guice on Android的使用及相关资源
- 【书评】OSPF Anatomy of an Internet Routing Protocol
- 阿里云应用性能管理(APM)产品-应用实时监控服务(ARMS)技术解密 资料下载...
- UVa272 - TEX Quotes(输入输出)
- Flask Vue.js全栈开发
- Gh0st 3.6 存在的BUG及修改方法(收集整理)
- jdk中java_怎样使用JavaJDK中Java?
- [弹性力学]弹力与材力的同一变量的规定正方向的不同导致公式中个别符号不同
- JDK1.8下载与安装及环境变量配置
- IPVS之Bypass转发模式
- 图片处理view - 成图,
- ug计算机环境变量,ug80添加中文环境变量的具体方法
- cnchar - 功能全面、支持多端的汉字拼音笔画开源 JS 库
- 史诗级Java入门教程,想成为初级程序员看他就够了
- 中国新一代超级安全核燃料材料入堆辐照试验开始
- 腾讯云轻量应用服务器免费升级2核4G8M升级4核4G8M不花钱
- HTML css实现翻页效果,一个纯CSS3实现的酷炫翻书效果
- Codeforces Round #548 (Div. 2), problem: (C) Edgy Trees 【并查集+快速幂】
- 【unbuntu gpt 硬盘的挂载方法】
- ubuntu的分辨率突然变得很奇怪或者ubuntu 上qq无法打开
热门文章
- 灵格斯怎么屏幕取词_灵格斯词霸怎么用?灵格斯词霸使用手册
- 优化1——数据库优化面试题
- python大漠插件官网视频教程_python调用大漠插件教程01注册大漠
- pyqt5 加载gif_PyQt5:在Qmovi中重新加载gif
- 软件设计过程--概要设计详细设计
- wordpress自动采集插件wp-autopost-pro 3.7.8 完美绿色版
- 综合布线实训室解决方案(转载)
- H5网页实现微信分享,分享朋友圈功能(分享带图片,附源码)
- 系统分析与设计-(二)系统规划
- java封装继承多态实验总结_java封装继承多态理解3000字论文