差速移动机器人作为一种常见的轮式机器人平台,广泛应用于仓储物流、服务机器人、工业自动化等领域。这类机器人通常由两个独立驱动的轮子和一个或多个支撑轮组成,通过调节左右轮的转速差实现转向控制。在实际应用中,如何让机器人精确跟踪预定轨迹是一个关键问题。
滑模控制(Sliding Mode Control, SMC)因其对系统参数变化和外部干扰具有较强的鲁棒性,特别适合应用于移动机器人的轨迹跟踪控制。我在多个工业机器人项目中采用这种控制方法,发现它能在存在建模误差和外部扰动的情况下,依然保持较好的跟踪性能。
差速机器人的运动学模型可以用以下方程描述:
code复制ẋ = v * cosθ
ẏ = v * sinθ
θ̇ = ω
其中:
这个模型假设机器人在平面上运动且无侧滑,适用于大多数室内平坦地面的应用场景。在实际项目中,我通常会在此基础上增加10-15%的速度裕量来应对地面摩擦力的变化。
在Simulink中实现这个模型时,我建议采用以下结构:
特别注意θ角的处理,需要周期性地将其归一到[-π,π]范围内,避免数值计算问题。我在实际项目中遇到过因角度未归一化导致的控制器失稳情况。
滑模控制的核心思想是设计一个滑模面,使得系统状态能在有限时间内到达该滑模面,并沿滑模面向平衡点滑动。对于差速机器人,我通常采用解耦设计:
这种解耦方式虽然从理论上不是完全精确的,但在工程实践中被证明是有效的,我在三个不同的机器人平台上都成功应用过这种设计。
滑模控制器的MATLAB函数代码如下:
matlab复制function [v_cmd, w_cmd] = smc_controller(x_ref, y_ref, theta_ref, x_act, y_act, theta_act, v_ref)
% 参数设置
k_x = 2.0; % 纵向误差增益
k_y = 3.0; % 横向误差增益
k_theta = 5.0; % 角度误差增益
epsilon = 0.5; % 切换增益
delta = 0.1; % 边界层厚度
% 坐标变换
ex_g = x_ref - x_act;
ey_g = y_ref - y_act;
etheta_g = theta_ref - theta_act;
% 角度归一化
etheta_g = mod(etheta_g + pi, 2*pi) - pi;
% 转换到局部坐标系
ex = ex_g * cos(theta_act) + ey_g * sin(theta_act);
ey = -ex_g * sin(theta_act) + ey_g * cos(theta_act);
etheta = etheta_g;
% 角速度控制
if abs(etheta) < 1e-4
sin_term = 1.0;
else
sin_term = sin(etheta)/etheta;
end
w_linear = k_theta * etheta + v_ref * k_y * ey * sin_term;
w_switch = epsilon * sat(etheta / delta);
w_cmd = w_linear + w_switch;
% 线速度控制
v_linear = v_ref + k_x * ex;
v_switch = epsilon * sat(ex / delta);
v_cmd = v_linear + v_switch;
% 输出限幅
v_max = 1.5; w_max = 1.0;
v_cmd = max(min(v_cmd, v_max), -v_max);
w_cmd = max(min(w_cmd, w_max), -w_max);
end
function y = sat(u)
% 饱和函数
y = min(max(u, -1), 1);
end
根据我的项目经验,控制器参数可按以下原则调整:
在实际调试时,我通常先设置k_theta使航向快速收敛,再调整k_y消除横向误差,最后微调k_x。epsilon一般取0.3-0.8之间,delta取0.05-0.2。
完整的Simulink模型应包含以下主要部分:
我在项目中总结的高效建模流程是:
对于测试目的,我推荐使用以下两种轨迹:
matlab复制x_ref = R * cos(ω*t);
y_ref = R * sin(ω*t);
θ_ref = ω*t + π/2;
v_ref = R * ω;
matlab复制x_ref = v_ref * t;
y_ref = 0;
θ_ref = 0;
在实际项目中,我会先用简单的直线轨迹验证基本功能,再用圆形轨迹测试转向性能,最后导入实际需要的复杂轨迹。
典型的仿真结果应包括:
从我的经验来看,良好的控制效果应表现为:
抖振问题:
大角度转向不灵敏:
速度饱和:
我在一个AGV项目中就曾因忽略电机响应延迟导致控制效果不理想,后来通过增加一阶延迟补偿解决了这个问题。
对于需要精确速度控制或负载变化大的应用,可以在运动学控制外环增加动力学控制内环。我的经验是采用PID或自适应控制作为内环,滑模控制作为外环。
在多机器人系统中,可以在现有控制器基础上增加:
可以考虑将滑模控制与以下方法结合:
我在一个研究项目中尝试过模糊滑模控制,取得了比传统滑模更好的控制效果。