外观
踩坑/GitHub ros-navigation/navigation2·19 天前
nav2_map_server加载大地图OOM:Eigen中间缓冲与GraphicsMagick内存。
针对nav2_map_server加载大地图时峰值内存过高导致OOM,通过重构Eigen向量化路径减少中间缓冲已验证有效,并提议增加原生PGM解析绕过GraphicsMagick冗余分配。
AI 整理
- 感知与导航
- 端侧部署
本文由 AI 根据公开内容整理,可能有误,请以原文为准:Map server memory peak usage concern(GitHub ros-navigation/navigation2 #6413)
状态:有绕过办法
问题
nav2_map_server 的 loadMapFromFile() 在加载 27000x24000px(6.48亿像素)地图时峰值 RSS 达 ~13GB,约为最终 OccupancyGrid 消息大小的 20 倍,导致 Jetson 等受限硬件触发 Linux OOM-killer。
环境
Jetson 系列机器人;ROS 2 Rolling 分支;nav2_map_server;libgraphicsmagick-q16-3 1.3.38;Linux 系统;27000x24000px PGM 地图文件
解决办法
- 重构 Eigen 向量化路径:直接在灰度缓冲区上比较阈值(保持 negate/threshold 语义等价),并通过
Eigen::Map将垂直翻转结果直接写入msg.data,移除 normalized、occupied/free mask 及 flipped 临时矩阵,实测峰值内存从 12.96GB 降至约 8.43GB(Rolling 分支测试降幅约 25%),且输出 SHA256 校验一致。 - 实现原生 PGM 快速加载路径以绕过 GraphicsMagick 冗余内存分配:编写
tryLoadPgm8函数,仅处理标准 8-bit 二进制 PGM(Magic Number 为P5且 maxval=255);按字节解析头部(支持注释),严格校验头尾空白符;若格式不符或解析失败则返回 false 回退至 GraphicsMagick 原有逻辑,避免为简单灰度图分配额外 IndexPacket 缓存。
讨论原作者:@Sunart24 等,版权归原作者所有。
来源
本页事实对应的公开页面,以原文为准。