385 lines
14 KiB
Markdown
385 lines
14 KiB
Markdown
# 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 查询比线性扫描快 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 分钟
|
||
**关键收获**:拿到完整的版本号、依赖、镜像与仓库结构
|