4. 环境感知与静态地图构建
无人船要“知道自己在哪、周围有什么”,就必须先把外部世界转换成船载计算机能理解的地图。本节聚焦静态地图构建:电子海图、栅格地图、障碍物表示、水深与岸线数据的使用,以及从感知数据到地图的映射流程。静态地图是任务规划与避碰决策的底图,它不随每一帧传感器刷新,但决定了后续动态感知的“坐标系与语义框架”。
一、电子海图:带语义的矢量底图
电子海图(ENC)以 S-57/S-101 标准组织,本质是矢量要素集合:每个要素有几何(点、线、面)、属性(水深、航标类型、禁航区、锚地)和拓扑关系。与图片不同,电子海图可查询、可计算。例如读取一个面要素的 OBJL=71(航道)与 DRVAL1/DRVAL2(可用水深范围),就能判断某区域是否满足吃水要求。工程上常用 GDAL/OGR 或 S-57 解析库把 ENC 转成 GeoJSON 或直接读入内存,再按船位裁剪出局部区域,避免全图加载。
使用电子海图的关键是坐标基准统一。ENC 通常基于 WGS-84 经纬度,而船载局部栅格地图多用米制平面坐标。必须先确定投影(如 UTM 或局部墨卡托),并明确“北向为 +Y、东向为 +X”的约定,全文与图示保持一致。否则海图要素与雷达点云叠加时会出现系统性偏移。
二、栅格地图:把连续世界离散化
栅格地图把关注水域划分为规则网格,每个格子存储一个值。常用两种:占据栅格(0 空闲、1 占据、未知)用于避碰;代价栅格(0~255)用于路径规划,把浅水、禁航区、离岸距离折算成通行代价。分辨率是核心参数:内河航道可取 0.5 m/格,开阔水域可取 2 m/格。分辨率越细,障碍物边界越精确,但内存与计算量按平方增长。
栅格原点与索引约定必须写清楚:设原点 (x0, y0),分辨率 r,则格 (i, j) 的中心坐标为 x = x0 + (i+0.5)·r,y = y0 + (j+0.5)·r。反算索引用 i = floor((x−x0)/r)。这一组公式是“感知数据落格”的基础,务必在代码与文档中统一。
三、障碍物表示方法
静态障碍物来源不同,表示方式也不同:
- 点障碍:孤立航标、桩、礁石点,用中心点加安全半径表示,落格时把半径覆盖的格子置为占据。
- 线障碍:堤坝、桥墩连线、养殖网箱边界,用折线加膨胀宽度表示,沿线段做栅格化(类似 Bresenham 加粗)。
- 面障碍:浅滩、禁航区、码头,用多边形填充,常用扫描线算法把多边形内部格子置为占据或高代价。
无论哪种,工程上都要做安全膨胀:按船体半宽加安全余量(示例取 1.5 m)向外扩张障碍物,把“船是一个点”的假设转化为“障碍物变大、船为质点”,简化后续规划。膨胀半径必须与船型、航速、定位精度匹配,属于可调参数而非固定值。
四、水深与岸线数据的使用
水深数据来自海图等深线、测深点或公开水深网格。构建时可生成水深栅格:对每个格子取该处水深值,低于船吃水加富余水深(示例:吃水 0.8 m + 富余 0.5 m = 1.3 m)的格子标记为不可通行。等深线是线要素,需先插值成面或栅格,不能直接当边界用。
岸线数据用于界定可航水域边界。把岸线多边形作为“外部障碍”,其内部(陆地侧)置为占据,同时可计算每个可航格到岸线的距离,形成离岸距离场,作为代价栅格的附加项,让规划倾向走航道中央。岸线数据常有简化误差,需与最新影像或现场感知比对后再用。
五、感知数据到地图的映射流程
静态地图构建不是一次性导入,而是“先验底图 + 观测修正”的融合过程。以雷达点云为例,映射分四步:
- 坐标变换:雷达输出为极坐标(距离、方位角),先转船体坐标,再经船位与艏向转局部地图坐标。方位角约定从 +X 轴逆时针为正,与前述坐标系一致。
- 落格:用上面的索引公式把每个点映射到格子。为避免单点噪声造成虚假障碍,采用概率占据更新:命中格按对数几率累加(示例:命中 +0.4,未命中 −0.2),超过阈值(如 0.7)判为占据。
- 与先验融合:海图已知障碍直接置为高置信占据;观测与海图冲突时,保留两者并标记“待确认”,不盲目覆盖先验。
- 膨胀与输出:对融合后的占据栅格做安全膨胀,生成最终避碰层,再与水深、代价层叠加成规划用地图。
六、结果如何判断
地图构建完成后,可从三方面检查:一是几何一致性,把海图岸线与观测点云叠加,看岸线附近点云是否贴合;二是可通行性,抽查若干格子的水深与占据值是否符合预期;三是规划可用性,在已知航道内跑一次规划,看路径是否避开膨胀后的障碍且不穿越浅水区。若出现系统性偏移,优先查投影与原点;若出现零散虚假障碍,优先查落格阈值与噪声过滤。静态地图是后续动态避碰与任务规划的共同基础,其坐标约定与参数版本必须在全船软件中保持一致。