Files
gaojie 0b12ff023c
Sync to site1 / sync (push) Has been cancelled
chore: update PRISM categories from worldmodel to PRISM
2026-05-21 02:25:22 +08:00

14 KiB
Raw Permalink Blame History

title, date, draft, tags, categories
title date draft tags categories
Chapter 10 — 技术栈选型 2026-05-20 false
PRISM
世界模型
空间记忆
SLAM
VIO
点云
PRISM

Chapter 10 — 技术栈选型

本章目标:把前面章节涉及的所有"软件 / 算法 / 模型"按层级列出,给出版本号、依赖关系、为什么选它,让团队拿到这章就能搭出可复现的环境。


10.1 整体层级图

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 查询比线性扫描快 10–100×
  • 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 配置文件示例

# 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

# 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。

启动:

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 讲 PRISM 如何与 M-JEPA / DreamerV3 等世界模型对接,把"空间记忆"升级为"可想象的世界"。


章节版本v1.0 估计阅读时间12 分钟 关键收获:拿到完整的版本号、依赖、镜像与仓库结构