3. 海洋环境建模与栅格化表达
自主航行的路径规划并不是直接在“海图”上画线,而是在一个可计算的环境模型上搜索。电子海图(ENC)提供的是面向航海人员的矢量数据,栅格地图提供的是面向算法的离散代价场,两者之间需要一次严谨的“翻译”。本节围绕这条数据链展开:从 ENC 数据解析,到水深与碍航物提取,再到栅格地图构建,最后用环境复杂度度量判断这张图是否“好用”。
一、ENC 数据解析:先弄清数据组织方式
ENC 遵循 S-57 标准,采用“特征对象 + 空间对象”的分离结构。特征对象(如 DEPARE 水深区域、OBSTRN 障碍物、LNDARE 陆地区域、COALNE 海岸线、NAVLNE 航道中线)描述“是什么”,空间对象(Point、Line、Area)描述“在哪里”。两者通过特征对象记录中的 FSPT、FSLN、FSAR 字段关联到空间对象 ID。解析时若只读几何而忽略特征属性,就会丢失水深区间、障碍物性质等关键语义。
实际工程中常用 GDAL/OGR 的 S-57 驱动或 Python 的 pyogrio、fiona 读取。以 GDAL 为例,可先列出图层,再按图层导出为 GeoJSON 或直接转为栅格:
ogrinfo -so harbour.000 harbour
# 查看图层:DEPARE、OBSTRN、LNDARE、COALNE、NAVLNE ...
ogr2ogr -f GeoJSON depare.geojson harbour.000 DEPARE
ogr2ogr -f GeoJSON obstrn.geojson harbour.000 OBSTRN
需要注意三个易错点:其一,S-57 使用 WGS84 经纬度,而栅格规划通常在局部平面坐标下进行,需先投影(如 UTM 或本地墨卡托),否则经纬度直接当米用会导致尺度严重失真;其二,DEPARE 的 DRVAL1/DRVAL2 给出的是水深区间上下界,不是单值;其三,部分 ENC 存在叠加与缝隙,相邻面之间可能有未覆盖的“空洞”,需在栅格化时做填充或标记为未知。
二、水深与碍航物提取
提取的目标是把矢量语义转成“每个位置是否可通行、代价多大”。对水深,可按 DRVAL1(浅界)作为保守水深值,与船舶吃水 draft 加安全余量 ukc(Under Keel Clearance)比较:DRVAL1 - draft < ukc 的区域判为不可通行。对碍航物,OBSTRN 的 VALSOU 给出障碍物最浅深度,同样与吃水比较;WRECKS(沉船)、UWTROC(水下礁石)需单独处理,因为其属性字段与 OBSTRN 不完全一致。
陆地区域 LNDARE 与海岸线 COALNE 直接作为硬障碍。航道中线 NAVLNE 不参与通行性判断,但可作为代价加权的“偏好通道”,在栅格上叠加一个较低的通行代价,引导规划结果贴近习惯航路。提取完成后,建议输出一张分层清单:硬障碍层(陆地、浅水、碍航物)、软约束层(航道偏好、禁渔区)、未知层(数据空洞),后续栅格化按层叠加。
三、栅格地图构建方法
栅格化的核心是“把连续空间切成等距小格,并为每格赋一个状态”。设局部平面坐标原点在作业区西南角,分辨率 Δ 取 5 m(近岸狭窄水域可取 2~3 m,开阔水域可取 10 m),则格网行列号与坐标关系为 col = floor((x - x0)/Δ)、row = floor((y - y0)/Δ)。分辨率的选择是精度与计算量的折中:Δ 减半,格数变为四倍,A* 的搜索开销随之上升。
每格状态建议用三值加代价的复合编码:0 可通行、1 硬障碍、-1 未知;代价字段单独存放,用于叠加航道偏好与安全距离惩罚。矢量转栅格时,对面积对象采用“格心落入多边形”判定,对线对象(如航道中线)采用缓冲区栅格化。硬障碍还需做膨胀处理:按船舶半宽加安全余量 r_safe 膨胀 ceil(r_safe/Δ) 个格,避免规划出的路径贴边擦过障碍。
一个可复现的构建流程如下(示例参数,非实测):吃水 6.0 m、UKC 1.5 m、安全余量 8 m、Δ=5 m。先投影到 UTM,再按上述阈值生成硬障碍层,膨胀 2 格;航道中线缓冲 20 m 赋代价 0.6;其余可通行格代价 1.0。最终得到一张 rows×cols 的代价矩阵,作为后续 A*、D* Lite 或 RRT* 的输入。
四、环境复杂度度量
同一套规划算法在不同海区的表现差异很大,原因往往在环境复杂度。可用三个指标快速刻画:可通行率 P = N_free / N_total,反映搜索空间大小;障碍密度 ρ = N_obs / N_total,反映碰撞风险;通道狭窄度,用可通行区域的最小宽度与船宽之比衡量,比值接近 1 时规划极易失败。工程上还可计算可通行区域的连通分量数,若起点与终点不在同一分量,说明硬约束过严或数据有误,应先排查而非调算法。
Δ、增大膨胀半径,并考虑引入航道偏好代价或改用采样类算法。五、案例实操:一个港池的栅格化
假设某港池 ENC 切片包含 DEPARE(DRVAL1 分别为 3.2 m、7.5 m、12.0 m)、两处 OBSTRN(VALSOU 4.1 m 与 9.0 m)、一条 NAVLNE 与四周 LNDARE。按吃水 6.0 m、UKC 1.5 m 判定:DRVAL1=3.2 m 的区域 3.2−6.0=−2.8 < 1.5,判为硬障碍;VALSOU=4.1 m 的障碍物同样判为碍航;VALSOU=9.0 m 的障碍物 9.0−6.0=3.0 ≥ 1.5,可通行但应加代价惩罚。栅格化后统计:总格数 48000,可通行 31200,硬障碍 15600,未知 1200,则 P≈0.65、ρ≈0.325。若起点与终点连通分量一致,即可进入路径搜索;若不一致,优先检查未知层是否切断了通道。
最后提醒:栅格地图是静态快照,实际航行还需叠加潮汐、动态障碍与禁航区更新。把 ENC 解析、要素提取、栅格化与复杂度评估串成可重复执行的脚本,才能在环境变化时快速重建模型,而不是每次手工重画。