Files
worldmodel/plans/PRISM/10_tech_stack.md
T
gaojie dbcbdbb59e chore: 为所有 md 文件添加 Hugo front matter
- 处理: 74 个 .md 文件
- 跳过: 0 个(无已存在的 front matter)
- 异常: 3 个(H1 缺失,用文件名兜底)
  - plans/PRISM/.research/readmes/3d-llm.md
  - plans/PRISM/.research/readmes/openmask3d.md
  - plans/PRISM/.research/readmes/openscene.md
2026-05-20 22:42:22 +08:00

393 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
title: "Chapter 10 — 技术栈选型"
date: 2026-05-20
draft: false
tags: ["PRISM", "世界模型", "空间记忆", "SLAM", "VIO", "点云"]
categories: ["worldmodel"]
---
# Chapter 10 — 技术栈选型
> 本章目标:把前面章节涉及的所有"软件 / 算法 / 模型"按层级列出,给出**版本号、依赖关系、为什么选它**,让团队拿到这章就能搭出可复现的环境。
---
## 10.1 整体层级图
```mermaid
flowchart TB
L7["<b>Layer 7 — Agent / Application</b><br/>GPT-4o · Qwen2.5-VL · LangGraph · ROS 2 Action Servers"]
L6["<b>Layer 6 — PRISM Core(本项目自研)</b><br/>spatial_memory.* · relocalizer · workers · consolidator"]
L5["<b>Layer 5 — Perception Models</b><br/>CLIP · DINOv2 · YOLO-World · SAM 2 · Grounding-DINO"]
L4["<b>Layer 4 — Geometry & Mapping</b><br/>Open3D · TEASER++ · gsplat · nerfstudio · OctoMap · nvblox"]
L3["<b>Layer 3 — SLAM / VIO / Sensor Drivers</b><br/>ZED SDK · RoomPlan · ARKit · ORB-SLAM3(备) · rtabmap(备)"]
L2["<b>Layer 2 — Middleware</b><br/>ROS 2 Humble · tf2 · message_filters · rclpy / rclcpp"]
L1["<b>Layer 1 — Storage / Database</b><br/>JSON · HDF5 · Faiss · Neo4j · SQLite (catalog)"]
L0["<b>Layer 0 — System</b><br/>Ubuntu 22.04 · CUDA 12.2 · cuDNN 8.9 · Python 3.10"]
L7 --> L6 --> L5 --> L4 --> L3 --> L2 --> L1 --> L0
style L6 fill:#fff7d6,stroke:#c97a00,stroke-width:2px
style L7 fill:#e3f2fd,stroke:#1565c0
style L0 fill:#eeeeee,stroke:#555
```
---
## 10.2 完整版本矩阵
| 层 | 组件 | 版本 | License | 用途 |
|----|------|------|---------|------|
| L0 | Ubuntu | 22.04 LTS | open | 主操作系统 |
| L0 | CUDA | 12.2 | NVIDIA EULA | GPU runtime |
| L0 | cuDNN | 8.9 | NVIDIA | DL backend |
| L0 | TensorRT | 10.0 | NVIDIA | Jetson 推理优化 |
| L0 | Python | 3.10 | PSF | 主语言 |
| L0 | PyTorch | 2.3 + CUDA12 | BSD | 训练 / 推理 |
| L1 | Faiss | 1.8 (cpu/gpu) | MIT | CLIP 向量库 |
| L1 | Neo4j Community | 5.20 | GPLv3 | 生产期图库 |
| L1 | SQLite | 3.42 | PD | metadata catalog |
| L1 | h5py | 3.11 | BSD | ARKit 帧序列 |
| L2 | ROS 2 | Humble Hawksbill | Apache 2.0 | 中间件 |
| L2 | tf2 | (ROS2 包) | BSD | 坐标变换 |
| L3 | ZED SDK | 4.1 | proprietary | ZED 2i 驱动 + VIO |
| L3 | pyzed | 4.1 | proprietary | Python 绑定 |
| L3 | RoomPlan / ARKit | iOS 17+ | Apple | 扫描 SDK |
| L3 | ORB-SLAM3 | 1.0 (备选) | GPLv3 | 备用 VIO |
| L3 | rtabmap | 0.21 (备选) | BSD | 备用 RGB-D SLAM |
| L4 | Open3D | 0.18 | MIT | 点云 / TSDF / ICP / RANSAC |
| L4 | TEASER++ | 1.0 | MIT | 鲁棒全局配准 |
| L4 | OctoMap | 1.10 + python | BSD | 占据栅格 |
| L4 | nvblox | 0.0.6 (Isaac ROS) | Apache 2.0 | GPU TSDF(可选替代) |
| L4 | gsplat | 1.0 | Apache 2.0 | 3DGS 训练 |
| L4 | nerfstudio | 1.1 | Apache 2.0 | NeRF/3DGS 工具链 |
| L4 | trimesh | 4.4 | MIT | mesh I/O |
| L4 | pxr (USD) | 24.05 | Modified Apache | USDZ 读写 |
| L5 | OpenCLIP | 2.24 | MIT | CLIP ViT-B/32 |
| L5 | DINOv2 | 0.2 | Apache 2.0 | 视觉 fingerprint 重排 |
| L5 | Ultralytics (YOLO) | 8.3 + YOLO-Worldv2 | AGPL | 开放词表检测 |
| L5 | SAM 2 | 1.0 | Apache 2.0 | 实例分割 |
| L5 | Grounding-DINO | 1.5 (备选) | Apache 2.0 | 文本→bbox |
| L6 | PRISM Core | v0.1 (自研) | TBD | 本项目 |
| L7 | LangChain / LangGraph | 0.2 | MIT | Agent 编排 |
| L7 | OpenAI Python | 1.40 | Apache 2.0 | GPT-4o |
| L7 | Qwen-VL | 2.5-VL-7B | Apache 2.0 | 国产备选 VLM |
---
## 10.3 关键选型理由
### 10.3.1 为什么是 Open3D 而不是 PCL
- ✅ Python API 一等公民(PCL Python 绑定常年烂尾)
- ✅ 0.18 起 `VoxelBlockGrid` 提供 GPU TSDF,与 nvblox 性能接近
- ✅ ICP / RANSAC / FPFH 一体;与 `pyrender` / `trimesh` 互通好
- ❌ 大点云(> 1 亿点)仍不如 PCL+OpenMP——但 PRISM 单次只处理几百万点
### 10.3.2 为什么 ZED SDK 而不是 ORB-SLAM3
- ✅ 开箱即用:双目 + IMU + VIO + Spatial Mapping 一站式
- ✅ 工业级稳定(生产部署见多)
- ✅ Jetson 上有官方优化版
- ❌ 闭源 → **备选 ORB-SLAM3** 作开源退路
### 10.3.3 为什么 CLIP + DINOv2 双模型?
- CLIP:语义对齐强(文本-图像),用于 "找遥控器"
- DINOv2:纯视觉几何指纹强(同类房间区分),用于消歧重定位
- 二者**互补不替代**CLIP 召回,DINOv2 重排
### 10.3.4 为什么 YOLO-World 而不是 Grounding-DINO
- ✅ YOLO-World 在 Jetson Orin 上 2 Hz 实时
- ✅ 开放词表 + COCO 预训练,常见家具/小物覆盖率 > 90%
- ❌ Grounding-DINO 精度更高但 ~ 1 fps,留作离线评测 / 提案兜底
### 10.3.5 为什么 RoomPlan 而不是 Polycam
- ✅ Apple 官方、免费、有官方 USDZ + JSON 输出(含语义类别)
- ✅ 不依赖云服务,数据隐私可控
- ❌ 仅 iOS;非苹果用户用 Polycam(云端处理)作备选
### 10.3.6 为什么 Neo4j 而生产不用 JSON
- 原型期 JSON+NetworkX 足够,加载 < 1 s
- 当节点 > 10 k(多楼层场景)时 Cypher 查询比线性扫描快 10100×
- LLM 直接发 Cypher → 几乎零成本对接
---
## 10.4 计算平台对比
| 平台 | 价格 | 推理性能 | 适用 |
|------|------|----------|------|
| **Jetson Orin AGX 64 GB** | ¥18 k | YOLO-World 8 fps, CLIP 60 fps | ✅ **推荐机器人本体** |
| Jetson Orin AGX 32 GB | ¥14 k | 同上 | 内存吃紧(4 房间以内) |
| Jetson Orin NX 16 GB | ¥6 k | 减半 | 入门尝试 |
| RTX 4090 + i7 | ¥25 k | YOLO 50 fps, 3DGS 训练 | ✅ **推荐工作站** |
| MacBook Pro M3 Max | ¥26 k | MPS 后端,CLIP/CoreML 优秀 | ✅ 替代工作站 |
| 云 GPU (恒源云 4090) | ¥3 / hr | 同 RTX 4090 | 偶发训练 |
---
## 10.5 端到端依赖图(pip / apt 级)
```
Workstation Robot (Jetson Orin)
───────────── ─────────────────────
pip: pip:
pyzed ← ZED SDK 4.1 pyzed (jetson build)
open3d>=0.18 open3d (arm64 wheel)
ultralytics ultralytics-jetson
open_clip-torch open_clip-torch
nerfstudio (不需要训练,可跳过)
trimesh + pyrender (可跳过)
networkx + neo4j networkx
faiss-gpu faiss-cpu
octomap-python octomap-python (arm64)
scipy + numpy + opencv-contrib-python
rclpy (从 ROS 2 deb) rclpy
apt: apt:
ros-humble-desktop ros-humble-ros-base
ros-humble-tf2-tools ros-humble-tf2-ros
cuda-toolkit-12-2 JetPack 6.0 (含 CUDA)
libpcl-dev (备选) 同
```
---
## 10.6 推理优化(机器人端)
| 模型 | 原始 | 优化后 | 工具 |
|------|------|--------|------|
| CLIP ViT-B/32 | 80 ms / img | 25 ms | TensorRT FP16 |
| DINOv2-S | 60 ms | 18 ms | TensorRT FP16 |
| YOLO-World-x | 500 ms | 120 ms (2 Hz OK) | TensorRT INT8 |
| SAM 2 small | 600 ms | 200 ms | TensorRT FP16 |
| open3d ICP | CPU 80 ms | (无需,已快) | — |
部署:通过 `torch2trt` 或官方 `tensorrt-llm` 工具链导出 `.engine` 文件,PRISM 启动时加载。
---
## 10.7 仓库结构建议
```
prism/ # GitHub 仓库根
├── README.md
├── pyproject.toml # poetry / hatch
├── docker/
│ ├── workstation.Dockerfile
│ └── jetson.Dockerfile
├── spatial_memory/ # PRISM core 包(pip 可装)
│ ├── schema.py
│ ├── io_json.py
│ ├── io_usd.py
│ ├── parser_iphone.py
│ ├── align_to_map.py
│ ├── bake_octomap.py
│ ├── bake_tsdf.py
│ ├── relocalize_coarse.py
│ ├── relocalize_fine.py
│ ├── consolidation/
│ │ ├── filter.py
│ │ ├── arbiter.py
│ │ ├── apply.py
│ │ ├── refresh.py
│ │ └── commit.py
│ └── api.py # SpatialMemoryAPI
├── perception/ # 在线 worker
│ ├── frame_producer.py
│ ├── tsdf_worker.py
│ ├── detector_worker.py
│ ├── change_detector.py
│ └── delta_log.py
├── nodes/ # ROS 2 节点
│ ├── relocalizer_node.py
│ ├── frame_producer_node.py
│ ├── tsdf_worker_node.py
│ ├── detector_worker_node.py
│ └── consolidator_node.py
├── tools/ # CLI
│ ├── prism_ingest_iphone.py
│ ├── prism_consolidate.py
│ ├── prism_eval_reloc.py
│ ├── prism_viz.py
│ └── prism_test_e2e.py
├── ios/PRISMScanner/ # Swift App
├── launch/
│ ├── online.launch.yaml
│ └── consolidate.launch.yaml
├── configs/
│ ├── jetson_default.yaml
│ └── workstation_default.yaml
├── tests/
└── docs/ # 本目录就是 docs/PRISM/
```
---
## 10.8 配置文件示例
```yaml
# configs/jetson_default.yaml
hardware:
camera: zed2i
resolution: HD720
fps: 30
imu_rate: 400
depth_mode: QUALITY
max_depth: 5.0
perception:
frame_producer:
keyframe_interval_s: 0.5
buffer_seconds: 10
tsdf:
voxel_size: 0.02
block_count: 10000
rate_hz: 5.0
max_dist_m: 5.0
detector:
model: yolo-worldv2-x-trt-int8
classes: auto # 从 LTM 自动读取
rate_hz: 2.0
conf: 0.3
change_detector:
rate_hz: 1.0
diff_threshold_m: 0.05
cluster_eps: 0.15
cluster_min: 20
relocalize:
coarse:
model: clip-vit-b-32-trt-fp16
top_k: 3
voting_window: 5
fine:
voxel: 0.05
ransac_iters: 100000
icp_threshold: 0.025
accept_fitness: 0.85
fallback_fitness: 0.70
online:
drift_trigger_m: 0.5
health_check_period_s: 300
consolidation:
mode: full
trigger_idle_min: 10
promotion:
object_moved: {min_obs: 5, min_span_s: 300, min_views: 2}
object_removed: {min_obs: 10, min_span_s: 600, min_views: 3}
object_added: {min_obs: 8, min_span_s: 300, min_views: 2}
storage:
ltm_dir: /robot_memory/ltm
stm_dir: /robot_memory/stm
delta_dir: /robot_memory/delta
snapshot_dir: /robot_memory/snapshots
scene_graph_db: json # 切换到 'neo4j' 即生产模式
agent:
vlm: gpt-4o # 或 qwen2.5-vl-7b-trt
prompt_template: default
```
---
## 10.9 Docker 部署
### Workstation 镜像(训练 / ingest
```dockerfile
# docker/workstation.Dockerfile
FROM nvidia/cuda:12.2.0-cudnn8-devel-ubuntu22.04
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
python3.10 python3-pip python3-venv \
git wget curl build-essential cmake \
libgl1 libegl1 ffmpeg \
&& rm -rf /var/lib/apt/lists/*
# ROS 2 Humble (略)
COPY pyproject.toml /workspace/
WORKDIR /workspace
RUN pip install --no-cache-dir -e .
RUN pip install pyzed open3d ultralytics open_clip_torch nerfstudio \
trimesh pyrender networkx faiss-gpu octomap-python
CMD ["bash"]
```
### Jetson 镜像(运行时)
基于 `nvcr.io/nvidia/l4t-jetpack:r36.3.0`,替换 `pyzed-jetson` `open3d-arm64` 等 wheel。
启动:
```bash
docker run --runtime nvidia --network host \
-v /robot_memory:/robot_memory \
-v /dev:/dev --privileged \
prism:jetson-v0.1 ros2 launch prism online.launch.yaml
```
---
## 10.10 兼容性矩阵
| 软件 A | 软件 B | 已知问题 / 注意事项 |
|--------|--------|--------------------|
| Open3D 0.18 | PyTorch 2.3 + CUDA 12 | 必须用 Open3D 自带 CUDA wheel,与 torch 共存正常 |
| ZED SDK 4.1 | Ubuntu 24 | 不官方支持,坚持 22.04 |
| YOLO-World | TensorRT 10 | 需关闭 dynamic shape;导出脚本见 ultralytics docs |
| nvblox | Open3D TSDF | 不能同时启用:选其一作为 L2 |
| Neo4j | ROS 2 | 默认 7687 端口,与 ROS 无冲突 |
| RoomPlan | iOS 17.5 | 17.4 之前 polygon 字段缺失,必须升 |
---
## 10.11 国产替代方案
| 国外 | 国产替代 | 兼容度 |
|------|----------|--------|
| ZED 2i | Intel RealSense D455i / 奥比中光 Gemini 2 | 接口不同,需自写 driver |
| Jetson Orin | 地平线 RDK X5 / 华为 Atlas 200I | TensorRT → MindSpore/ Bayes |
| GPT-4o | Qwen2.5-VL-7B / GLM-4V | API 调用兼容(OpenAI SDK 可指 base_url |
| Neo4j | Nebula Graph / TuGraph | Cypher 方言基本一致 |
| OpenAI 嵌入 | BGE-M3 / Conan-embedding | 替换 CLIP text encoder |
---
## 10.12 安全 / License 合规清单
| 风险 | 项 | 处理 |
|------|----|------|
| AGPL 传染 | YOLO (Ultralytics AGPLv3) | 如商用:购买商业 license 或换 PaddleDetection |
| 闭源 | ZED SDK | 可商用但需注意分发限制 |
| Apple 限制 | RoomPlan 仅 iOS | 接受 / 用 Polycam 替代 |
| OpenAI 数据 | GPT-4o 上传 RGB | 切换到本地 Qwen-VL |
| 用户隐私 | 客人入镜 | 6.5.x 已实现 person 过滤 |
| 数据出境 | 国产场景 | 全本地化部署(无云依赖) |
---
## 10.13 本章小结
| 关键决策 | 一句话 |
|----------|--------|
| **VIO** | ZED SDK 自带(备选 ORB-SLAM3 |
| **重定位** | CLIP + DINOv2 + TEASER++/ICP |
| **检测** | YOLO-World(备选 Grounding-DINO |
| **TSDF** | Open3D VoxelBlockGrid(备选 nvblox |
| **3DGS** | gsplat + nerfstudio |
| **图库** | 原型 JSON+NetworkX,生产 Neo4j |
| **中间件** | ROS 2 Humble |
| **机器人端推理** | TensorRT FP16/INT8 |
| **国产替代** | 全栈可换,方案不锁死 |
读完本章你应能:
- ✅ 一次性把所有依赖装好
- ✅ 在 license / 国产化等约束下做替换决策
- ✅ 起一个干净的仓库骨架
下一章 [`11_world_model_bridge.md`](11_world_model_bridge.md) 讲 PRISM 如何与 M-JEPA / DreamerV3 等世界模型对接,把"空间记忆"升级为"可想象的世界"。
---
**章节版本**v1.0
**估计阅读时间**12 分钟
**关键收获**:拿到完整的版本号、依赖、镜像与仓库结构