ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

多波束水深测量数据处理链:坐标系转换与姿态/声线改正

多波束水深测量数据处理链:坐标系转换与姿态/声线改正

简介:面向海洋测绘、水深测量与多波束数据处理方向的技术人员和学习者,这份文档以多波束测深系统为对象,梳理从传感器观测到水深成果归算的关键环节,重点讨论坐标系统定义、横摇与纵摇改正、航向归算以及系统偏差和测量误差的分析方法。内容涉及测量船坐标系、多波束探头坐标系、姿态传感器与电罗经坐标系、水平坐标系及高斯测量坐标之间的关系,并结合公式说明声线处理中的坐标转换,可为设备安装匹配、水深点改正和精度控制提供参考。压缩包共1个doc文件,约152KB,主题集中、便于查阅。已有1125人学习下载,适合需要理解多波束数据处理流程、排查误差来源并完善改正思路的从业者作为案头资料。

1. 全覆盖反而漏目标:多波束数据处理里那条被低估的转换链

多波束水深测量的卖点是面测深:一次发射一列波束,船开过去就是一片全覆盖。但实际作业里有个反复被提起的怪事:单波束或者旁侧声呐能打到的目标,多波束扫过去反而没影。问题多半不在换能器能不能收到回波,而在从回波到成图这条数据处理链上。坐标系转错一层、姿态没扣、声线没弯、系统偏差没消,一个孤立的小目标就会在归算过程中被摊平、被挪走、被当成噪声滤掉。

这条链的复杂度远超一般人的想象:一条水深的坐标要经过船体坐标系、探头坐标系、姿态坐标系、罗经坐标系、水平坐标系,最后才落到高斯平面。每一级都有旋转,每一次旋转都可能引入系统偏差。搞懂这条链为什么这么设计,比记住哪个按钮点哪里有用得多。

2. 六个坐标系:一条水深的坐标为什么要层层转手

2.1 原点为什么统一钉在探头中心

多波束系统不是一件仪器,是一串仪器。测深仪、定位仪、电罗经、姿态传感器、涌浪滤波器,全都装在一条船上,各自安装位置、朝向、零点都不一样。要让它们的观测值拼到一起,第一件事是把坐标系统一起来。

资料里定义了六套坐标系:测量船坐标系 XbYbZb、多波束探头坐标系 XcYcZc、姿态传感器坐标系 XdYdZd、电罗经坐标系 XeYeZe、水平坐标系 XaYaZa、测量坐标系 XY。前五套的原点全部取在多波束探头的发射中心。

这个选择不是随手定的。原点统一以后,每个传感器相对探头的安装位置就变成一个固定的杆臂向量:定位仪是 (Xps, Yps, Zps),涌浪滤波器是 (Xhv, Yhv, Zhv)。换算时只需要做旋转,不需要再做平移,整条链上只剩下“转到哪个坐标系”这一个自由度,出错面小得多。

方向约定也值得说一句:右手系,往船艏方向看,向左为 X 轴正向,与船艏艉线平行为 Y 轴正向,垂直向下为 Z 轴正向。Z 轴向下为正这一条很关键,水深直接就是 Z 分量,不用在每个公式里手动取负号。血泪经验是,只要中间有一处搞反了符号,整片水深会整体翻上来,而且不容易一眼看出来。

2.2 水平坐标系才是唯一能“改”的基准

船体系是钉在船上的,船在摇,它就在摇。姿态传感器测出来的横摇、纵摇,本质是船体相对重力方向的夹角,这个夹角只有在水平坐标系里才有物理意义。

水平坐标系 XaYaZa 的定义是:与平静时的测量船坐标系重合,XaYa 平面与当地水平面平行。它把“船的姿态”这个变量剥掉了,只留下“重力朝下”这个事实。横摇改正、纵摇改正、航向倾斜改正,全部参照这个坐标系做。

为什么不直接改到高斯平面?因为高斯平面是投影坐标,X 轴是中央子午线方向,跟船艏朝哪儿没有关系。中间必须经过水平坐标系这一步,把姿态和航向这两个变量拆开处理。先改姿态,再改航向,顺序倒了公式就全乱。

2.3 归算链:三类量各走一遍,顺序不能乱

整条归算链上有三类量要换算:定位仪点位、涌浪观测值、水深点。它们走的是同一条链,但入口不同,顺序也有讲究。

定位仪点位归算分三步。第一步做系统偏差改正,把定位仪在船体系里的坐标 (Xps, Yps, Zps) 用静态测定的安装偏差 δαd、δβd、δAe 转正,这一步必须在船体系里做完,因为安装偏差是常数。第二步做倾斜转换,用当前的横摇、纵摇观测值把点转到水平坐标系。第三步才是航向旋转,转角 ψ = A + γ,A 是真航向,γ 是高斯坐标收敛角。

涌浪观测值走的是同一套流程,只是起点换成涌浪滤波器在船体系里的位置 (Xhv, Yhv, Zhv) 和观测值 h'v,转完之后得到的 za 就是探头处的涌浪改正值。水深点的路径最短:声线归算先得到水平坐标系下的 (x'a, y'a, z'a),然后一次航向旋转直接落进高斯平面。

顺序为什么不能换?因为系统偏差是安装常数,扣它必须在船体系里做;一旦转到了水平坐标系,这个常数就跟姿态角混在一起,再也分不开了。

代码里的旋转按矩阵连乘实现,注意乘的顺序是从右往左作用在列向量上:

import numpy as np def apply_attitude(xb, roll, pitch, eps): """把船体系坐标旋转到水平坐标系,对应资料里的公式(3)(4)。 xb: (N,3) 船体系坐标 (Xb, Yb, Zb),单位 m roll: 横摇,弧度 pitch: 纵摇,弧度 eps: 偏转角,弧度,按公式(6)单独预算 返回: (N,3) 水平坐标系下的坐标 """ Rx = np.array([[1, 0, 0], [0, np.cos(roll), np.sin(roll)], [0, -np.sin(roll), np.cos(roll)]]) # 反横摇 Ry = np.array([[np.cos(pitch), 0, -np.sin(pitch)], [0, 1, 0], [np.sin(pitch), 0, np.cos(pitch)]]) # 反纵摇 Rz = np.array([[np.cos(eps), -np.sin(eps), 0], [np.sin(eps), np.cos(eps), 0], [0, 0, 1]]) # 反偏转角 R = Rz @ Ry @ Rx # 逆序连乘,顺序不能颠倒 return (R @ xb.T).T

Rz @ Ry @ Rx这个顺序对应的是“先撤销横摇、再撤销纵摇、最后撤销偏转角”。如果把顺序写成Rx @ Ry @ Rz,在姿态角小的时候差别只有毫米级,看起来能用;一旦横摇超过 8 度,边缘波束的点位偏差就能到十几厘米。这种误差最难查,因为中央波束是正常的,只有扇面两侧出问题。

3. 姿态改正:横摇纵摇怎么被“摆平”,偏转角 ε 为什么要单独抽出来

3.1 绕任意轴的旋转,为什么必须拆成两次绕坐标轴

姿态改正的几何本质很简单:船体坐标系绕某条空间直线 l 旋转一个角度 ρ,就与水平坐标系重合。这条直线是横摇轴和纵摇轴合成的结果,ρ 和它的方向余弦 κ 可以从 α、β 直接推出来。资料里公式(2)给的就是这个关系。

但这条公式在实际数据处理里不好用。声线归算要给每一条波束算入射角和旅行时间,每 Ping 上千个波束,每个波束对应的姿态略有不同,如果每次都用“绕任意轴旋转”这个形式,就要重新算一次轴向量和方向余弦,计算量大,而且公式不直观,符号搞错都看不出来。

所以资料换成了第二种形式:先把水平坐标系绕 Za 轴旋转一个偏转角 ε,得到 X'aY'aZ'a,并且要求 Y'a 轴与 Yb 轴在 XaYa 平面上的投影重合;再分别绕 Y'(即 Yb)和 X'a 轴旋转,得到 XbYbZb。这样每一步都是一个标准的正交旋转矩阵,可以查表、可以缓存,也可以在代码里按固定顺序连乘。

这个拆分的核心思想是:把一个“绕斜轴”的旋转分解成三个“绕坐标轴”的旋转,代价是多出一个 ε。工程上多算一个角,换来的是整条链的每个环节都可以独立验证,这笔交易很划算。

3.2 偏转角 ε:船艏方向在水平面上的投影

ε 的物理含义是:船艏线(Yb 轴)在水平面上的投影,与水平坐标系参考轴之间的夹角。它把“船头朝哪儿”这个信息从姿态旋转里单独剥离出来,后面航向归算只需要处理一个真方位 A,不用再去碰姿态矩阵。

资料里公式(6)给了 ε 的直接解算方式,输入是 ρ 和 κ,也就是从横摇、纵摇推出的合成角和方向角。这个形式看起来绕,实际好处是:ε 只跟姿态角有关,跟航向无关,可以在一 Ping 数据到来之前先算好,声线处理的时候直接查表取用。

这里最容易踩的坑是符号。ε 是由水平坐标系转向船体坐标系时的旋转角,归算回去的时候要用它的逆。我在不同厂家的软件里见过两种约定,一种顺时针为正,一种逆时针为正,混用一次,整片地形会绕测船位置整体旋转一个小角度,重叠带一比对就露馅。

3.3 姿态改正的数值量级:为什么 1 度也不能糊弄

资料里给了一组估算,很有说服力:在 30 米水深、单边 3 倍水深宽度测量的条件下,边缘波束和中央波束的接收时间差大约是 80 毫秒。假设横摇是振幅 10 度、周期 5 秒的正弦变化,这 80 毫秒内横摇本身就会变化将近 1 度,对边缘波束水深的影响高达 1.66 米。

注意,这 1.66 米不是“没扣姿态改正”造成的,而是“扣了姿态改正,但用的是同一个姿态值”造成的。也就是说,姿态传感器每秒采样几十次,但一 Ping 波束从第一个回波到最后一个回波之间姿态已经变了,如果整 Ping 都套用同一个横摇值,边缘波束就会带着这个残余误差。

常见的处理思路有两种:一是提高姿态采样率,让 80 毫秒内至少有 2 到 3 个姿态样本,按波束接收时刻插值;二是在声线归算时把姿态写成时间的函数,每个波束用自己那一刻的姿态值。两种做法都要改数据结构,不是调个参数就能解决的,这也是很多后处理软件在深水边缘波束上精度上不去的原因。

3.4 一个最小可验证的姿态改正实现

把上面的思路落成代码,核心就是按波束时刻取姿态,再套矩阵:

def correct_attitude_per_beam(points_body, timestamps, attitude_series): """逐波束做姿态改正。 points_body: (N,3) 船体系下的波束落点 timestamps: (N,) 每个波束的接收时刻,秒 attitude_series: dict,含 't'、'roll'、'pitch'、'eps' 四个等长序列 返回: (N,3) 水平坐标系下的落点 """ t = attitude_series['t'] roll = np.interp(timestamps, t, attitude_series['roll']) pitch = np.interp(timestamps, t, attitude_series['pitch']) eps = np.interp(timestamps, t, attitude_series['eps']) out = np.empty_like(points_body) for i in range(len(points_body)): # 每个波束用自己的姿态,而不是整 Ping 取平均 out[i] = apply_attitude(points_body[i:i+1], roll[i], pitch[i], eps[i])[0] return out

这里np.interp做的是线性插值,要求姿态序列的时间戳和波束时间戳在同一个时间基准上,通常是 GPS 授时。如果姿态数据的时间戳是设备内部时钟,先做一次时延标定,否则插值出来的姿态整体错位,改正等于没做。参数上唯一要小心的是eps:它必须先按公式(6)从 roll/pitch 算好,不能直接拿航向角顶替。

4. 航向归算与声线弯曲:两个看起来对称、实际错位的换算

4.1 光纤罗经测的是角速度,陀螺罗经测的是倾斜面上的角度

多波束系统常用的航向设备有两类:光纤罗经和陀螺罗经。资料特别强调,这两者“就测量原理来讲,有着本质的不同”,在归算前必须先弄清它们测的是什么量。

光纤罗经基于 Sagnac 效应:光束在环形光路里正反两个方向传播,环路本身一转,两束光的光程就产生差异,测出这个差异就得到环路的转动角速度。三个相互垂直的光纤陀螺分别测出地球自转角速度在三个轴上的分量,再由这些分量解算出航向。它输出的是一个瞬时角速度矢量,倾斜的时候,测到的是倾斜坐标系三轴上的分量,必须借助姿态数据转到水平坐标系,才能解出真方位。这一步在公式(7)(8)里写得很清楚。

陀螺罗经走的是另一条路:利用高速转子的定轴性和进动性,靠地球自转产生的控制力矩让主轴自动找北,再用阻尼力矩让它稳定指北。它输出的是角度,不是角速度。关键在于,主罗经刻度盘是随船一起倾斜的,所以它测出来的航向是倾斜面上的航向,不是水平面上的真航向。

这两种设备的差别,直接决定了归算时要不要做倾斜改正:光纤罗经的数据在解算航向之前就要先转平,陀螺罗经的数据在解算之后还要再补一个倾斜改正。搞混了,航向就会差出零点几度到一度,在边缘波束上放大成米级的位置偏差。

4.2 倾斜改正的量级:10 度横摇大约 0.44 度

资料里给了一个只考虑横摇的估算:假定纵摇为零,航向倾斜改正的最大值出现在 45 度、135 度、225 度、315 度这四个航向上。横摇 10 度时,改正量约为 0.44 度;横摇 15 度时,改正量约为 1 度。

0.44 度听起来很小,但换算成位置偏差就不小了。30 米水深处,0.44 度对应横向偏移约 0.23 米;如果波束入射角是 60 度,斜距接近 60 米,同样的角度误差对应的横向偏移接近 0.46 米。多波束的边缘波束对航向误差极其敏感,原因就在这里。

更麻烦的是,这个改正量跟航向有关,不是常数。船在转弯或者顶流航行时航向在变,改正量也跟着变,如果后处理软件用一个固定值去补,重叠带里的目标就会一会儿偏左、一会儿偏右,看起来像定位跳点,实际是航向改正没跟上。

4.3 声线弯曲:为什么不能拿“声速乘时间除以二”当水深

声速在海水中不是常数,随温度、盐度、压力变化,垂直方向上尤其明显。多波束声线计算采用二维模式:假定声速只在垂直深度上变化,水平方向均匀。这个近似在开阔水域够用,在河口或者有明显淡水楔的地方要小心。

连续形式的公式是 D = ∫v·cosθ dt、X = ∫v·sinθ dt,离散化以后变成对每一层的求和:把水柱按声速剖面切成若干层,每层内声速取常数,逐层累加旅行时间、深度增量和侧向偏距增量。每一层的入射角由 Snell 定律给出:sinθᵢ / vᵢ = sinθ₀ / v₀,这个比值(射线参数)在整条声线上保持不变。

为什么必须分层递推?因为声速剖面里常有跃层。跃层处声速梯度大,声线急剧折射,用平均声速算出来的路径和真实路径能差出几十厘米。深水边缘波束的斜距长,误差累积更明显。这也是为什么声速剖面文件的采集时间必须跟作业时间对上:早上和下午的跃层深度能差好几米。

import numpy as np def trace_ray(v_layers, dz_layers, theta0, v0): """按 Snell 定律逐层递推声线,返回累计深度和侧向偏距。 v_layers: (n,) 各层声速,m/s,从海面往下 dz_layers: (n,) 各层厚度,m theta0: 换能器处的初始入射角,弧度 v0: 换能器表面声速,m/s 返回: (D, X) 水深和侧向中心距,单位 m """ p = np.sin(theta0) / v0 # 射线参数,全程不变 D = X = 0.0 for v, dz in zip(v_layers, dz_layers): s = p * v # sin(theta_i) if s >= 1.0: break # 全反射,声线到不了这一层 c = np.sqrt(1.0 - s * s) # 层内声速为常数时,声线是直线,斜距 = dz / cos(theta) slant = dz / c D += slant * c # 深度增量 X += slant * s # 侧向增量 return D, X

这段代码的关键在p这个射线参数:它一旦由表面声速和初始入射角确定,后面每一层都复用它,不需要逐层重算。dz / c得到的是这一层的斜距,再分别乘 cos、sin 就拆成深度和侧向两个分量。实际生产代码不会这么写,因为每 Ping 上千个波束逐个积分太慢,通常预先按入射角和旅行时间做成二维表,再用双线性内插查值,原理和这里一模一样。

4.4 查表内插的误差账:步长取多少才够

资料里给了具体的误差估算,很值得记下来:入射角步长取 2 度、旅行时间步长取 2 毫秒时,线性内插对偏距和水深的影响不大于 5 厘米。这个量级对 1:500 到 1:2000 的水深测量是可以接受的。

但如果把步长放大到 5 度、5 毫秒,误差就会涨到 20 厘米以上,边缘波束尤其明显。有些软件为了跑得快,默认用大步长,跑出来的地形看着平滑,实际上已经把陡坡和暗礁的尖顶磨圆了。浅水航行水域测量时,这个“平滑”是致命的。

还有一个隐藏的误差源:内插用的四个角点必须来自同一条声速剖面。如果表是分块生成的,块与块之间用了不同时间的剖面,内插出来的值在块边界会跳变,剖面上表现为一条横跨测区的细线。这种线在等值线图上很难看出来,但在三维显示里非常扎眼。

4.5 波束单元入射角不等于波束入射角

这是多波束数据处理里最容易被忽略的一步。波束单元入射角 γ 是波束中心线与换能器垂直轴之间的夹角,由硬件决定,出厂时就固定了。波束入射角 θ 是波束中心线与水平面法线之间的夹角,是声线计算真正要用的输入。

船一倾斜,这两个角就不相等了。必须用当前的横摇、纵摇和偏转角,把 γ 换算成 θ。资料里公式(20)(21)做的就是这件事:先由姿态角算出投影分量,再合成出真实的入射角。

这一步错了,边缘波束的水深会系统性偏深或偏浅,而且偏的方向跟航向有关,往返测线一比对就能看出来。问题是很多人只检查中央波束,中央波束的 γ 接近零,换不换算差别极小,看起来一切正常,实际问题全藏在扇面两侧。

5. 系统偏差:横摇、纵摇、艏向为什么不能静态测定

5.1 多波束探头没有可以“对准”的参照物

姿态传感器和电罗经的安装偏差可以静态测定:姿态传感器可以对着船体基准面测倾角,电罗经可以对着船艏线或者已知方位做比对,因为它们有明确的物理参照——重力方向和北向。

多波束探头没有这样的参照。它的“观测对象”是水底,船坞里没有水底可以照。你不可能拿一个水平仪去对探头的发射面,因为真正决定测量结果的是声学扇面的实际朝向,而这个朝向还跟安装支架的微小变形、船体下水后的形变有关。

所以工程上换了一条思路:不去单独测每个设备的安装偏差,而是把探头、姿态传感器、电罗经三者的安装偏差合并成三个“综合偏差”——横摇综合偏差、纵摇综合偏差、艏向综合偏差,通过测量结果反推。一套偏差同时吸收了三个设备的安装误差,测出来直接能用,不需要知道误差具体出在哪个设备上。

5.2 横摇综合偏差:为什么必须挑平坦水域

横摇综合偏差的测定要选平坦水域,这个选择背后有严格的几何理由。

在平坦水域里,艏向偏差只影响水深点的平面位置,不影响水深值;纵摇偏差虽然会影响水深,但对各个水深点是等幅度的,整片水深还是平的。唯独横摇偏差会破坏平坦性:扇面一边抬高、一边压低,往返两条测线在同一个位置会测出一正一负的水深差。

所以平坦水域能把横摇偏差“孤立”出来。测法是用同一条测线往返测量,比较同一位置的水深差异,差异的一半就是横摇偏差造成的影响。测定之后要先行改正,因为后面测纵摇和艏向都要用到改正后的数据。

这里有个实操细节:平坦水域不是绝对的平,选的时候要避开有微地形起伏的区域,否则把地形起伏误当成横摇偏差,改完之后整片地形会变成一个倾斜面。我见过一次,在一个坡度约 0.5 度的“平坦”区测横摇偏差,结果整片测区被强行扳平,跟相邻区块接不上。

5.3 纵摇综合偏差:斜坡加往返,而且必须在艏向之前测

纵摇综合偏差要选在水深有明显变化的水域,最好是航向垂直于斜坡的均匀坡面。测法同样是同测线往返测量,比较同一水深点在航向上的点位变化。

为什么一定要在艏向偏差之前测?因为艏向偏差会让多波束扇面绕垂直轴偏转一个角度,往返两条测线的扇面不再平行,同一位置的两 Ping 覆盖的不是同一片水底,纵摇的比对就失去了基准。资料里明确写了“宜在航向偏差前进行测定”,这个顺序是有依赖关系的,颠倒过来数据就废了。

纵摇偏差的量级通常比横摇小,但对深水测量的影响不小。0.1 度的纵摇偏差在 30 米水深上引起约 5 厘米的水深误差,在 100 米水深上就是 17 厘米,超过很多项目的限差。

5.4 艏向综合偏差:平行测线的重叠带比对

艏向综合偏差的测定方法跟前两个不一样,用的是两条平行测线同向测量,比较重叠带内同一个水深点(或者同一个目标点)在两条测线上的横向位置差异。

有孤立目标点的时候最好办:沉船、暗礁、大块石头,在两条测线上各出现一次,横向偏移量除以两条测线的间距,直接就是艏向偏差的正切值。没有明显目标点时,就用重叠带内的水深匹配来推,精度会差一些,需要更长的重叠带和更多的统计样本。

资料里提到一个很形象的比喻:综合

本文还有配套的精品资源,点击获取

返回列表