直接开撸代码。先看无人船模型部分,Matlab里用ODE45解算动力学方程是基本操作。模型核心在船体受力部分

张开发
2026/4/11 10:24:25 15 分钟阅读

分享文章

直接开撸代码。先看无人船模型部分,Matlab里用ODE45解算动力学方程是基本操作。模型核心在船体受力部分
paper复现基于Lyapunov方法的多个欠驱动无人船的协同路径跟踪控制 基于李亚普诺夫非线性控制的多个欠驱动无人船协同路径跟踪代码来自IEEE会议Matlab编写 能完全跑通function dx ship_dynamics(t,x,u) % 欠驱动特性只有推进和转向力矩 m 120; % 质量 Iz 25; % 转动惯量 Xu -25; % 水动力阻尼 Nr -6.5; psi x(3); % 航向角 u_v x(4); % 纵向速度 v x(5); % 横向速度 r x(6); % 转向角速度 tau [u(1); 0; u(2)]; % 控制输入 % 旋转矩阵 R [cos(psi) -sin(psi) 0; sin(psi) cos(psi) 0; 0 0 1]; % 刚体惯性矩阵 M diag([m, m, Iz]); % 科里奥利力矩阵 C [0 0 -m*v; 0 0 m*u_v; m*v -m*u_v 0]; % 阻尼矩阵 D diag([-Xu, 0, -Nr]); % 状态导数 dx(1:3) R * [u_v; v; r]; dx(4:6) M \ (tau - C*[u_v;v;r] - D*[u_v;v;r]); end这段代码的坑在于科里奥利力项的处理——很多人会漏掉横向速度v对动力学的影响。注意第19行用到了横向速度v来计算C矩阵这是保证模型非线性的关键。控制律部分用李亚普诺夫函数逆向推导。核心是这个看起来有点魔改的surge力算法function tau_u surge_control(e_p, psi_e, u) k1 2.5; % 收敛速率参数 rho 0.8; % 调节超调量 tau_u -k1 * e_p * cos(psi_e) - rho * u(1); end这里ep是路径跟踪误差psie是航向偏差。cos(psi_e)这个项很有意思——当航向偏差接近90度时控制量会自动衰减防止过度修正引发震荡。调试时把rho从0.5调到1.2系统响应会从过阻尼变成欠阻尼状态。paper复现基于Lyapunov方法的多个欠驱动无人船的协同路径跟踪控制 基于李亚普诺夫非线性控制的多个欠驱动无人船协同路径跟踪代码来自IEEE会议Matlab编写 能完全跑通多船协同的关键在虚拟结构法。代码里用相对位置误差加权求和function delta formation_error(poses, refs) n size(poses,2); delta zeros(2,n); for i 1:n neighbors get_neighbors(i); % 获取通信拓扑 sum_err [0;0]; for j neighbors desired_offset refs(:,i) - refs(:,j); actual_offset poses(:,i) - poses(:,j); sum_err sum_err (actual_offset - desired_offset); end delta(:,i) sum_err / length(neighbors); end end这个分布式计算每个船只需要和邻居通信。当把通信延迟参数设为0.3秒以上时会观察到明显的编队形变这时需要增加延迟补偿项。主循环里藏着稳定性验证的彩蛋Lyap zeros(1, N); for k 1:N Lyap(k) 0.5*(e_p^2 psi_e^2 delta*delta); end plot(Lyap); % 李亚普诺夫函数应单调递减跑完仿真看到Lyap曲线没有出现正向波动说明控制律设计没毛病。但实际跑的时候发现前5秒有个小凸起把psi_e的权重系数从1调到1.5后消失。调参时盯着这个曲线比看轨迹图更有效。最后说下怎么扩展到10条船把主函数里的shipcount参数改成10在formationconfig里配置参考路径。注意要调大ODE45的MaxStep到0.1秒不然仿真速度会卡成PPT。这个框架的扩展性不错就是通讯拓扑改起来有点费劲得手动改get_neighbors函数里的连接关系。

更多文章