VSLAM_PROGRESS.md 12 KB

VSLAM 建图预览功能移植进度报告

最后更新: 2025-11-06
当前状态: 🚧 进行中 (Phase 1 已完成)


📊 总体进度

████████░░░░░░░░░░ 40% 完成 (5/13 任务)
阶段 任务 状态 完成时间
Phase 1 ✅ 创建主页面组件 已完成 2025-11-06
Phase 1 ✅ 创建 Vuex Store 模块 已完成 2025-11-06
Phase 2 ⏳ 创建 3D 渲染组件 待实施 -
Phase 3 ⏳ 创建 Web Workers 待实施 -
Phase 4 ⏳ 创建工具类 待实施 -

✅ 已完成任务

1. 创建 VSlamPreview 主页面组件

文件: src/views/map/vslam/index.vue

功能特性:

  • ✅ Vue 2 组件结构
  • ✅ 集成 Vuex 状态管理
  • ✅ MQTT 消息订阅和处理
  • ✅ 全屏模式支持(网页全屏 + 浏览器全屏)
  • ✅ 视角切换控制
  • ✅ 引导模式切换
  • ✅ 机器人位姿实时更新
  • ✅ 可视化对象显示
  • ✅ 规划轨迹显示

MQTT 主题订阅:

- /exploration/localization/pose        // 机器人位姿
- /visualization/object                 // 可视化对象
- /exploration/planning/trajectory      // 规划轨迹
- /ability/function/action/exec/state   // 动作执行状态

关键方法:

  • handlePoseUpdate() - 处理位姿更新
  • handleVisualizationObject() - 显示检测对象
  • handlePlanningTrajectory() - 显示规划路径
  • handleViewChange() - 切换视角
  • handleBootToggle() - 引导模式开关
  • requestFullscreen() / exitFullscreen() - 全屏控制

2. 创建 Vuex Store 模块

文件: src/store/modules/vslam.js

状态树结构:

{
  mapName: '',                    // 地图名称
  currentView: 5,                 // 当前视角 (1-5)
  bootModeIsCheck: false,         // 引导模式
  runningState: false,            // SLAM 运行状态
  robotPosition: {x,y,z},         // 机器人位置
  robotVisiable: false,           // 机器人可见性
  replayState: 0,                 // 回放状态
  fullScreen: {},                 // 全屏配置
  uiConfig: {},                   // UI 配置
  // ... 更多状态
}

Mutations (15个):

  • SET_MAP_NAME - 设置地图名
  • SET_CURRENT_VIEW - 设置视角
  • SET_BOOT_MODE - 设置引导模式
  • SET_RUNNING_STATE - 设置运行状态
  • SET_ROBOT_POSITION - 更新位置
  • 等...

Actions (20个):

  • updateMapName - 更新地图名
  • setCurrentView - 切换视角
  • setBootMode - 切换引导模式
  • vslamClear - 清空所有数据
  • 等...

Getters (8个):

  • mapName - 获取地图名
  • isBootMode - 是否引导模式
  • isRunning - 是否运行中
  • robotPosition - 机器人位置
  • 等...

已注册到主 Store:

// src/store/index.js
import vslam from './modules/vslam'

modules: {
  // ...
  vslam  // ✅ 已注册
}

📂 已创建的文件结构

pns-web/
├── src/
│   ├── views/map/vslam/
│   │   ├── index.vue                    ✅ 主页面组件
│   │   ├── components/                  📁 组件目录已创建
│   │   └── utils/                       📁 工具目录已创建
│   │
│   ├── store/modules/
│   │   └── vslam.js                     ✅ Vuex Store 模块
│   │
│   └── datastruct/proto/                📁 Protobuf 目录已创建
│
├── VSLAM_MIGRATION_PLAN.md             ✅ 详细移植方案
└── VSLAM_PROGRESS.md                   ✅ 本进度报告

⏳ 待完成任务清单

Phase 2: 核心 3D 渲染(优先级:高)

任务 3: 创建 VSlamView 核心渲染组件

文件: src/views/map/vslam/components/VSlamView.vue

需要实现的功能:

  • Potree Viewer 初始化
  • Three.js 场景设置
  • 点云数据接收和渲染
  • 机器人模型加载(VRML/GLTF/OBJ)
  • 相机控制和视角切换
  • 地面网格动态扩展
  • 视锥剔除优化
  • 点云稀释算法
  • 引导模式点击事件
  • 资源清理和内存管理

技术要点:

  • 使用 Potree 全局对象(已包含在 public/static_assets/libs/)
  • Three.js 版本需要兼容 Potree (0.132.2)
  • 点云颜色按高度映射(蓝→绿→黄→红)
  • 最多显示 100 帧关键帧(稀释算法)

Phase 3: Web Workers 实现(优先级:高)

任务 4: 创建 3 个 Web Workers

目标目录: public/workers/

需要创建的文件:

  1. StatisticsWorker.js - 统计信息轮询

    • 每秒轮询 /v1/vslam/statistics?map={mapName}
    • 返回关键帧数量、闭环数量、运行状态
    • 可启动/停止轮询
  2. KeyframeWorker.js - 点云数据获取

    • 获取 /v1/vslam/keyframe/cloud?map={map}&idx={idx}
    • ArrayBuffer 格式数据
    • Protobuf 解析由主线程完成
  3. KeyframeTransWorker.js - 变换矩阵获取

    • 获取 /v1/vslam/keyframe/trans?map={map}&idx={idx}
    • ArrayBuffer 格式数据
    • 包含 3x3 旋转矩阵 + 3D 平移向量

技术要点:

  • Workers 放在 public/ 下,通过绝对路径引用
  • 使用 Fetch API 进行网络请求
  • 返回 Uint8Array 供主线程解析

Phase 4: 工具类实现(优先级:中)

任务 5: CreateMesh.js

文件: src/views/map/vslam/utils/CreateMesh.js

需要实现的类:

  • CreateGroundMesh - 地面网格
  • CreateFlowmark - 点击波纹效果
  • CreateObjectBox - 3D 边界框
  • CreateShapMesh - 路径形状
  • CreatePlaybackeMesh - 回放路径

可直接复制: ✅ robot_map_editor 的 CreateMesh.js(纯 JS,无框架依赖)


任务 6: Utils.js

文件: src/views/map/vslam/utils/Utils.js

核心函数:

  • genParticles() - 生成点云粒子系统
    • 坐标变换(传感器坐标 → 世界坐标)
    • 颜色映射(高度 → RGB)
    • Shader 材质创建
  • arraysEqual() - 数组比较工具

可直接复制: ✅ robot_map_editor 的 Utils.js


Phase 5: Protobuf 配置(优先级:中)

任务 7: 配置 Protobuf

步骤:

  1. 安装依赖

    npm install google-protobuf@3.21.4 --save
    
  2. 复制 proto 文件

    # 从 robot_map_editor 复制
    robot_map_editor/proto/*.proto → pns-web/proto/
    robot_map_editor/src/datastruct/proto/*.js → pns-web/src/datastruct/proto/
    
  3. 创建解析工具

    // src/datastruct/proto/parser.js
    import kfcloud from './pointcloud_pb'
    import kftrans from './transform_pb'
    
    export function parsePointcloud(arrayBuffer) {
    return kfcloud.PointcloudType.deserializeBinary(new Uint8Array(arrayBuffer)).toObject()
    }
    
    export function parseTransform(arrayBuffer) {
    return kftrans.Transform.deserializeBinary(new Uint8Array(arrayBuffer)).toObject()
    }
    

Phase 6: API 接口封装(优先级:中)

任务 8: VSlamAPI.js

文件: src/api/map/vslam.js

需要实现的接口:

// 统计信息
getVSlamStatistics(mapName)

// 点云数据
getKeyframePointcloud(mapName, idx)

// 变换矩阵
getKeyframeTrans(mapName, idx)

// 闭环详情
getClosureDetails(mapName, idx)

// URL 生成器(供 Workers 使用)
urlVSlamStatistics(mapName)
urlKeyframePointcloud(mapName, idx)
urlKeyframeTrans(mapName, idx)

API 前缀: /pns


Phase 7: UI 组件(优先级:中)

任务 9: VSlamControlPanel.vue

文件: src/views/map/vslam/components/VSlamControlPanel.vue

功能模块:

  • 视角模式选择(下拉框)
  • 引导模式开关
  • 手动控制开关
  • 实时视频开关
  • 全屏按钮
  • 回放按钮
  • 机器人位置显示
  • 手动控制摇杆(集成 vue-joystick-component)

UI 框架: Element UI Drawer + Form + Switch


任务 10: VSlamToolbar.vue

文件: src/views/map/vslam/components/VSlamToolbar.vue

功能模块:

  • 面包屑导航
  • 机器人位置显示(顶部显示)
  • 创建子地图按钮
  • 刷新按钮
  • 返回按钮

UI 框架: Element UI Breadcrumb + Button


Phase 8: MQTT 集成(优先级:高)

任务 11: MQTT 通信集成

状态: ✅ 已在主页面中实现基础框架

待完善:

  • 引导点发布(点击地面发送目标点)
  • 手动控制指令发布(摇杆控制)
  • 参数配置发布(引导模式开关)
  • 错误处理和重连机制

发布主题:

${prefix}/exploration/guidance        // 引导点
${prefix}/joy/command                // 手动控制
${prefix}/param/setup                // 参数配置

Phase 9: 路由配置(优先级:低)

任务 12: 添加路由

文件: src/router/index.js

路由配置:

{
  path: '/map/vslam/:mapName',
  name: 'VSlamPreview',
  component: () => import('@/views/map/vslam/index'),
  meta: { 
    title: 'VSLAM 建图预览', 
    icon: 'el-icon-view',
    noCache: true 
  }
}

跳转方式:

this.$router.push({
  name: 'VSlamPreview',
  params: { mapName: 'my_map_001' }
})

Phase 10: 测试和调试(优先级:最高)

任务 13: 全面测试

测试类型:

1. 功能测试

  • 页面加载和初始化
  • Potree Viewer 正常工作
  • 点云数据正确显示
  • 机器人位姿更新
  • 视角切换正常
  • 引导模式点击生效
  • 回放功能正常
  • MQTT 通信正常

2. 性能测试

  • 大规模点云流畅度(>1000帧)
  • 内存占用 < 2GB
  • CPU 占用 < 50%
  • 视锥剔除生效(减少渲染量)

3. 兼容性测试

  • Chrome 最新版
  • Edge 最新版
  • Firefox 最新版

🔨 下一步行动计划

优先级排序

  1. 紧急且重要

    • 创建 VSlamView 核心渲染组件
    • 创建 3 个 Web Workers
    • 配置 Protobuf
  2. 重要但不紧急 📋

    • 创建工具类(CreateMesh, Utils)
    • 封装 API 接口
    • 创建控制面板组件
  3. 紧急但不重要

    • MQTT 通信完善
    • 路由配置
  4. 不紧急不重要 📝

    • UI 优化
    • 文档完善

📋 剩余工作量估算

任务类型 预计工时 难度
VSlamView 组件 2天 ⭐⭐⭐⭐⭐
Web Workers 0.5天 ⭐⭐
工具类复制 0.5天
Protobuf 配置 0.5天 ⭐⭐
API 封装 1天 ⭐⭐⭐
UI 组件 1.5天 ⭐⭐⭐
MQTT 集成 0.5天 ⭐⭐
路由配置 0.1天
测试调试 1天 ⭐⭐⭐⭐
总计 ~8天 -

⚠️ 注意事项

技术约束

  1. Three.js 版本必须是 0.132.2(与 Potree 兼容)
  2. Potree 已包含在项目中(public/static_assets/libs/potree)
  3. Web Workers 必须放在 public/ 目录下
  4. Protobuf 需要 google-protobuf@3.21.4

后端依赖

确保后端实现了以下 API:

  • /v1/vslam/statistics
  • /v1/vslam/keyframe/cloud
  • /v1/vslam/keyframe/trans
  • ⚠️ /v1/vslam/closure/details (可选)

MQTT 主题

确保 MQTT Broker 支持以下主题:

  • 订阅: /exploration/localization/pose
  • 订阅: /visualization/object
  • 订阅: /exploration/planning/trajectory
  • 发布: /exploration/guidance
  • 发布: /joy/command

📊 质量指标

代码质量

  • ✅ 代码符合 ESLint 规范
  • ✅ 组件遵循 Vue 2 最佳实践
  • ✅ Vuex 状态管理规范
  • ✅ 详细的代码注释

性能目标

  • 🎯 首次渲染时间 < 2秒
  • 🎯 点云渲染帧率 > 30 FPS
  • 🎯 内存占用 < 2GB
  • 🎯 支持 > 1000 个关键帧

用户体验

  • 🎯 界面响应流畅
  • 🎯 操作符合直觉
  • 🎯 错误提示友好
  • 🎯 加载状态清晰

📚 参考文档


🎉 里程碑

  • 2025-11-06: Phase 1 完成 - 基础架构搭建
  • 2025-11-08: Phase 2 完成 - 核心渲染实现
  • 2025-11-10: Phase 3-4 完成 - Workers 和工具类
  • 2025-11-12: Phase 5-7 完成 - API 和 UI
  • 2025-11-14: Phase 8-9 完成 - 集成和配置
  • 2025-11-15: Phase 10 完成 - 测试验收

📞 联系方式

如有问题或需要技术支持,请联系项目负责人。


生成时间: 2025-11-06
版本: v1.0
状态: 🚧 进行中