4. 坐标系统与速度分量转换
ADCP 测到的原始量是沿各波束方向的径向速度,而海洋学研究和数据产品需要的是东、北、垂直三个方向的速度分量。这中间要经过三级坐标转换:波束坐标 → 仪器坐标 → 地球坐标。理解每一级的几何含义和实现方式,是判断速度数据是否可信的前提。本节按转换链条逐级展开,并说明磁偏角与姿态校正的接入位置。
三级坐标系的定义与约定
先统一符号约定,全文及图示保持一致。波束坐标(beam)用 b₁…b₄ 表示四个换能器波束方向,RDI 常规 4 波束 Janus 配置下,波束 1、2 位于仪器 x 轴两侧,波束 3、4 位于 y 轴两侧,各波束与仪器 z 轴(换能器轴向)夹角为 20°。仪器坐标(instrument)用 x、y、z 表示,x 指向仪器标记方向,z 沿换能器轴向向上(或向下,取决于安装朝向)。地球坐标(earth)用 E、N、U 表示,E 为正东、N 为正北、U 为垂直向上,这是右手系,垂直速度向上为正。
需要特别强调:不同厂商、不同固件对“向上为正”还是“向下为正”的约定可能不同。RDI 的 PD0 数据中垂直速度通常以向上为正,而部分国产设备或后处理软件可能采用向下为正。整条处理链必须锁定一种约定,否则垂直速度符号会整体翻转,而这种错误在水平流速上完全看不出来。
波束坐标到仪器坐标:几何矩阵
四个波束的径向速度 b 与仪器坐标速度 (x, y, z) 之间是线性关系,由波束倾角 θ(Janus 配置为 20°)决定。标准转换矩阵为:
| x | | 1 0 -1 0 | | b1 |
| y | = K · | 0 1 0 -1 | · | b2 |
| z | | 1 1 1 1 | | b3 |
| b4 |
其中 K = 1 / (2·sinθ),θ = 20° 时 K ≈ 1.4619
这个矩阵的物理含义很直观:x 分量由波束 1 与波束 3 的差决定(两者在 x 方向投影相反),y 分量由波束 2 与波束 4 的差决定,z 分量由四波束之和决定。因此当某个波束失效时,x 或 y 分量会直接缺失,而 z 分量仍可由剩余波束部分估计——这也是为什么单波束故障时数据质量标志会显著降级。
实现时要注意:矩阵求逆的前提是四波束都有效。若某波束被标记为坏值(如 RDI 的 -32768),必须先剔除该剖面或该单元,不能直接代入矩阵,否则会得到量级异常的伪速度。实际代码中通常先做有效性掩膜,再对有效单元批量矩阵乘。
仪器坐标到地球坐标:姿态与磁偏角
仪器坐标到地球坐标的转换由三个姿态角和一个磁偏角共同决定。三个姿态角是横摇(roll,绕 x 轴)、纵摇(pitch,绕 y 轴)、航向(heading,绕 z 轴),由 ADCP 内置的倾斜计和磁罗经测得。转换关系可写为:
V_earth = R_heading · R_pitch · R_roll · V_instrument
R_roll = 绕 x 轴旋转 roll
R_pitch = 绕 y 轴旋转 pitch
R_heading = 绕 z 轴旋转 (heading + 磁偏角)
磁偏角(magnetic declination)是磁北与真北之间的夹角,随地理位置和年份变化。ADCP 磁罗经测的是相对磁北的航向,要得到相对真北的东向、北向速度,必须把磁偏角加到航向上。例如某海域磁偏角为 -6°(磁北偏西),则真航向 = 磁航向 + (-6°)。磁偏角符号约定必须与数据源一致,否则东向速度会出现系统性偏差,且偏差量随航向变化,表现为一种“旋转”型误差而非固定偏移。
姿态校正的必要性可以用一个典型场景说明:假设仪器安装倾斜 5°,若忽略纵摇直接使用,水平速度会被错误地“泄漏”到垂直分量,垂直速度出现与水平流速相关的伪信号;同时水平流速幅值被低估约 cos(5°) ≈ 0.4%,方向也发生偏转。对于走航观测,船体横摇可达 ±10°,不校正的姿态误差会直接污染垂向速度,影响上升流、沉降通量等弱信号的分析。
转换链的实现与验证
把三级转换串起来,完整处理链是:原始波束速度 → 有效性检查 → 波束到仪器矩阵 → 姿态旋转矩阵(含磁偏角)→ 地球坐标速度。每一步都应保留中间结果,便于排障时定位误差来源。
验证转换是否正确,最直接的办法是做“闭合检查”:把地球坐标速度用逆矩阵转回仪器坐标,再转回波束坐标,与原始波束速度比对,残差应在数值精度范围内(例如小于 1 mm/s)。另一个实用检查是看垂直速度的统计特性:在水平均匀流场中,正确转换后的垂向速度应接近零均值、小幅波动;若垂向速度与水平速度幅值高度相关,往往说明姿态角符号或旋转顺序有误。
下面给出一个可参考的 Python 实现片段,展示矩阵构造与批量转换的关键写法(示例参数,非实测):
import numpy as np
theta = np.deg2rad(20.0)
K = 1.0 / (2.0 * np.sin(theta))
def beam_to_instrument(b):
# b: (n, 4)
x = K * (b[:,0] - b[:,2])
y = K * (b[:,1] - b[:,3])
z = K * (b[:,0] + b[:,1] + b[:,2] + b[:,3])
return np.column_stack([x, y, z])
def instrument_to_earth(v, roll, pitch, heading, decl):
r, p, h = np.deg2rad(roll), np.deg2rad(pitch), np.deg2rad(heading + decl)
Rr = np.array([[1,0,0],[0,np.cos(r),-np.sin(r)],[0,np.sin(r),np.cos(r)]])
Rp = np.array([[np.cos(p),0,np.sin(p)],[0,1,0],[-np.sin(p),0,np.cos(p)]])
Rh = np.array([[np.cos(h),-np.sin(h),0],[np.sin(h),np.cos(h),0],[0,0,1]])
R = Rh @ Rp @ Rr
return v @ R.T
注意旋转顺序:先 roll、再 pitch、最后 heading,与多数 ADCP 厂商文档一致。若顺序颠倒,在大角度姿态下结果会有可察觉差异。磁偏角在代码中直接加到 heading 上,符号必须与数据源约定核对。
常见错误与排障要点
实际处理中最容易出问题的不是矩阵本身,而是约定和符号。第一类错误是磁偏角符号反了,表现为东向速度整体偏移,且偏移量随航向呈正弦变化;第二类错误是旋转顺序颠倒,在小角度下几乎看不出来,但横摇超过 8° 后垂向速度出现明显伪信号;第三类错误是垂直速度正负号约定不统一,导致上升流被误判为下降流。排障时建议先固定一个已知姿态的静态测试剖面,手工计算一遍转换结果与软件输出比对,确认符号和顺序无误后再批量处理。
另外,姿态数据的采样率与流速采样率可能不同,转换前需要按时间戳对齐或插值。若姿态角在剖面采集期间变化剧烈(如走航中船体剧烈摇晃),单剖面用一组平均姿态角会引入误差,此时应使用逐 ping 姿态或至少按 ensemble 对齐的姿态数据。磁偏角则应使用观测位置和观测年份对应的值,跨年度长期观测需注意磁偏角的年变化量。
完成本节的三级转换后,得到的地球坐标速度才具备与其它海洋观测(如 CTD、漂流浮标、卫星高度计)直接比对的基础。后续的误差来源分析、异常值剔除和质量控制,都应建立在这一转换结果之上。