# 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 主题订阅**: ```javascript - /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` **状态树结构**: ```javascript { 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**: ```javascript // 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. **安装依赖** ```bash npm install google-protobuf@3.21.4 --save ``` 2. **复制 proto 文件** ```bash # 从 robot_map_editor 复制 robot_map_editor/proto/*.proto → pns-web/proto/ robot_map_editor/src/datastruct/proto/*.js → pns-web/src/datastruct/proto/ ``` 3. **创建解析工具** ```javascript // 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` **需要实现的接口**: ```javascript // 统计信息 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 通信集成 **状态**: ✅ 已在主页面中实现基础框架 **待完善**: - [ ] 引导点发布(点击地面发送目标点) - [ ] 手动控制指令发布(摇杆控制) - [ ] 参数配置发布(引导模式开关) - [ ] 错误处理和重连机制 **发布主题**: ```javascript ${prefix}/exploration/guidance // 引导点 ${prefix}/joy/command // 手动控制 ${prefix}/param/setup // 参数配置 ``` --- ### Phase 9: 路由配置(优先级:低) #### 任务 12: 添加路由 **文件**: `src/router/index.js` **路由配置**: ```javascript { path: '/map/vslam/:mapName', name: 'VSlamPreview', component: () => import('@/views/map/vslam/index'), meta: { title: 'VSLAM 建图预览', icon: 'el-icon-view', noCache: true } } ``` **跳转方式**: ```javascript 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 个关键帧 ### 用户体验 - 🎯 界面响应流畅 - 🎯 操作符合直觉 - 🎯 错误提示友好 - 🎯 加载状态清晰 --- ## 📚 参考文档 - ✅ 详细移植方案: `VSLAM_MIGRATION_PLAN.md` - ✅ 源项目分析: robot_map_editor 技术解读(见移植方案) - 📖 Potree 文档: http://potree.org/ - 📖 Three.js 文档: https://threejs.org/docs/ - 📖 Element UI: https://element.eleme.cn/ --- ## 🎉 里程碑 - [x] 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 **状态**: 🚧 进行中