news 2026/5/1 10:10:06

动力学方程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
动力学方程

考虑扰动的欠驱动船舶轨迹跟踪自适应滑模控制

水面上的铁疙瘩要听话可不容易。三万吨的货轮在风浪里扭秧歌,舵机转得冒火星子还追不上预定航线,这场景让多少控制工程师头秃。传统PID那套在平静水域还行,遇上横风横流立马歇菜——这时候就得掏出滑模控制这把瑞士军刀。

先看船的运动学模型,简化后的状态方程长这样:

def ship_dynamics(state, tau_u, tau_r, d_eta): u, v, r, x, y, psi = state m = 1.2e5 # 质量 Iz = 4.5e6 # 转动惯量 Xu = -5.0e3 # 水动力系数 u_dot = (tau_u + m*v*r - Xu*u)/m + d_eta[0] v_dot = (-m*u*r)/m + d_eta[1] r_dot = (tau_r)/Iz + d_eta[2] # 运动学方程 x_dot = u*np.cos(psi) - v*np.sin(psi) y_dot = u*np.sin(psi) + v*np.cos(psi) psi_dot = r return np.array([u_dot, v_dot, r_dot, x_dot, y_dot, psi_dot])

这段代码暴露了欠驱动系统的软肋——控制输入只有纵向推力τu和转艏力矩τr,横向运动v完全是被动响应的。更麻烦的是最后那个d_eta项,代表风浪流的扰动,像牛皮糖一样粘在方程里。

对付这种情况,老司机们会设计这样的滑模面:

def sliding_surface(x_des, x_actual): s = np.zeros(3) # 位置误差 eta_error = x_des[0:2] - x_actual[0:2] # 航向误差 psi_error = x_des[2] - x_actual[2] # 滑模面设计 s[0] = eta_error[0] + 0.5 * np.tanh(10*eta_error[0]) # 纵向饱和函数 s[1] = eta_error[1] + 0.3 * psi_error # 横向-航向耦合项 s[2] = psi_error + 0.2 * np.sign(eta_error[1]) # 航向补偿项 return s

这个滑模面暗藏玄机:tanh函数代替sign函数防抖振,横向误差和航向误差耦合处理欠驱动约束,最后那个sign项专门治侧向漂移。

考虑扰动的欠驱动船舶轨迹跟踪自适应滑模控制

但扰动d_eta就像薛定谔的猫——你知道它存在但不知道多大。这时候自适应律就该上场了:

class AdaptiveLaw: def __init__(self): self.theta = np.array([0.0, 0.0, 0.0]) # 扰动估计 self.gamma = 0.1 # 自适应增益 def update(self, s, states): # 投影算子防参数漂移 rho = 1.5 # 估计上限 theta_norm = np.linalg.norm(self.theta) if theta_norm > rho: self.theta = (rho/theta_norm)*self.theta # 自适应律 self.theta += self.gamma * s * np.array([states[0], states[1], 1])

这个自适应模块像智能吸尘器,边跑边估算扰动大小。里面的投影操作相当于给估计值加了围栏,防止算法"想太多"导致发散。

最后把这些模块组装成控制器:

def adaptive_smc_controller(x_des, x_actual, theta_hat): s = sliding_surface(x_des, x_actual) K = np.diag([8.0, 5.0, 3.0]) # 滑模增益 # 控制量计算 u_control = np.dot(K, s) + theta_hat[0]*x_actual[0] r_control = np.dot(K[2], s[2]) + theta_hat[2] # 伪指令转换(解决欠驱动问题) tau_u = 1.2e5 * u_control tau_r = 4.5e6 * r_control return tau_u, tau_r

注意控制量计算里的theta_hat项,这就是自适应估计的扰动补偿。这里的伪指令转换其实玩了个花活——把横向运动误差转嫁到航向控制上,正是处理欠驱动问题的关键技巧。

仿真时会出现有意思的现象:前20秒控制器在疯狂试探扰动大小,船体走位像醉汉;等自适应律摸清扰动底细后,轨迹突然变得服服帖帖。这过程就像新手司机变老司机——开始手忙脚乱,熟悉车况后就能单手搓方向盘了。

这种方法的阴暗面在于参数整定——滑模增益K选大了抖振明显,选小了跟踪慢;自适应增益gamma更是敏感,调参时能真切体会到什么叫"过犹不及"。不过一旦调教得当,看着船舶在8级风浪里走出刀切斧砍般的航迹,那种满足感堪比在《欧卡2》里完美倒船入库。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:03:18

探索双闭环 PI 控制的移相全桥变换器

双闭环PI控制的移相全桥变换器。 下图为仿真模型图,4个开关管对应的pwm波形图以及输出电压电流波形图和闭环性能测试输出波形图。 在电力电子领域,双闭环 PI 控制的移相全桥变换器可是个相当重要的存在。今天咱就来唠唠它,顺便结合一些仿真模…

作者头像 李华
网站建设 2026/5/1 7:02:28

P8448 [LSOT-1] 暴龙的土豆

记录72 #include<bits/stdc.h> using namespace std; int main(){long long t,n,cnt;cin>>t;while(t--){cnt0;cin>>n;for(long long i2;i*i*i<n;i){while(n%(i*i*i)0){cnt;n/i*i*i;} }cout<<cnt<<endl;}return 0; }题目传送门https://www.lu…

作者头像 李华
网站建设 2026/5/1 7:02:23

45545634

555454546

作者头像 李华
网站建设 2026/5/1 7:04:50

入门指南:基于 CANN 仓库快速理解AI软件栈开发流程

对于 AI 开发者而言&#xff0c;理解昇腾 CANN&#xff08;Compute Architecture for Neural Networks&#xff09;AI 软件栈的开发流程&#xff0c;是解锁昇腾 NPU 硬件算力、打造高性能 AI 应用的关键。本文以 CANN 官方仓库为核心&#xff0c;从环境搭建、核心概念拆解、实操…

作者头像 李华
网站建设 2026/5/1 7:04:25

GEO优化服务市场分析:AI如何重塑本地搜索营销新格局

当前存在着数字化营销环境&#xff0c;在此环境里&#xff0c;地理位置优化也就是GEO &#xff0c;已然成了企业用以提升本地搜索可见度、吸引区域客户的关键技术手段。GEO优化借助针对特定地理区域开展搜索内容、关键词以及在线信息的精准部署&#xff0c;以此帮助企业在本地搜…

作者头像 李华
网站建设 2026/5/1 7:04:26

基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2

基于深度强化学习的混合动力汽车能量管理策略 1.利用DQN算法控制电池和发动机发电机组的功率分配 2.状态量为需求功率和SOC&#xff0c;控制量为EGS功率 3.奖励函数设置为等效油耗和SOC维持 混动车车主们肯定遇到过这种情况&#xff1a;踩下油门时总在纠结该让电池出力还是发动…

作者头像 李华