Files
worldmodel/plans/game_engine_simulation_plan.md
T

591 lines
22 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: "结合 3D 游戏引擎的室内世界模型验证方案"
date: 2026-05-31
draft: false
tags: ["规划", "3D游戏引擎", "仿真", "数字孪生", "物理", "机器人"]
categories: ["GameEngine"]
---
# 结合 3D 游戏引擎的室内世界模型验证方案
## 1. 方案定位
本方案在现有 **RoomPlan / ZED 2i / PRISM / 世界模型** 技术链路之外,引入 3D 游戏引擎作为一个新的工程层:
> **3D 游戏引擎不是替代 SLAM、PRISM 或 Isaac Sim,而是作为“可交互数字孪生运行时”:负责实时渲染、交互编辑、轻量物理验证、合成数据生成、多人演示与人工标注。**
它解决现有方案中的三个缺口:
1. **可视化缺口**:研究系统输出的 mesh、3DGS、场景图、语义层需要一个直观、可交互、可调试的前台。
2. **交互缺口**:机器人任务不仅要离线评测,还要让研究员快速拖拽物体、修改材质、设置碰撞体、回放动作。
3. **数据缺口**:真实酒店采集成本高,游戏引擎可生成可控扰动、光照变化、遮挡、人流和任务变体。
---
## 2. 总体架构
```mermaid
flowchart TB
subgraph CAPTURE["真实世界采集"]
IPHONE["iPhone RoomPlan<br/>USDZ / JSON / CAD"]
ZED["ZED 2i<br/>RGB-D / VIO / 点云"]
end
subgraph MEMORY["空间记忆与世界模型"]
PRISM["PRISM<br/>L1-L4 空间记忆"]
WM["World Model<br/>M-JEPA / DreamerV3 / Video WM"]
end
subgraph ASSET["资产转换层"]
CLEAN["Mesh 清洗<br/>尺度/坐标/法线/拓扑"]
SEM["语义绑定<br/>object_id / affordance / material"]
USD["USD / glTF / FBX<br/>统一资产包"]
end
subgraph ENGINE["3D 游戏引擎运行时"]
VIEW["实时可视化<br/>PBR / 灯光 / UI"]
PHYS["轻量物理沙盒<br/>碰撞 / 约束 / 关节"]
SYN["合成数据<br/>RGB / Depth / Seg / Flow"]
EDIT["交互编辑<br/>拖拽 / 标注 / Remix"]
end
subgraph ROBOT["机器人与评测"]
ROS["ROS 2 Bridge"]
TASK["任务脚本<br/>导航 / 抓取 / 推拉"]
EVAL["评测指标<br/>成功率 / 偏差 / 鲁棒性"]
end
IPHONE --> CLEAN
ZED --> CLEAN
CLEAN --> SEM --> USD --> ENGINE
PRISM --> SEM
ENGINE --> ROS --> TASK --> EVAL
ENGINE --> SYN --> WM
WM --> PRISM
PRISM --> ENGINE
```
---
## 3. 引擎选型建议
| 引擎 | 适合角色 | 优点 | 局限 | 建议定位 |
|------|----------|------|------|----------|
| **Unreal Engine** | 高保真酒店数字孪生、演示、复杂交互 | 渲染质量强,Chaos Physics 支持刚体、约束、破坏、流体等实时物理能力 | 机器人生态需要自建桥接,工程复杂度高 | **主推荐:视觉与交互前台** |
| **Unity** | 快速原型、Web/移动端、CrowdRoom 编辑器 | C# 开发快,生态适合工具型产品,Unity Robotics 有 ROS TCP Connector | 官方 ROS TCP Connector 最近主版本较旧,长期维护风险需评估 | **推荐:MVP 和产品化编辑器** |
| **Godot** | 开源轻量工具、内部标注器 | 开源、轻量、部署灵活 | 高保真渲染、机器人仿真生态弱 | **可选:低成本标注/浏览工具** |
| **NVIDIA Isaac Sim** | 机器人精确仿真、传感器、合成数据 | 基于 OpenUSD,面向机器人仿真、测试与合成数据,天然适合 URDF/CAD/USD 资产链路 | 不适合作为普通用户产品前台,学习和硬件成本较高 | **保留:严肃机器人仿真后端** |
推荐采用“双引擎分工”:
- **Unreal / Unity**:面向人类研究员和产品用户的交互前台。
- **Isaac Sim**:面向机器人控制、传感器仿真、强化学习和 sim-to-real 的高可信仿真后端。
---
## 4. 核心管线
### 4.1 真实扫描到游戏场景
```text
iPhone RoomPlan / ZED 2i
→ 坐标系统一:米制、Z-up/Y-up 转换、世界原点锚定
→ Mesh 清洗:去噪、补洞、简化、法线修复
→ 语义绑定:room_id、object_id、category、bbox、affordance
→ 碰撞体生成:墙体 box collider、家具 convex hull、可操作物体 articulated body
→ 材质重建:PBR baseColor / roughness / metallic / normal
→ 导出:USD 为主,glTF/FBX 为 Web 和通用引擎备选
```
关键原则:
- **视觉资产和物理资产分离**:高精 mesh 用于渲染,低复杂度 collider 用于物理。
- **PRISM ID 贯穿全链路**:游戏引擎中的每个物体都保留 `spatial_node_id`,方便回写空间记忆。
- **可编辑但可追溯**:人工在引擎中修正的材质、碰撞体、关节参数,要以 patch 形式回写,而不是覆盖原始扫描。
### 4.2 游戏引擎到 PRISM
游戏引擎不是只读 viewer,而是 PRISM 的交互标注和实验入口:
| 引擎事件 | 回写到 PRISM |
|----------|--------------|
| 研究员拖动椅子 | `delta/object_pose_changed` |
| 修正门的旋转轴 | L4 节点 `joint.axis` / `joint.limit` |
| 标注“可抓取”区域 | `affordance.graspable_regions` |
| 设置碰撞体 | L2/L4 物理代理属性 |
| 回放机器人失败轨迹 | episode memory + anomaly |
### 4.3 游戏引擎到世界模型
游戏引擎可生成有控制变量的训练数据:
| 数据类型 | 用途 |
|----------|------|
| RGB / Depth / Normal | 训练感知 encoder |
| Instance Segmentation | 训练 2D/3D 语义分割 |
| Optical Flow | 训练动态预测 |
| Action-State Pair | 训练 DreamerV3 / TD-MPC2 |
| Counterfactual Rollout | 训练“如果推椅子会怎样”类预测 |
---
## 5. 可交互数字孪生运行时详细方案
本节把“可交互数字孪生运行时”具体化为一个可开发的软件系统。它不是简单的 3D Viewer,而是一个面向研究员、机器人算法工程师和数据标注人员的 **Scene Lab**:能看、能查、能改、能模拟、能回放、能把修改写回 PRISM。
### 5.1 产品形态
建议先做桌面端,再做 Web 端:
| 形态 | 技术路线 | 目标用户 | 适合阶段 |
|------|----------|----------|----------|
| **桌面 Scene Lab** | Unity Editor Runtime / Unreal Editor Utility | 研究员、算法工程师 | P0 MVP |
| **Web Viewer** | Three.js/R3F 或 Unity WebGL | PM、合作酒店、标注人员 | P1 展示与轻编辑 |
| **Pixel Streaming 高保真版** | Unreal Pixel Streaming | 远程演示、客户评审 | P1/P2 |
P0 阶段推荐做 **Unity 桌面 Scene Lab**,原因是迭代快、UI 工具多、和 JSON/glTF/ROS 接口打通成本低。Unreal 分支用于高保真展示,不阻塞 MVP。
### 5.2 主界面布局
```text
┌──────────────────────────────────────────────────────────────┐
│ Top Bar: 场景选择 | 模式切换 | 保存 Patch | 运行任务 | 导出数据 │
├───────────────┬──────────────────────────────┬───────────────┤
│ Scene Tree │ │ Inspector │
│ - room_305 │ 3D Viewport │ object_id │
│ - wall_01 │ 轨道相机 / 第一人称 / 机器人视角 │ pose/bbox │
│ - bed_01 │ 语义高亮 / 热力图 / 轨迹回放 │ material │
│ - chair_01 │ │ physics │
├───────────────┴──────────────────────────────┴───────────────┤
│ Timeline / Logs: episode 回放 | 事件列表 | PRISM delta diff │
└──────────────────────────────────────────────────────────────┘
```
核心交互模式:
| 模式 | 快捷操作 | 用途 |
|------|----------|------|
| `Explore` | orbit / fly / first-person | 浏览房间、走廊、大堂 |
| `Inspect` | click object | 查看 PRISM 节点、语义、bbox、来源帧 |
| `Edit` | translate / rotate / scale | 修正物体位姿、墙体边界、家具尺寸 |
| `Physics` | add collider / set joint / simulate | 设置碰撞体、质量、摩擦、门/抽屉关节 |
| `Annotate` | paint / box / polygon | 标注可抓取区域、不可通行区、危险区 |
| `Replay` | play / pause / scrub | 回放机器人轨迹和失败 episode |
| `Generate` | randomize / capture | 生成合成 RGB-D、分割、扰动样本 |
### 5.3 模块拆分
```mermaid
flowchart LR
LOAD["Scene Loader<br/>USD/glTF/JSON"]
REG["Registry<br/>object_id ↔ actor"]
VIEW["Viewport<br/>render layers"]
SEL["Selection<br/>raycast/pick"]
EDIT["Edit Tools<br/>transform/material/collider"]
PHYS["Physics Sandbox<br/>simulate/reset"]
PATCH["Patch Recorder<br/>diff/event log"]
BRIDGE["PRISM Bridge<br/>load/save/query"]
EXPORT["Export<br/>dataset/episode"]
LOAD --> REG --> VIEW
VIEW --> SEL --> EDIT --> PATCH
EDIT --> PHYS --> PATCH
PATCH --> BRIDGE
VIEW --> EXPORT
PHYS --> EXPORT
```
| 模块 | 职责 | P0 要做到 |
|------|------|-----------|
| Scene Loader | 加载 `scene.glb/usd``scene_graph.json`、材质贴图 | 一个客房可稳定加载 |
| Object Registry | 建立 `spatial_node_id` 到引擎 actor 的映射 | 点击物体能查 PRISM ID |
| Viewport | 多视角浏览、图层开关、语义上色 | 支持 RGB / semantic / collider 三种视图 |
| Inspector | 展示和编辑节点属性 | 可改类别、名称、位姿、物理参数 |
| Edit Tools | 拖拽、旋转、缩放、吸附、撤销 | 支持家具位姿修正 |
| Physics Sandbox | 局部物理仿真与 reset | 支持椅子推动、门旋转、抽屉滑动 |
| Patch Recorder | 记录所有人工修改 | 导出 JSON Patch |
| PRISM Bridge | 读取/写回 PRISM 数据 | 文件级 API 即可,不要求实时服务 |
| Dataset Exporter | 截图、深度、分割、episode log | 导出一组训练样本 |
### 5.4 数据输入与目录结构
每个场景打包为一个可版本化目录:
```text
hotel_305_scene/
manifest.json
assets/
room_shell.glb
furniture.glb
textures/
prism/
scene_graph.json
spatial_nodes.json
spatial_edges.json
physics/
colliders.json
joints.json
materials.json
episodes/
nav_fail_001.json
patches/
2026-05-31_manual_fix.json
```
`manifest.json` 作为运行时入口:
```json
{
"scene_id": "hotel_305",
"unit": "meter",
"up_axis": "Y",
"origin": "room_center",
"render_assets": ["assets/room_shell.glb", "assets/furniture.glb"],
"prism_graph": "prism/scene_graph.json",
"physics": {
"colliders": "physics/colliders.json",
"joints": "physics/joints.json",
"materials": "physics/materials.json"
}
}
```
### 5.5 实时可视化能力
运行时至少提供 6 个可切换视图:
| 视图 | 显示内容 | 用途 |
|------|----------|------|
| `Render View` | PBR 材质、灯光、阴影 | 检查视觉真实感 |
| `Semantic View` | 不同类别用不同颜色 | 检查语义分割和类别错误 |
| `Instance View` | 每个实例独立颜色 | 检查实例切分 |
| `Physics View` | collider、joint、mass center | 检查物理代理 |
| `Navigation View` | 可通行区域、障碍物、路径 | 调试机器人导航 |
| `Memory View` | PRISM L1-L4 图层 | 看空间记忆如何覆盖场景 |
关键 UI 功能:
- 点击任意物体,高亮对应 `SpatialNode`,并显示来源:RoomPlan / ZED / 人工修正 / WM 推断。
- 支持按类别过滤:只看门、床、桌椅、可移动物、可抓取物、动态障碍。
- 支持显示不确定性:低置信度物体用闪烁边框或热力图提示。
- 支持对比模式:`真实扫描` vs `人工修正后` vs `世界模型预测后`
### 5.6 交互编辑能力
编辑不是自由建模,而是围绕 PRISM/机器人验证需要设计的受控编辑。
| 编辑对象 | 可编辑字段 | 保存位置 |
|----------|------------|----------|
| 房间结构 | 墙体位置、高度、门洞、窗洞 | `patches/*.json` + PRISM L2 |
| 家具 | 位姿、尺寸、类别、是否可移动 | PRISM L4 `SpatialNode` |
| 材质 | roughness、metallic、friction 映射 | `physics/materials.json` |
| 碰撞体 | box/capsule/convex mesh | `physics/colliders.json` |
| 关节 | revolute/prismatic、轴向、范围 | `physics/joints.json` |
| 导航区域 | walkable、blocked、slow zone | PRISM L2/L3 |
| 可供性 | graspable、pushable、openable | PRISM L4 |
编辑操作必须满足三条规则:
1. **所有修改都是 patch**:保留原始扫描结果,不直接覆盖。
2. **每个 patch 有来源**:记录 `author``timestamp``tool``reason`
3. **可回放和可撤销**patch 可以按顺序 apply,也可以 rollback。
示例 patch
```json
{
"patch_id": "manual_fix_20260531_001",
"scene_id": "hotel_305",
"author": "researcher",
"ops": [
{
"op": "replace",
"path": "/nodes/chair_305_01/pose_world",
"value": [1.42, 0.0, -0.33, 0.0, 0.707, 0.0, 0.707],
"reason": "RoomPlan 椅子朝向错误"
},
{
"op": "add",
"path": "/nodes/drawer_305_02/joint",
"value": {
"type": "prismatic",
"axis": [1, 0, 0],
"limit_m": [0.0, 0.42]
},
"reason": "为床头柜抽屉补充可操作关节"
}
]
}
```
### 5.7 轻量物理沙盒
游戏引擎中的物理层只负责快速验证和交互调试,不作为最终物理真值。
P0 支持:
- 刚体:椅子、行李箱、垃圾桶、床头柜小物体。
- 静态碰撞体:墙、地面、床、柜体、卫生间台面。
- 关节:门的旋转关节、抽屉的滑动关节。
- 材质参数:摩擦、弹性、质量、重心。
- 局部 reset:只重置当前物体或当前房间,不重载全场景。
P1 再支持:
- 布料近似:床单、窗帘只做视觉和碰撞近似。
- 液体/破碎效果:只做异常事件可视化,不进入机器人控制闭环。
- 多人/多机器人:用于拥堵和动态障碍测试。
### 5.8 与 PRISM 的读写接口
P0 不需要数据库服务,直接文件接口即可:
```text
load_scene(manifest.json)
→ load_assets()
→ load_prism_graph()
→ bind_actor_to_spatial_node()
edit_object()
→ update_runtime_actor()
→ append_patch_op()
save_patch()
→ validate_patch()
→ write patches/*.json
→ optional: export prism_delta.json
```
P1 可以升级为本地 HTTP 服务:
| API | 方法 | 用途 |
|-----|------|------|
| `/scene/:id` | GET | 获取场景 manifest |
| `/scene/:id/nodes` | GET | 获取 PRISM 节点 |
| `/scene/:id/patches` | POST | 保存人工修正 |
| `/scene/:id/query` | POST | 自然语言或类别查询 |
| `/scene/:id/episodes` | POST | 上传任务回放 |
### 5.9 MVP 功能清单
P0 版本只追求一个客房跑通:
| 优先级 | 功能 | 验收标准 |
|--------|------|----------|
| P0 | 加载一个 RoomPlan/ZED 转换后的客房 | 10 秒内打开,尺度正确 |
| P0 | Scene Tree + 物体点击选择 | 点击椅子能显示 `chair_305_01` |
| P0 | 语义/实例/物理三种视图 | 一键切换,颜色稳定 |
| P0 | 家具位姿修正 | 拖动椅子后能保存 patch |
| P0 | Collider 可视化与编辑 | 可给椅子生成 box/convex collider |
| P0 | 门/抽屉关节编辑 | 可设置轴向和运动范围 |
| P0 | 简单物理运行/暂停/reset | 推椅子不穿墙,reset 后回初始状态 |
| P0 | episode 回放 | 加载一条机器人轨迹并显示路径 |
| P0 | patch 导出 | 输出可被 PRISM 消化的 JSON |
P1 再做增强:
- 多房间/走廊拼接;
- Web 只读展示;
- 合成 RGB-D/Segmentation 数据批量导出;
- 自然语言查询:“显示所有可移动椅子”;
- 和 ROS 2/Nav2 做在线联调。
---
## 6. 典型应用场景
### 场景 A:酒店机器人导航调试
1. PRISM 导出酒店走廊拓扑和局部几何。
2. 游戏引擎加载场景,放置机器人 avatar 和动态行人。
3. 通过 ROS 2 bridge 接入 Nav2 或自研控制器。
4. 在引擎里批量生成拥堵、清洁车占道、门半开等扰动。
5. 输出成功率、碰撞次数、路径偏差和重规划次数。
### 场景 B:客房物体操作验证
1. RoomPlan/ZED 重建客房,PRISM 生成语义场景图。
2. 游戏引擎把床头柜、椅子、抽屉、门转成可交互 actor。
3. 研究员人工修正关节轴、摩擦、质量和可抓取区域。
4. 世界模型在引擎中做 rollout,预测推、拉、拿、放的结果。
5. 高风险动作再交给 Isaac Sim 或真实机器人验证。
### 场景 CCrowdRoom Web 编辑器
1. 用户上传 RoomPlan 房间。
2. 后端转成 glTF/meshopt/Draco 轻量包。
3. Web 端以 Unity WebGL、Unreal Pixel Streaming 或 Three.js/R3F 展示。
4. 用户替换家具、材质、灯光,生成 Remix。
5. Remix 的变更以 overlay 形式保存,不复制底层几何。
---
## 7. 技术实现建议
### 7.1 Unreal 路线
适合做“酒店数字孪生高保真演示 + 复杂交互调试器”。
```yaml
引擎:
- Unreal Engine 5.x
核心模块:
- USD Stage / Datasmith / glTF Importer
- Chaos Physics
- Control Rig / Sequencer
- Pixel Streaming
- Python Editor Script
输入:
- USD: 主资产格式
- glTF/FBX: 轻量备选
- JSON: PRISM 场景图和语义属性
输出:
- episode log
- RGB-D/Segmentation 合成数据
- PRISM patch
```
适合优先验证:
- 高保真酒店大堂/走廊渲染;
- 门、抽屉、椅子、行李车等刚体交互;
- 研究演示和远程评审;
- 复杂光照、反射、材质对感知模型的影响。
### 7.2 Unity 路线
适合做“MVP 工具 + CrowdRoom 产品化编辑器 + 快速 ROS 原型”。
```yaml
引擎:
- Unity LTS
核心模块:
- URP/HDRP
- Addressables
- ArticulationBody
- ROS TCP Connector
- WebGL / iOS / Desktop Build
输入:
- glTF/FBX/USD 转换资产
- PRISM JSON scene graph
输出:
- 用户编辑 overlay
- 标注 patch
- 简化 episode log
```
适合优先验证:
- RoomPlan 房间浏览器;
- 家具/材质替换;
- 简单移动机器人导航;
- 低门槛标注工具。
### 7.3 Isaac Sim 路线
适合做“机器人高可信仿真后端”,与游戏引擎形成互补。
```yaml
核心定位:
- 机器人传感器仿真
- URDF/USD 机器人资产
- 合成数据生成
- Isaac Lab / RL 训练
- ROS 2 联调
输入:
- USD 场景
- URDF / CAD 机器人
- PRISM 语义图
输出:
- 机器人任务评测
- 合成传感器数据
- sim-to-real 实验记录
```
---
## 8. 数据格式扩展
建议在 PRISM `SpatialNode` 上增加一个可选的 `engine_proxy` 字段:
```json
{
"spatial_node_id": "chair_305_01",
"category": "chair",
"pose_world": [0, 0, 0, 1, 0, 0, 0],
"bbox": [0.55, 0.58, 0.92],
"material": {
"base": "fabric",
"roughness": 0.75
},
"affordance": {
"movable": true,
"sittable": true,
"pushable": true
},
"engine_proxy": {
"asset_uri": "assets/hotel_305/chair_305_01.usd",
"render_mesh": "chair_305_01_high",
"collision_mesh": "chair_305_01_convex",
"rigid_body": {
"mass_kg": 6.2,
"friction": 0.6,
"restitution": 0.05
},
"lod": ["high", "mid", "low"]
}
}
```
---
## 9. MVP 计划:4 周验证闭环
| 周期 | 目标 | 交付物 | 验收标准 |
|------|------|--------|----------|
| W1 | 资产链路打通 | RoomPlan/ZED 场景 → glTF/USD → Unity 或 Unreal | 尺度误差 < 2%,坐标轴正确 |
| W2 | PRISM 语义绑定 | 场景图 JSON 驱动物体高亮、查询、筛选 | 输入“床头柜”可定位对应 actor |
| W3 | 物理代理 | 为门、椅子、抽屉生成 collider/rigid body/joint | 推拉动作无明显穿模 |
| W4 | 任务回放 | 机器人轨迹回放 + episode log + PRISM patch | 可复现一次失败案例并回写 delta |
MVP 只做一个客房或一段走廊,不追求完整酒店。优先证明“真实扫描资产能进入游戏引擎,并与 PRISM 双向通信”。
---
## 10. 风险与对策
| 风险 | 表现 | 对策 |
|------|------|------|
| 扫描 mesh 不适合物理 | 面数过高、破洞、碰撞异常 | 渲染 mesh 与 collider 分离;自动 convex decomposition;人工修正工具 |
| 坐标系统混乱 | RoomPlan、ROS、Unreal、Unity 轴向不一致 | 定义 `world_frame.md`,所有转换写单元测试 |
| 游戏物理不够真实 | 摩擦、接触、关节误差导致 sim-to-real 差 | 游戏引擎只做快速筛选;关键实验进入 Isaac Sim 或真实机器人 |
| 资产管线过重 | USD/glTF/FBX 来回转换丢属性 | USD 作为主格式,glTF 只做 Web 分发 |
| 双引擎维护成本高 | Unreal、Unity、Isaac Sim 三套工程发散 | MVP 先选一个主前台;共享资产转换脚本和 PRISM schema |
---
## 11. 推荐决策
短期采用:
1. **Unity 优先做 MVP**:快速做出 RoomPlan 房间浏览、语义高亮、家具替换、简单物理交互。
2. **Unreal 做高保真展示分支**:用于酒店场景演示、复杂光照材质、远程评审。
3. **Isaac Sim 保持机器人仿真后端**:用于 ROS 2、传感器、RL 和严肃物理评测。
中期目标是形成一条统一管线:
```text
真实扫描 → PRISM 空间记忆 → USD/glTF 资产包 → 游戏引擎交互验证 → episode/patch 回写 → 世界模型训练
```
这样 WorldModel 项目会多出一个非常实用的“中间地带”:既不像纯研究代码那样难演示,也不像纯游戏场景那样脱离真实数据,而是把真实室内世界变成可运行、可编辑、可评测的 3D 交互实验场。
---
## 参考资料
- NVIDIA Isaac Sim 官方介绍:说明 Isaac Sim 基于 Omniverse/OpenUSD,面向机器人仿真、测试、合成数据,并可导入 CAD、URDF 和真实捕获数据。<https://developer.nvidia.com/isaac/sim>
- Unreal Engine Physics 官方文档:Chaos Physics 覆盖刚体、约束、破坏、车辆、流体、网络物理等实时物理能力。<https://dev.epicgames.com/documentation/en-us/unreal-engine/physics-in-unreal-engine>
- Unreal Engine USD Stage 官方文档:Unreal 支持通过 USD Stage Actor 打开和编辑 USD 场景。<https://dev.epicgames.com/documentation/en-us/unreal-engine/usd-stage-editor-quick-start-in-unreal-engine>
- Unity ROS TCP Connector 官方仓库:提供 Unity 与 ROS 收发消息、消息生成、ROSGeometry 等能力。<https://github.com/Unity-Technologies/ROS-TCP-Connector>