# Internship_contributions **Repository Path**: lu_chen_jie/internship_contributions ## Basic Information - **Project Name**: Internship_contributions - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-30 - **Last Updated**: 2026-04-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
🌐 语言  ·  English  |  Français  |  中文
# 🚀 实习贡献总览 本仓库记录了我在 **Kitware Europe**(法国里昂)实习期间提交的项目、功能和合并请求,聚焦于 LidarView 生态系统中的**地理参考三维重建**、**传感器数据集成**与**地图可视化** — 涉及 **LidarView**、**VTK** 和 **ParaView** 三个开源项目。 > 📰 这些贡献也收录于 Kitware 官方博客文章:**[Recent Improvements in Georeferenced SLAM in LidarView](https://www.kitware.com/recent-improvements-in-georeferenced-slam-in-lidarview/)** *(Chenjie Lu, Timothee Couble, Tong Fu, Gatien Ferret — 2026年4月7日)* ![LidarView](./assets/LidarViewExample.png) > 本仓库的目的是**记录并展示我在实习期间对各开源生态系统的贡献**。 > > 此处展示的所有工作均**来源于或贡献于开源项目**,公开分享**仅供学习和职业参考之用**。 > > 原始版权归属于 **Kitware Inc.** 及各项目的相应维护者。 ## 核心贡献 - **外部传感器集成** — 面向 IMU、GNSS/INS 和轮式里程计数据的 CSV 读取器,支持可配置的传感器到 LiDAR 变换、单位转换,以及 Qt 配置面板 - **外参标定评估** — 对 XYZ/RPY 偏移量进行暴力搜索的滤波器,通过体素紧凑度对候选结果打分,以确定最优的 LiDAR–INS 外参标定 - **轨迹手动校正** — 在地理地图叠加层上通过锚点交互式调整位姿,随后进行全局位姿图优化 — 无 GPS 的漂移校正 - **卫星影像点云着色** — 将地理参考地图瓦片的 RGB 颜色直接投影到 LiDAR 点云上的滤波器 ## 📁 仓库结构 本仓库经过结构化组织,提供实习工作与开源贡献的全面概览。 - **根目录 README** 作为汇总文档,描述了在 Kitware Europe 实习期间所有主要贡献。 - 下方的 **合并请求部分** 列出了每项贡献及其在 Kitware 官方仓库(VTK、ParaView、LidarView 等)上对应 MR 的链接。 - 每条 MR 记录包含: - **仓库名称** - **MR 链接与编号** - **贡献的简短描述** - **状态**(已合并 🟢、开放中 🟡、草稿 🟠、已关闭 🔴) ## 📋 合并请求 ### LidarView / LVCore | 仓库 | MR | 描述 | 状态 | |------|----|------|------| | LidarView / LVCore | [!597](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/597) | [feat] Select points whose scalar equals any of specified values | 已合并 🟢 | | LidarView / LVCore | [!599](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/599) | [feat] Automatically compute offset from input data when enabled | 已合并 🟢 | | LidarView / LVCore | [!607](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/607) | [feat] Add CSV readers for external sensors (IMU, GNSS/INS, Odometry) | 已合并 🟢 | | LidarView / LVCore | [!611](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/611) | [feat] Add InvertSelection option to vtkSelectPointsByScalars | 已合并 🟢 | | LidarView / LVCore | [!618](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/618) | [feat] Add vtkComputeGeodeticCoordinates filter | 已合并 🟢 | | LidarView / LVCore | [!619](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/619) | [feat] Add a new filter for brute-force extrinsic sweep with trajectory aggregation | 已合并 🟢 | | LidarView / LVCore | [!623](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/623) | [feat] Support projecting the point cloud using an image | 已合并 🟢 | | LidarView / LVCore | [!636](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/636) | [feat] Add image-to-point-cloud color projection filter | 已合并 🟢 | | LidarView / LVCore | [!643](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/643) | [feat] Add ROI-based curb detection filter with left/right RANSAC inliers | 已合并 🟢 | | LidarView / LVCore | [!645](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/645) | [feat] Add offline curb detection from aggregated point clouds | 已合并 🟢 | | LidarView / LVCore | [!647](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/647) | [feat] Add vtkImageColorToPointCloud filter with 2D grid projection | 已合并 🟢 | | LidarView / Slam | [!504](https://gitlab.kitware.com/keu-computervision/slam/-/merge_requests/504) | [feat] Add external sensor optional input | 已合并 🟢 | | LidarView / Slam | [!505](https://gitlab.kitware.com/keu-computervision/slam/-/merge_requests/505) | [feat] Add external sensor data selection button in subset dialog | 已合并 🟢 | | LidarView / Slam | [!513](https://gitlab.kitware.com/keu-computervision/slam/-/merge_requests/513) | [feat] Add manual constraint points in slam | 已合并 🟢 | ### VTK | 仓库 | MR | 描述 | 状态 | |------|----|------|------| | VTK | [!12459](https://gitlab.kitware.com/vtk/vtk/-/merge_requests/12459) | [feat] Add support for LAS offset metadata | 已合并 🟢 | | VTK | [!12464](https://gitlab.kitware.com/vtk/vtk/-/merge_requests/12464) | [fix] Correct thresholding behavior in vtkThresholdPoints | 已合并 🟢 | ### ParaView | 仓库 | MR | 描述 | 状态 | |------|----|------|------| | ParaView | [!7485](https://gitlab.kitware.com/paraview/paraview/-/merge_requests/7485) | [feat] Add option to apply offset in PDAL reader,关联 [!12459](https://gitlab.kitware.com/vtk/vtk/-/merge_requests/12459) | 已合并 🟢 | | ParaView | [!7504](https://gitlab.kitware.com/paraview/paraview/-/merge_requests/7504) | [fix] Update vtkSLACPlaneGlyphs to use the new threshold API,关联 [!12464](https://gitlab.kitware.com/vtk/vtk/-/merge_requests/12464) | 已关闭 🔴 | | ParaView | [!7516](https://gitlab.kitware.com/paraview/paraview/-/merge_requests/7516) | [feat] Add new matrix tab for InteractiveBox | 已合并 🟢 | | ParaView | [!7549](https://gitlab.kitware.com/paraview/paraview/-/merge_requests/7549) | [feat] Add OpenStreetMap support for Geopraphicalmap Plugin | 已合并 🟢 | | ParaView | [!7580](https://gitlab.kitware.com/paraview/paraview/-/merge_requests/7580) | [fix] CompositeDecorator: child decorators incorrectly participate in top-level AND evaluation | 已合并 🟢 | ## 🔬 精选贡献详解 *上述合并请求涵盖了全部工作范围。以下各节将深入介绍五项精选贡献,包括技术背景、实现细节与可视化结果。* ### 外部传感器集成 — [!607](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/607) 基于 SLAM 的定位可以从辅助传感器 — **IMU**、**GNSS/INS** 和**轮式里程计** — 中获益,以提升精度和鲁棒性。然而在实际使用中,这些数据很少以标准化格式存在:单位各异(g 与 m/s²,度与弧度),不同设备的列名不同,传感器与 LiDAR 之间的标定变换也因安装方式而异。 为此,我在 VTK 管线中开发了一套 **C++ CSV 读取器**,能够从任意 CSV 文件中加载上述三类传感器数据,并支持可配置的单位转换。我还设计并实现了一个 **基于 Qt 的配置面板**,将所有必要参数集中呈现:传感器类型选择、传感器到 LiDAR 的位姿变换,以及通过下拉菜单将目标字段与 CSV 列对应的列映射表。 下面两张截图展示了用户视角下的集成效果 — 左侧为文件打开对话框,右侧为完整配置面板。
LidarView 文件打开对话框,显示 External Sensor Reader 选项 配置面板:传感器类型、位姿变换和 CSV 列映射
*左:LidarView 文件打开对话框,External Sensor Reader 作为可选项出现。右:配置面板 — 传感器类型选择、位姿变换以及 CSV 列映射。* --- ### 外参标定评估 — [!619](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/619) LiDAR 与 INS 之间精确的**外参标定**对于地理参考建图至关重要:即使微小的角度或平移偏差也会导致聚合点云出现模糊或错位。下方两张点云视图直观展示了这一差异 — 左侧为*标定不准确*时的结果,可见明显的重影和扩散;右侧为*标定精准*时的结果,几何形状清晰紧凑。 ![左:标定不准确的点云(模糊);右:标定准确的点云(清晰)。红框标注了差异最明显的区域。](assets/Good-Bad%20Calibratoin.png) 在没有精确真值的情况下,手动评估数百种参数组合的标定质量根本不可行。为此,我开发了一个新的 VTK 滤波器 — *`vtkCalibrationEvaluation`* — 对 XYZ 平移和 RPY 旋转偏移量进行**暴力搜索**。 对于每个候选参数,滤波器将 LiDAR 帧沿 INS 轨迹重投影,并通过**体素紧凑度**对结果评分:被占用的体素越少,代表建图越精准、标定越好。下方评分曲线直接显示在 LidarView 图表视图中,展示了旋转搜索过程中体素数量的变化 — **明显的极小值**即为最优标定角度。 ![LidarView 显示旋转搜索过程中的标定评分曲线。曲线最小值即为最优外参标定。](assets/Calibration-Result.png) --- ### 基于传感器投影的点云着色 — [!623](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/623) 原始 LiDAR 点云在几何上精确,但不包含颜色信息,这限制了其在场景理解或目标标注等任务中的可解释性。一种实用的方法是利用共配准相机的数据对三维点进行着色。 我扩展了 LidarView 中现有的 *`CameraProjector`* 滤波器,使其支持**无时间戳元数据**的图像(这在处理离线数据集时很常见),并添加了适用于非标准相机朝向的自动垂直翻转选项。该滤波器使用相机的**内参和外参标定参数**(可从文件加载或手动输入)将每个三维点投影到图像平面上。支持多种着色模式:*图像 RGB 颜色*、*激光回波强度*以及*到相机的距离*。 下方截图展示了将**强度着色模式**应用于街道场景的效果:每个点根据*激光回波强度*(表面反射率)着色,揭示了普通深度视图中不可见的材质和表面特性 — 路面标线、植被和车辆。 ![使用扩展后的 CameraProjector 滤波器,通过激光回波强度着色的街道场景点云](assets/Color_Projection.png) --- ### 基于 ROI 的路缘检测 — [!643](https://gitlab.kitware.com/LidarView/lidarview-core/-/merge_requests/643) 在三维点云中检测**道路路缘**是自动驾驶管线中的关键步骤 — 它们定义了可行驶区域,并作为定位的稳定几何参考。对整个场景直接进行检测既慢又容易产生来自道路外结构的误检。 为此,我开发了一个 VTK 滤波器,将分析限定在用户在 LidarView 中通过交互式选择框定义的**三维感兴趣区域(ROI)**内。在该区域内,滤波器将候选点分为左右两组,并对每组独立应用**三维直线 RANSAC** 算法,使检测对噪声和异常值具有较强鲁棒性。 结果如下所示:检测到的路缘内点经过**颜色编码** — *蓝色代表左侧边界,绿色代表右侧* — 使输出直观清晰,可直接用于下游处理。 ![鸟瞰道路场景,显示检测到的路缘内点:蓝色点为左侧路缘,绿色点为右侧路缘](assets/ROI-based-Curb-Detection.png) --- ### SLAM 中的手动轨迹约束 — [!513](https://gitlab.kitware.com/keu-computervision/slam/-/merge_requests/513) SLAM 通过持续根据帧间匹配估计传感器位置来增量式构建地图。这种方法总体表现良好,但存在一个根本局限:微小的测量误差会随时间积累,导致地图逐渐**漂移**偏离真实位置。GPS 数据通常可以修正这种漂移 — 但在隧道或地下等 GPS 信号不可靠的环境中,这种修正手段不再可用。 我的任务是开发一种**不依赖 GPS 的手动校正方法**。核心思路是以参考地图作为空间锚点:在定位准确的区域,点云与地图自然对齐;在误差累积的区域,用户可直接通过界面放置校正锚点;最终的**位姿图优化**将这些校正全局传播,提升轨迹整体一致性。 为此,我在 LidarView 的 SLAM 插件中添加了**交互式手动约束功能**。用户可以使用三维光标在轨迹上放置位置锚点,这些锚点将被添加到约束列表中。第二种锚点类型 — *固定位姿* — 作为**硬参考点**,防止优化器移动该锚点之前的位姿,从而精确控制轨迹的哪个部分被校正。 下方截图展示了一次校正会话的结果。**蓝色轨迹**为 *SLAM 初始输出*;**红色轨迹**为*经位姿图优化后的校正版本*。两者之间可见的偏移量直观展示了手动锚点将轨迹拉回预期真实位置的效果。 ![位姿图优化前后对比:蓝色 = 初始 SLAM 轨迹,红色 = 位姿图优化后的校正轨迹](assets/Contrainte-Pose-1.png) *下方[演示部分](#-演示)提供了该工作流程的完整交互演示。* ## 🎬 演示 ### 地图引导的轨迹校正 本次实习开发的核心功能之一,是在 LidarView 中使用**地理地图叠加层进行交互式轨迹校正**。 将 SLAM 轨迹显示在地图(如 OpenStreetMap)上后,在交叉口或道路边缘等已知地标附近,位置漂移便一目了然。为了进行校正,SLAM 插件被扩展以支持**手动位姿图锚点**:用户选取轨迹上的位姿,将其拖拽到地图上的正确位置,然后触发全局位姿图优化 — 整个过程无需重新运行 SLAM 管线。 下方视频展示了一次真实的校正会话:车辆轨迹通过地图派生的锚点约束,被对齐到其实际行驶的道路上。 [![地图引导的轨迹校正](assets/demo_thumbnail.png.png)](assets/Demo_Pose_Graph_x264.mp4) ### 基于手动锚点的位姿图优化 基于 SLAM 的建图以增量方式构建轨迹,这意味着微小误差会随时间积累 — 即所谓的**漂移**。当没有 GPS 或外部传感器可自动修正时,该功能允许用户在轨迹上手动放置**校正锚点**,并运行全局优化以重新对齐轨迹。 支持两种锚点类型: - **位置锚点** — 仅校正轨迹上特定点的三维位置 - **固定位姿锚点** — 同时锁定位置和朝向(完整的六自由度),作为硬参考:优化不会移动此锚点之前的任何位姿,防止校正传播到轨迹的早期部分 下方动画演示了完整工作流程:启用手动约束、在三维视图中交互式放置锚点,以及触发优化。 ![基于手动锚点的位姿图优化](assets/manual_pose_constraint.gif) ### 卫星影像点云着色 在点云旁边显示底图固然有用,但两个图层在视觉上仍然是分离的。为弥合这一差距,我开发了一个新滤波器 — *`ImageColorToPointCloud`* — 将任意地理参考图像的颜色直接投影到三维点上。 该滤波器接受两个输入:带有 **RGB 信息的地图图层**(卫星瓦片、航拍影像,或任何地理参考图像网格)和**地理参考 LiDAR 点云**。对于每个三维点,它在地图上对应的地理位置采样颜色,并将其赋值为该点的 RGB 值 — 生成一个视觉上与真实世界影像融合的着色点云。 下方视频展示了使用 **MapQuest 卫星数据**的效果:通过 SLAM 将 LiDAR 传感器与 INS 设备融合构建的地理参考三维地图,使用 LidarView 中加载的卫星瓦片图层实时着色。 [![卫星影像点云着色](assets/demo_colorisation.png)](assets/Demo2_Colorisation_x264.mp4) ## 🧩 补丁文件 所有合并请求均以补丁文件的形式存档于 [`patches/`](./patches) 目录中,包含每个 MR 中提交的精确代码修改。