1. 最优控制与轨迹规划概述
在工程实践中,最优控制和轨迹规划是两个紧密相关的核心技术领域。最优控制主要解决如何设计控制策略,使系统在满足约束条件下达到最优性能指标;而轨迹规划则侧重于为移动物体(如车辆、机器人等)生成一条从起点到终点的最优路径。
这两个技术在自动驾驶、机器人导航、航空航天等领域有着广泛应用。比如自动驾驶汽车需要规划一条避开障碍物、满足车辆动力学约束的平滑路径,同时还要考虑舒适性、能耗等优化目标。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 最速降线问题求解
2.1 问题描述与物理原理
最速降线问题(Brachistochrone problem)是经典的变分问题,要求找出两点之间使质点仅受重力作用下滑时间最短的曲线。1696年由约翰·伯努利提出,其解析解是一条摆线(旋轮线)。
该问题的物理原理基于能量守恒:
- 重力势能转化为动能:mgh = 1/2mv²
- 速度与高度关系:v = √(2gy)
- 下滑时间积分:T = ∫ds/v = ∫√(1+y'²)/√(2gy) dx
2.2 数值求解实现
2.2.1 离散化方法
数值求解时,我们将连续路径离散化为N段直线:
- 设定起点(x0,y0)和终点(xf,yf)
- 将x轴均匀划分为N+1个节点
- 优化变量为中间节点的y坐标
目标函数是总下滑时间:
matlab复制function T = CostTime(y, xy0, xyf, N)
T = 0;
x = linspace(xy0(1), xyf(1), N+2);
for k = 1:N+1
dx = x(k+1) - x(k);
dy = y(k+1) - y(k);
v_avg = sqrt(9.8 * (xy0(2)-y(k)) + sqrt(9.8 * (xy0(2)-y(k+1))));
ds = sqrt(dx^2 + dy^2);
T = T + ds / v_avg;
end
end
2.2.2 优化求解
使用MATLAB的fminunc进行无约束优化:
matlab复制options = optimoptions('fminunc','Algorithm','quasi-newton','Display','iter');
y_opt = fminunc(@(y)CostTime(y,xy0,xyf,N), y_init, options);
2.2.3 结果验证
将数值解与解析解对比:
matlab复制% 摆线参数方程
theta = linspace(0,pi,100);
x_cycloid = R*(theta - sin(theta));
y_cycloid = -R*(1 - cos(theta));
plot(xs, ys, 'r*', x_cycloid, y_cycloid, 'b-');
legend('数值解','解析解');
2.3 工程应用与扩展
最速降线原理可应用于:
- 过山车轨道设计
- 物料输送滑道优化
- 紧急疏散通道设计
实际应用中还需考虑:
- 摩擦力的影响
- 多段曲线的拼接
- 三维空间中的扩展
3. 倒立摆控制实现
3.1 系统建模
倒立摆是典型的非线性欠驱动系统,其动力学方程可通过拉格朗日力学推导:
matlab复制function dz = cartPoleDynamics(z, F)
% z = [x; q; dx; dq]
g = 9.8; l = 1; m1 = 1; m2 = 0.3;
% 动力学方程
ddx = (F + m2*l*sin(q)*dq^2 - m2*g*cos(q)*sin(q))/(m1 + m2*sin(q)^2);
ddq = (g/l*sin(q) - cos(q)/l*ddx);
dz = [dx; dq; ddx; ddq];
end
3.2 最优控制问题构建
3.2.1 决策变量
- 状态变量:X = [x; q; dx; dq] ∈ R^(4×(N+1))
- 控制变量:U = [F] ∈ R^(1×N)
3.2.2 约束条件
- 初始状态:X(:,1) = [0; 0; 0; 0]
- 终端状态:X(:,end) = [0; pi; 0; 0]
- 动力学约束:X(:,k+1) = f(X(:,k), U(:,k))
- 控制力限制:-20 ≤ F ≤ 20
3.2.3 目标函数
最小化控制能量:
math复制J = ∑_{k=1}^N F_k^2
3.3 数值求解实现
使用CasADi构建优化问题:
matlab复制import casadi.*
% 定义优化变量
X = MX.sym('X', 4, N+1);
U = MX.sym('U', 1, N);
% 构建约束
g = [];
for k = 1:N
x_next = rk4(@(t,x,u)cartPoleDynamics(x,u), dt, X(:,k), U(:,k));
g = [g; x_next - X(:,k+1)]; % 动力学约束
end
% 构建NLP问题
nlp = struct('x', [X(:); U(:)], 'f', sum(U.^2), 'g', g);
solver = nlpsol('solver', 'ipopt', nlp);
3.4 实际应用技巧
-
初始猜测策略:
- 先用简单控制器(如LQR)生成初始轨迹
- 逐步增加控制时间T
-
收敛性改进:
- 适当松弛终端约束
- 添加正则化项
-
实时控制:
- 采用模型预测控制(MPC)框架
- 在线求解时限制最大迭代次数
4. 车辆轨迹规划技术
4.1 运动学模型
车辆采用Ackermann转向模型:
matlab复制function x_next = vehicleKinematics(x, u, dt)
% x = [px, py, theta, v]
% u = [a, delta]
L = 2.8; % 轴距
x_next = x + dt * [
x(4)*cos(x(3));
x(4)*sin(x(3));
x(4)/L * tan(u(2));
u(1)
];
end
4.2 路径规划问题构建
4.2.1 避障约束处理
对于每个障碍物,计算安全边界:
matlab复制function [ll, lu] = calcBoundary(vehpos, ob, obw, obl)
% 计算障碍物到参考线的横向距离
d = (ob(2)-vehpos(2))*cos(theta_ref) - (ob(1)-vehpos(1))*sin(theta_ref);
% 计算安全边界
ll = d - obl/2 - safety_margin;
lu = d + obl/2 + safety_margin;
end
4.2.2 优化问题形式化
决策变量:
- 状态序列:X = [px, py, θ, v] ∈ R^(4×(N+1))
- 控制序列:U = [a, δ] ∈ R^(2×N)
目标函数:
math复制J = w₁∑(px-ref_x)² + w₂∑(py-ref_y)² + w₃∑a² + w₄∑δ²
4.3 参考线平滑算法
4.3.1 问题建模
给定原始参考点{pi},优化平滑点{qi}:
目标函数:
math复制J = α∑‖qi-pi‖² + β∑‖q_{i-1}-2qi+q_{i+1}‖² + γ∑‖qi+1-qi‖²
约束条件:
- 曲率约束:κ(qi) ≤ κ_max
- 边界约束:qi ∈ 安全区域
4.3.2 二次规划形式
将问题转化为QP:
matlab复制H = α*P'*P + β*D2'*D2 + γ*D1'*D1;
f = -2*α*P'*p_ref;
A = [A_curv; A_bound];
b = [b_curv; b_bound];
[x_opt, ~, exitflag] = quadprog(H, f, A, b, Aeq, beq, lb, ub);
4.4 Lattice规划器实现
4.4.1 横向规划
决策变量:
- 横向偏移:l ∈ R^(N+1)
- 横向速度:dl ∈ R^(N+1)
- 横向加速度:ddl ∈ R^(N+1)
目标函数:
math复制J = ∑l² + w₁∑dl² + w₂∑ddl²
4.4.2 约束处理
-
边界约束:
matlab复制for k = 1:N+1 g = [g; l(k) - lu(k)]; % 上界 g = [g; ll(k) - l(k)]; % 下界 end -
动力学约束:
matlab复制for k = 1:N g = [g; l(k+1) - (l(k) + dl(k)*dt + 0.5*ddl(k)*dt^2)]; g = [g; dl(k+1) - (dl(k) + ddl(k)*dt)]; end
5. 工程实践建议
5.1 求解器选择与配置
-
IPOPT配置建议:
matlab复制opts.ipopt = struct(... 'max_iter', 5000, ... 'tol', 1e-6, ... 'linear_solver', 'mumps', ... 'hessian_approximation', 'limited-memory'); -
实时性优化:
- 使用热启动(warm start)
- 限制最大迭代次数
- 降低求解精度要求
5.2 数值稳定性处理
-
尺度化:
matlab复制% 状态尺度化 x_scaled = x ./ [10; 10; pi; 5]; u_scaled = u ./ [2; 0.5]; -
正则化:
- 在Hessian矩阵中添加小量对角元素
- 目标函数添加小权重正则项
5.3 代码优化技巧
-
CasADi高效使用:
matlab复制% 使用map加速循环 dyn_func = Function('dyn', {x,u}, {x_next}); F = dyn_func.mapaccum(N); -
并行计算:
- 使用parfor并行计算约束
- 将问题分解为多个子问题
6. 扩展应用方向
6.1 多车协同规划
-
冲突检测:
- 时空走廊约束
- 优先级分配策略
-
分布式优化:
- ADMM算法框架
- 共识优化问题
6.2 动态环境适应
-
滚动时域规划:
- 周期性重规划
- 预测障碍物运动
-
应急策略:
- 紧急制动轨迹
- 最小风险路径
6.3 机器学习结合
-
学习型预测:
- 用NN预测障碍物行为
- 学习复杂动力学模型
-
强化学习:
- 策略网络初始化
- 混合优化框架
在实际项目中,我们通常需要根据具体场景选择合适的技术组合。比如在停车场自动泊车场景中,可能需要结合最优控制进行轨迹生成,同时使用Lattice规划器处理狭窄空间内的避障问题。关键是要深入理解各方法的优缺点,才能做出合理的技术选型。
