# Chapter 10 — 技术栈选型 > 本章目标:把前面章节涉及的所有"软件 / 算法 / 模型"按层级列出,给出**版本号、依赖关系、为什么选它**,让团队拿到这章就能搭出可复现的环境。 --- ## 10.1 整体层级图 ```mermaid flowchart TB L7["Layer 7 — Agent / Application
GPT-4o · Qwen2.5-VL · LangGraph · ROS 2 Action Servers"] L6["Layer 6 — PRISM Core(本项目自研)
spatial_memory.* · relocalizer · workers · consolidator"] L5["Layer 5 — Perception Models
CLIP · DINOv2 · YOLO-World · SAM 2 · Grounding-DINO"] L4["Layer 4 — Geometry & Mapping
Open3D · TEASER++ · gsplat · nerfstudio · OctoMap · nvblox"] L3["Layer 3 — SLAM / VIO / Sensor Drivers
ZED SDK · RoomPlan · ARKit · ORB-SLAM3(备) · rtabmap(备)"] L2["Layer 2 — Middleware
ROS 2 Humble · tf2 · message_filters · rclpy / rclcpp"] L1["Layer 1 — Storage / Database
JSON · HDF5 · Faiss · Neo4j · SQLite (catalog)"] L0["Layer 0 — System
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 配置文件示例 ```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 分钟 **关键收获**:拿到完整的版本号、依赖、镜像与仓库结构