14 KiB
14 KiB
title, date, draft, tags, categories
| title | date | draft | tags | categories | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|
| Chapter 10 — 技术栈选型 | 2026-05-20 | false |
|
|
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 分钟 关键收获:拿到完整的版本号、依赖、镜像与仓库结构