4. 水下机器人运动学与动力学基础

要让ROV在仿真里“听话”,先得把它的运动用一套统一的数学语言描述清楚。本节围绕四个关键词展开:六自由度、坐标系、推进器布局与推力分配、水动力阻尼与附加质量。它们分别回答“怎么描述运动”“在哪个参照系里描述”“推力从哪来、怎么分”“水如何反作用于机器人”这四个问题,是后续在ROS2中搭建URDF、配置推进器插件、调参仿真的直接依据。

一、六自由度:把ROV的运动拆成六个独立分量

刚体在三维空间中有6个自由度:3个平移加3个旋转。工程上通常采用船舶与海洋工程的习惯记号,用向量 η = [x, y, z, φ, θ, ψ]ᵀ 描述位置与姿态,用 ν = [u, v, w, p, q, r]ᵀ 描述对应的线速度与角速度。对ROV而言,最常用的约定是机体坐标系:x轴指向机器人前方(艏向),y轴指向右舷,z轴指向下方(即“下潜为正”)。这一约定与很多地面机器人“z向上”的习惯不同,必须在建模之初就固定下来,并在URDF、推进器方向、控制律中全程保持一致,否则会出现“指令下潜却上浮”的典型错误。

六个分量的物理含义如下表所示,建议在写仿真配置前先对照确认符号方向:

自由度符号含义正方向约定
纵荡x / u沿机体x轴平移向前
横荡y / v沿机体y轴平移向右舷
垂荡z / w沿机体z轴平移向下(下潜)
横滚φ / p绕x轴旋转右手定则
纵倾θ / q绕y轴旋转右手定则
艏摇ψ / r绕z轴旋转右手定则

需要强调的是,位置 η 通常定义在世界坐标系(惯性系)中,而速度 ν 定义在机体坐标系中,两者通过姿态旋转矩阵 J(η) 联系:η̇ = J(η)·ν。仿真中如果直接对世界系位置做积分而忽略这个变换,ROV转向后平移方向就会错乱。这是初学者最常见的建模错误之一。

二、坐标系定义:三个系各司其职

一个完整的ROV仿真通常涉及三个坐标系。世界系(world/inertial)固定不动,用于描述ROV在场景中的绝对位置和轨迹;机体系(base_link)随机器人运动,是推进器力、水动力、传感器读数的自然表达系;此外还有各传感器、相机、推进器自身的局部坐标系,通过TF树挂接到base_link上。在ROS2中,这些关系由URDF中的<joint>和<link>定义,仿真器(如Gazebo)据此计算各部件位姿。

定义坐标系时要特别注意两点:一是旋转顺序,欧拉角常用Z-Y-X(即先艏摇、再纵倾、后横滚)的约定,不同库默认顺序可能不同;二是原点位置,机体系原点一般取在重心或几何中心,若与浮心不重合,会引入恢复力矩,影响姿态稳定性。建议在URDF中显式写出各link的惯性参数和质心偏移,而不是留空。

三、推进器布局与推力分配

ROV的机动能力由推进器数量和布置决定。常见配置有4推、6推和8推。以典型的6推进器布局为例:4个水平推进器呈“X”形或矩形布置,负责纵荡、横荡和艏摇;2个垂直推进器负责垂荡,部分布局还能辅助纵倾控制。每个推进器对机体产生力和力矩,把所有推进器的贡献叠加,可写成矩阵形式:

τ = B · T
其中 τ = [X, Y, Z, K, M, N]ᵀ 为六维广义力
     T = [T1, T2, ..., Tn]ᵀ 为各推进器推力
     B 为 n×6 的推力分配矩阵(由推进器位置和朝向决定)

实际控制时遇到的是逆问题:已知期望的广义力 τ_d,求各推进器推力 T。当推进器数量多于可控自由度时,B 不是方阵,需用伪逆或带约束的优化求解,例如 T = B⁺·τ_d,并对结果做饱和限幅。下面给出一个6推布局的分配矩阵示例(数值为教学假设,单位为米,推进器朝向已归一化):

# 假设机体x前、y右、z下;水平4推位于四角,垂直2推位于前后
# 每行对应一个推进器的 [fx, fy, fz, tx, ty, tz] 贡献方向
B = [
  [ 0.707,  0.707, 0,  0, 0,  0.3],   # 左前水平
  [ 0.707, -0.707, 0,  0, 0, -0.3],   # 右前水平
  [-0.707,  0.707, 0,  0, 0, -0.3],   # 左后水平
  [-0.707, -0.707, 0,  0, 0,  0.3],   # 右后水平
  [ 0, 0, 1,  0,  0.2, 0],            # 前垂直
  [ 0, 0, 1,  0, -0.2, 0],            # 后垂直
]

调试推力分配时,一个实用做法是逐个给单推进器施加已知推力,观察仿真中ROV的运动方向是否与预期一致,从而验证B矩阵符号和朝向配置是否正确。若发现横荡指令导致机器人斜向运动,多半是某个水平推进器的y分量符号写反了。

四、水动力阻尼与附加质量

水下环境与空气最大的不同在于水的密度和黏性。ROV运动时受到的水动力可归纳为两类重要效应。第一类是水动力阻尼,它随速度增大而增大,表现为阻力,使机器人运动“发黏”、停止指令后仍会滑行一段。工程上常用线性加二次阻尼模型近似:F_d = -D₁·ν - D₂·|ν|·ν,其中D₁、D₂为阻尼系数矩阵,需通过经验公式、CFD或拖曳试验估计。仿真中若阻尼设得过小,ROV会像在真空中一样飘忽;设得过大则响应迟钝、难以控制。

第二类是附加质量,指机器人加速时带动周围水一起加速所产生的“额外惯性”。它使有效质量大于真实质量,典型情况下附加质量可达排水质量的10%~100%,对细长体或靠近壁面时更显著。在动力学方程中,附加质量以附加质量矩阵 M_A 的形式叠加到刚体惯性矩阵上:M_total = M_RB + M_A。忽略附加质量会导致仿真中加速过快、超调明显,与实际水下表现不符。

在ROS2仿真中,若使用Gazebo的gz-sim或uuv_simulator类插件,阻尼和附加质量通常以参数形式写入SDF/URDF的插件配置块。建议先用保守估计值跑通闭环,再根据阶跃响应曲线逐步调整,而不是一次性追求“精确”参数。

下面这张图把本节的核心关系串起来:从期望广义力出发,经推力分配矩阵映射到各推进器,再叠加水动力阻尼与附加质量的作用,最终由六自由度运动方程积分出ROV的位置与姿态。

期望广义力 τ_d = [X,Y,Z,K,M,N] 推力分配 T = B⁺ · τ_d 饱和限幅 推进器组 4水平 + 2垂直 T1 … T6 六自由度动力学 M_total·ν̇ + C·ν + D·ν + g(η) = τ M_total = M_RB + M_A D = D₁ + D₂|ν| g(η):重力与浮力恢复力 位置与姿态 η = [x,y,z,φ,θ,ψ] 阻尼/附加质量反馈 机体系约定 x 前 · y 右 · z 下 η̇ = J(η)·ν(世界系←机体系)

把这张图与前面的公式对照,可以清楚看到:推力分配解决“怎么把期望力变成推进器指令”,动力学方程解决“推进器力和水动力共同作用下机器人如何运动”。在ROS2仿真中,前者通常由自定义控制器节点实现,后者由物理引擎和插件完成。理解这条链路,后续配置URDF惯性参数、调整阻尼系数、验证推进器方向时,就能做到心中有数、有的放矢。