夜雨聆风学习资料网

ARTICLE · 1267990

yxShip6DOF:框架铺好地基,插件只填“水动力”

yxShip6DOF:框架铺好地基,插件只填“水动力”
yxAFSim 框架能力 · 船舶篇

船在水里开,不是“点一下就走”那么简单:它前后左右上下都能动,还会左右倾、前后倾、原地打转。这些运动合起来叫六自由度。在 yxAFSim 里,mover 是挂在平台上的组件,负责推进平台的位置、姿态、速度——框架把组件生命周期、导航命令、类型表、环境门面全铺好了,yxShip6DOF 只需把“水动力”这块物理填进去。

一、六自由度:船到底怎么动

船的运动拆成六个自由度——三个平移(纵荡 surge 前后、横荡 sway 左右、垂荡 heave 上下)+ 三个转动(横摇 roll 左右倾、纵摇 pitch 前后倾、艏摇 yaw 转向)。为什么要拆开?因为操纵一艘船,本质就是同时控制这六个量的演化:舵管艏摇,螺旋桨管纵荡,浮力/重力管垂荡与横纵摇。

图 1 · 船舶六自由度:三个平移 + 三个转动(SNAME 符号 u/v/w/p/q/r)。

二、框架给了什么,插件只补什么

yxShip6DOF 继承 WsfMover 基类。下面这张表是框架“白送”的能力,插件一行都不用重写:

框架提供的能力

具体是什么

mover 组件骨架 + 生命周期

Initialize/Update/TurnOn/TurnOff/PartBroken/Restore 全由框架调度

统一导航命令接口

GoToSpeed / TurnToHeading / SetRoute / GoToLocation / FlyHeadingSpeedAltitude 等几十个导航方法

空间域声明

船声明 SURFACE,框架据此做地球模型、地形、区域与交互判定

脚本类型系统 + 类型表

PluginRegistration 里 AddCoreType 注册,想定里写 mover <名> YX_SHIP_6DOF_MOVER 即用

序列化

toJson/fromJson,用于运行时状态同步与分布式推演

地形影响速度

GeographyType(GT_SURFACE),框架按地形类型/坡度系数折算实际速度

自然环境门面

yxNaturalEnvironment 统一提供洋流/风/温盐/海况

三、怎么用:一段完整的水动力配置

插件真正要写的只有两件事:覆写 TurnToHeading / GoToSpeed 两个导航接口,以及填一张水动力系数表。系数表直接在 mover 块里配,换一型船 = 换一张表,不改代码:

mover  ship1  YX_SHIP_6DOF_MOVER

   mass              8000000.0        # 质量 kg

   inertia           1.0e9  1.0e10  1.0e10   # Ixx Iyy Izz kg·m²

   displacement      7800.0           # 排水体积 m³(→浮力 B=ρg∇)

   waterplane_area   2500.0           # 水线面面积 m²(垂荡恢复弹簧)

   metacentric_height 1.2  120.0      # 横稳心高 / 纵稳心高 m(稳性)

   max_thrust        2000000.0        # 最大推力 N

   linear_damping    1.0e4 1.0e5 2.0e5 1.0e7 1.0e8 1.0e8   # 对角线性阻尼

   quadratic_damping 5.0e3 5.0e4 1.0e5 1.0e6 1.0e7 1.0e7   # 对角二次阻尼

   added_mass        <36 个值,6×6 行主序>     # 附加质量 M_A

   rudder            30.0  40.0  1.0   # 舵面积 m² / 力臂 m / 有效性

   wind_area         1200.0           # 水线以上受风面积 m²

   throttle          0.5              # 初始油门 0-1

   reference_speed   15.0             # 参考速度 m/s(满油门对应速度)

   heading_hold_gain      2.0         # 航向保持 P

   heading_hold_damping   1.0         # 航向保持 D

   heading_hold_integral  0.1         # 航向保持 I

end_mover

四、插件补的物理内核:Fossen 六自由度

物理内核是海洋工程标准形式(SNAME 1950 / Fossen):

(M_RB + M_A)·ν̇ + C_RB(ν)·ν + C_A(ν)·ν + D(ν)·ν + g(η) = τ

附加质量 M_A——船一动,拖着一团水

船加速或减速时,会带动周围一大团水跟着动,这团水的惯性等效成“额外质量”,让船显得更“重”、更难加减速、更难转向。这是水面/水下航行器与飞机最本质的差别之一——空气稀薄,飞机几乎不用考虑它。

阻尼 D(ν)——水吃掉你的能量

水是黏的,还会被兴波带走能量。模型用线性 + 二次阻尼叠加(D_lin·ν + D_quad·ν|ν|)刻画:低速近似线性,高速下湍流/兴波让阻力按速度平方涨。真实世界里横摇阻尼还高度非线性,工程上常折成等效线性系数。

恢复力 g(η)——浮力把船“扶正”

浮力 B = ρ·g·排水体积,与重力 W 的差产生垂荡;横稳心高 GMt、纵稳心高 GMl 决定船倾斜后“回正”的刚度(稳性);水面船还多一个水线面面积带来的垂荡恢复弹簧——船沉一点,排水多一点,就被顶回来。这正是“船为什么不会翻、为什么能在浪里稳住”的物理来源。

五、逐帧计算流程:一帧里发生了什么

每个仿真步,Update 都走一遍下面的流程:

① 查环境:从 yxNaturalEnvironment 门面取洋流、风、水温/盐度(算密度)、海况,注入物理实例;② 算力 F:螺旋桨推力 + 舵力矩 − 线性/二次阻尼 − 浮力/重力恢复 − 科氏/向心 + 风载荷 − 波浪阻力;③ 解加速度 ν̇ = (M_RB+M_A)⁻¹·F,一阶欧拉积分出新速度;④ 体轴速度经 J(η) 旋转成 NED 速度,再叠加上洋流漂移(对地速度 = 对水速度 + 洋流);⑤ 积分位置/姿态;⑥ 写回平台 SetLocationLLA / SetOrientationNED / SetVelocityNED。

六、自然环境数据怎么参与

自然环境量

进入船舶模型的哪个环节

洋流 eCurrent(矢量)

对地漂移:对地速度 = 对水速度 + 洋流

风 eWind(矢量)

上层建筑风载荷(按受风面积产生纵荡/横荡力)

水温 + 盐度

算海水密度ρ = 1025 − 0.15(T−10) + 0.78(S−35) → 浮力/阻力

海况

波浪附加阻力(海况越高阻力越大)

图 2 · 美国海军阿利·伯克级驱逐舰(USS Jason Dunham DDG-109)。来源:美国海军 / DVIDS(公有领域)。

七、结语

船舶操纵性研究的是“船能否按驾驶者意图保持或改变运动状态”,而它的全部答案都藏在这张水动力系数表里——附加质量、阻尼、浮力、稳心、舵、螺旋桨。把船接进 yxAFSim,真正的工作量不在“怎么让船动”,而在“水动力系数对不对”,以及把这些系数和洋流、风、温盐、海况一起交给框架去算。

相关学习资料