在移动机器人领域,轨迹跟踪控制是一个经典而重要的研究方向。两轮差速驱动机器人因其结构简单、控制灵活的特点,被广泛应用于仓储物流、服务机器人等领域。这类机器人通过调节左右轮的速度差来实现转向和移动,其运动学模型相对简单但控制算法设计却充满挑战。
我从事机器人控制算法开发多年,发现传统PID控制在处理非线性轨迹跟踪时往往表现不佳。而模型预测控制(MPC)因其能够显式处理系统约束和优化未来行为的特性,在轨迹跟踪任务中展现出显著优势。本文将分享如何基于MPC实现两轮差速机器人的多种轨迹跟踪控制,包含从运动学建模到控制器设计的完整过程。
两轮差速机器人的运动学模型是控制器设计的基础。设机器人的位姿为(x,y,θ),其中(x,y)表示机器人中心点在全局坐标系中的位置,θ表示机器人航向角。左右轮速度分别为vl和vr,轮间距为d。
根据几何关系,我们可以推导出机器人的运动学方程:
code复制ẋ = v·cosθ
ẏ = v·sinθ
θ̇ = ω
其中,v表示机器人线速度,ω表示角速度,它们与轮速的关系为:
code复制v = (vr + vl)/2
ω = (vr - vl)/d
这个模型清晰地展示了差速转向的原理:当左右轮速度相等时,机器人直线运动;当速度不等时,产生转向运动。
为了实现数字控制,我们需要将连续时间模型离散化。采用前向欧拉方法,设采样时间为Ts,离散化后的模型为:
code复制x(k+1) = x(k) + Ts·v(k)·cosθ(k)
y(k+1) = y(k) + Ts·v(k)·sinθ(k)
θ(k+1) = θ(k) + Ts·ω(k)
离散化模型将用于MPC的预测方程中。在实际应用中,采样时间的选择至关重要——过大会导致控制精度下降,过小会增加计算负担。根据我的经验,对于大多数移动机器人应用,Ts在0.05-0.1秒之间是比较合适的选择。
模型预测控制的核心思想可以概括为三个步骤:
这种滚动优化的策略使MPC能够有效处理系统约束并实现良好的跟踪性能。对于我们的轨迹跟踪问题,MPC尤其适合处理机器人的非完整约束(即不能瞬时侧向移动的限制)。
我们需要将轨迹跟踪问题表述为一个优化问题。设参考轨迹为(x_ref,y_ref),预测时域为Np,控制时域为Nc(通常Nc ≤ Np)。优化目标函数可设计为:
code复制min J = Σ[ (x(k+i)-x_ref(k+i))² + (y(k+i)-y_ref(k+i))² ] + λ·Σ[ Δu(k+i)² ]
其中,第一项惩罚跟踪误差,第二项惩罚控制量的剧烈变化(λ为权重系数),Δu表示控制增量。这个目标函数需要在系统约束下进行优化:
code复制v_min ≤ v ≤ v_max
ω_min ≤ ω ≤ ω_max
Δu_min ≤ Δu ≤ Δu_max
在实际应用中,我发现适当调整权重系数λ对控制性能影响很大。较大的λ会使控制更平滑但响应变慢,较小的λ则相反。通常需要根据具体机器人动态特性进行调试。
直线是最基本的参考轨迹。设直线方程为y=kx+b,我们可以将其离散化为一系列参考点。在MPC中,需要将这些参考点与预测时域对齐。
实现直线跟踪时,我发现初始位姿误差对控制性能影响显著。当初始航向角误差较大时,机器人需要先调整方向再跟踪直线。这种情况下,可以考虑在目标函数中增加航向角误差项:
code复制J_θ = μ·Σ(θ(k+i)-θ_ref(k+i))²
其中μ是航向误差的权重系数。通过调整μ,可以平衡位置跟踪和方向调整的需求。
圆形轨迹测试机器人的连续转向能力。设圆心为(x0,y0),半径为r,参考轨迹可表示为:
code复制x_ref = x0 + r·cos(ωt)
y_ref = y0 + r·sin(ωt)
θ_ref = atan2(ẏ_ref, ẋ_ref)
圆形跟踪的一个常见问题是当半径较小时,机器人可能因为最大角速度限制而无法精确跟踪。这时可以考虑:
对于任意复杂轨迹(如8字形、贝塞尔曲线等),我们可以将其离散化为一系列路径点。MPC控制器会逐步引导机器人通过这些点。
处理复杂轨迹时,路径曲率的变化会给跟踪带来挑战。我的经验是:
MPC优化问题最终可转化为一个二次规划(QP)问题。常用的求解器有:
在MATLAB中,可以使用quadprog函数方便地求解QP问题。对于实时性要求高的应用,可以考虑代码生成或专用QP求解器。
经过多个项目的积累,我总结出以下参数整定经验:
预测时域Np:通常选择覆盖系统主要动态的时间范围。对于移动机器人,1-2秒是合理范围(对应Np=10-40,Ts=0.1-0.05s)
控制时域Nc:一般取Np的1/3到1/2。太大会增加计算量,太小会限制控制自由度
权重系数:
约束条件:
实际系统中,干扰和模型失配不可避免。可以采取以下措施提高鲁棒性:
在MATLAB中实现MPC控制器的主要步骤包括:
matlab复制d = 0.5; % 轮间距[m]
v_max = 1.0; % 最大线速度[m/s]
omega_max = 2*v_max/d; % 最大角速度[rad/s]
matlab复制Ts = 0.1; % 采样时间[s]
Np = 20; % 预测时域
Nc = 5; % 控制时域
Q = diag([10,10,1]); % 状态权重
R = 0.1*eye(2); % 控制权重
matlab复制% 构造Hessian矩阵和梯度向量
H = blkdiag(kron(eye(Nc),R), Qf);
f = [zeros(Nc*nu,1); -Qf*x_ref(:)];
% 求解QP
options = optimoptions('quadprog','Display','off');
u_opt = quadprog(H,f,Aineq,bineq,[],[],lb,ub,[],options);
通过仿真我们可以观察到:
直线跟踪:初始误差较大时,机器人会先调整方向再跟踪直线。适当增加航向权重μ可以加快方向调整。
圆形跟踪:跟踪性能与半径密切相关。当半径小于v_max/ω_max时,会出现稳态误差。
复杂轨迹:在曲率突变处可能出现短暂偏离,通过增加预测时域或引入曲率前馈可以改善。
将算法部署到真实机器人时,需要特别注意:
当机器人动态呈现强非线性时,线性MPC可能不足。可以考虑:
将MPC扩展到多机器人系统时,需要考虑:
结合机器学习技术可以提升MPC性能:
在实际项目中,我发现MPC参数整定往往需要多次迭代。一个实用的技巧是先用全局优化算法(如遗传算法)进行粗调,再手动微调。另外,记录和分析每次实验的数据对改进控制器非常有帮助——我通常会保存完整的控制日志,包括参考轨迹、实际轨迹、控制命令和系统状态,这些数据对诊断问题和优化性能至关重要。