水下机器人控制中的增量PID轨迹跟踪:基于MATLAB仿真的无人船无人艇USV路径跟随
AUV 增量PID轨迹跟踪 MATLAB仿真 水下机器人控制 无人船无人艇 USV路径跟随
最近在搞水下机器人轨迹跟踪的仿真,发现增量PID这玩意儿对付水流扰动确实有点东西。今天咱们直接上干货,用MATLAB整了个AUV三自由度运动模型,重点聊聊增量式PID在路径跟踪里的骚操作。
先甩个AUV的动力学简化模型(别被公式吓到,后面代码更带劲):
function dx = auv_model(t,x,u)
m = 120; % 质量
I_z = 50; % 转动惯量
X_u = 20; % 水动力系数
Y_v = 30;
N_r = 10;
u_current = 0.3*sin(0.5*t); % 模拟横向水流
v_current = 0.2*cos(0.5*t); % 纵向扰动
dx = zeros(5,1);
dx(1) = (u(1) - X_u*x(1))/m + u_current; % X方向
dx(2) = (u(2) - Y_v*x(2))/m + v_current; % Y方向
dx(3) = (u(3) - N_r*x(3))/m; % 艏向角
dx(4) = x(1)*cos(x(3)) - x(2)*sin(x(3)); % X位移
dx(5) = x(1)*sin(x(3)) + x(2)*cos(x(3)); % Y位移
end
这里特别处理了水流扰动项——用正弦函数模拟不规则水流,比固定值更接近实际情况。注意看第4、5行的耦合项,这就是水下机器人运动学模型的精髓,把本体坐标系转换到全局坐标系。
接下来是增量PID的重头戏:
function du = incr_pid(e, e_prev, e_prev2, Kp, Ki, Kd)
delta_u = Kp*(e - e_prev) + Ki*e + Kd*(e - 2*e_prev + e_prev2);
du = delta_u; % 只输出增量!
end
对比传统PID的位置式算法,增量式最大的特点是只计算控制量的变化值。这样做有三个好处:1)抑制积分饱和 2)手动自动切换无冲击 3)代码实现时不需要累加误差项,这对存储空间有限的嵌入式系统很友好。
主仿真循环里这么调用控制器:
% 期望路径生成(螺旋线)
t_ref = 0:0.1:20;
x_ref = 5*t_ref.*cos(0.3*t_ref);
y_ref = 5*t_ref.*sin(0.3*t_ref);
for k = 3:length(t_ref)
% 计算轨迹误差
e_x = x_ref(k) - x_act(k-1);
e_y = y_ref(k) - y_act(k-1);
% 增量PID计算
du_x = incr_pid(e_x, e_prev_x, e_prev2_x, 2.5, 0.01, 1.2);
du_y = incr_pid(e_y, e_prev_y, e_prev2_y, 2.8, 0.008, 1.5);
% 更新控制量(注意是累加增量!)
u_x = u_x_prev + du_x;
u_y = u_y_prev + du_y;
% 限幅处理
u_x = max(min(u_x, 50), -50);
u_y = max(min(u_y, 50), -50);
% 存储误差
e_prev2_x = e_prev_x;
e_prev_x = e_x;
% ...y方向同理
end
这里有个坑要注意:当期望路径突变时,直接使用位置误差可能导致超调。实践中可以引入前馈补偿,比如根据路径曲率预测需要的附加控制量。不过为了代码简洁,这次仿真暂时没加。
跑出来的效果挺有意思——在1.5秒左右遇到强侧向流时(看误差突然增大),控制器马上给了个反向力矩脉冲。从响应曲线能看出增量式的"小步快跑"特点,相比位置式PID,虽然跟踪精度略低(约5%),但控制量抖动减少了60%,这对执行机构寿命更友好。
调参时有个小技巧:先调D让系统不振荡,再调P到期望响应速度,最后用I消除静差。特别是水下机器人,积分项太大会导致螺旋桨频繁启停,实测把Ki控制在Kp的1/300到1/100之间比较合适。

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)