这次我们来看一个比较有意思的方向:把 AI 机器人的工作过程,放到一个可视化小岛里面来观察。简单说,就是做一个虚拟小岛场景,让多台 AI 机器人在岛上执行搬运、巡检、协作任务,同时把这个过程以 3D 场景和大屏数据看板的方式实时呈现出来。
这个项目的核心价值,不在于某个算法有多复杂,而在于它把 AI 机器人的任务调度、路径规划、状态变化这些“看不见的过程”变成了“看得见的东西”。如果你正在做机器人调度系统、算法验证平台,或者想找一个既能展示技术、又能跑通全流程的仿真可视化项目,这篇内容可以直接收藏。
从技术角度看,这个项目覆盖了几个关键点:三维场景构建、机器人运动仿真、多机任务调度、状态数据实时推送、可视化大屏联动。它还天然适合扩展到批量任务、接口 API、路径规划算法对比等方向。下面我会从架构设计开始,逐步拆解:如何搭建小岛场景、如何让 AI 机器人在岛上运行、如何把状态数据推送到 Web 端、如何用大屏展示整体运行情况、怎么做接口和批量任务,以及常见问题的排查方法。
1. 核心能力速览
先给一张速览表,方便你判断这个项目方向适不适合自己。
| 能力项 | 说明 |
|---|---|
| 项目定位 | 面向 AI 机器人工作过程的三维可视化仿真与调度展示系统 |
| 可视化内容 | 机器人位置、运动轨迹、任务状态、工作流进度、区域热力、运行数据大屏 |
| 机器人类型 | 搬运机器人、巡检机器人、协作机械臂、AGV/AMR 等,可按需扩展 |
| 核心功能 | 任务下发、路径规划展示、多机调度、状态实时推送、批量任务、API 接口 |
| 建议技术栈 | Unity 3D 或 Three.js 做三维场景,Python/FastAPI 或 Node.js 做调度服务,WebSocket 做实时通信,ECharts 做大屏图表 |
| 硬件门槛 | 最低配置与模型规模和场景复杂度强相关;本地开发建议独立显卡,纯前端小场景可使用集成显卡测试 |
| 显存占用 | 不确定,需按实际场景规模和渲染方案测试;Three.js 网页方案通常远低于本机大型 Unity 工程 |
| 启动方式 | 命令启动 Web 服务 / 编辑器内 Play 启动 / Docker 启动 |
| 是否支持 API | 支持,调度服务可暴露 REST 和 WebSocket 接口 |
| 是否支持批量任务 | 支持,可通过 JSON/CSV 批量导入任务并观察队列执行 |
| 适合场景 | 机器人调度算法演示、仿真验证、实验室看板、教学演示、技术展示 |
这里多说一句:不要把这个方向理解成“做一个 3D 游戏”。它的重点是机器人运行状态的可观测性,3D 场景只是呈现方式,真正决定项目价值的是背后的任务调度、路径规划和数据联动逻辑。
2. 适用场景与使用边界
2.1 适合谁用
这个可视化小岛方案,适合以下几类人群:
- 机器人算法工程师:想直观看到多机器人路径规划、避障逻辑和任务分配效果,而不是只看日志输出。
- 仿真验证与测试人员:需要在虚拟环境中验证调度算法,批量注入任务,观察长时间运行的稳定性。
- 实验室或课题组:需要一块大屏展示机器人集群工作状态,用于汇报、演示、教学。
- 工业现场二次开发团队:做 AGV、AMR、协作机械臂的项目,需要一个不依赖真实硬件的调试和展示环境。
- 前端可视化开发工程师:想学习如何把 Three.js、WebSocket、ECharts 组合成一个完整的实时可视化业务系统。
2.2 能解决什么问题
- 机器人真实运行前,先在虚拟小岛上跑一遍任务流程,提前发现调度冲突、路径死锁、任务堆积问题。
- 把 AI 机器人的决策过程可视化,方便向非技术角色解释系统逻辑。
- 为多机器人调度算法提供可视化数据接口,便于对比不同策略。
- 形成一套可复用的实时数据链路,后续接入真实机器人时只需要替换数据源。
2.3 不适合什么场景
- 不适合在没有传感器建模的情况下,直接用于真实工业安全控制。
- 不适合做高精度物理仿真,小岛场景更偏向逻辑和状态可视化,不是动力学级仿真。
- 不适合需要真实机器人三维模型精确复刻的场景,除非额外投入建模资源。
2.4 使用边界与合规提醒
做这个方向时,需要特别注意几个边界:
- 如果后续接入真实机器人、摄像头画面、人员行为数据,必须确保数据采集已获得授权。
- 不要使用真实地图、敏感区域坐标或未脱敏的业务数据来搭建场景。
- 场景内涉及人脸、商标、版权素材时,需要确认使用授权。
- 项目用于商用或对外展示前,应核对地图素材、模型素材的许可协议。
- 不要把仿真结果直接作为真实系统的安全依据,仿真环境无法覆盖所有硬件异常。
3. 整体架构与关键技术
3.1 分层架构
一个完整的可视化 AI 机器人小岛,建议拆成四层:
| 层级 | 职责 | 可选实现 |
|---|---|---|
| 场景渲染层 | 小岛地形、机器人模型、动画、相机控制 | Three.js / Unity 3D / Babylon.js |
| 仿真调度层 | 任务生成、路径规划、多机器人调度、状态管理 | Python / FastAPI,或 Node.js |
| 数据通信层 | 实时推送机器人状态、任务进度、事件消息 | WebSocket / MQTT / Socket.IO |
| 数据看板层 | 任务量、机器人状态、区域热力、性能指标展示 | ECharts / AntV / 自研仪表盘 |
四层之间通过标准接口通信,避免把渲染逻辑和调度逻辑混在一起。这样后续无论替换前端渲染引擎,还是替换调度算法,都不会牵一发动全身。
3.2 小岛场景模块
“小岛”不是简单放一块地形,而是把整个业务环境模型化。实际项目中,建议把小岛划分为多个功能区:
- 起点与终点区域:机器人接收任务后,从起始点出发,到达目标点。
- 任务站点:装卸货区、充电桩、巡检点、处理工位。
- 道路网络:机器人可通行的路径,需要预先定义节点和边。
- 动态障碍区:模拟临时障碍物、交通拥堵区域。
- 数据看板区:在小岛一侧布置大屏面板,实时显示全局数据。
在 Three.js 中,每个功能区域都可以抽象为带有位置、大小、颜色属性的对象。在 Unity 中,则可以使用空物体 + 区域碰撞体来实现。
3.3 机器人对象模型
每台 AI 机器人在系统里需要有一个统一的状态结构,建议包含以下字段:
{ "robot_id": "AGV-001", "type": "carrier", "status": "moving", "position": { "x": 12.5, "y": 0, "z": 8.2 }, "target": { "x": 20.0, "y": 0, "z": 5.0 }, "speed": 1.2, "task_id": "TASK-20250101-001", "battery": 86.5, "timestamp": 1735689600000 }其中status至少需要包含idle、moving、working、charging、error几种状态。前端拿到这份状态后,同步更新三维场景中机器人的位置和动画,同时把统计信息刷新到大屏看板上。
3.4 实时通信设计
实时通信是这个项目体验好坏的关键。推荐使用 WebSocket 作为主通道,原因很简单:服务端可以主动推送机器人状态,客户端不需要频繁轮询。
通信协议可以这样设计:
- 机器人状态推送:
robot/state - 任务状态变化:
task/update - 系统告警:
system/alert - 全局心跳:
system/heartbeat
每个消息都带时间戳和消息类型,前端按类型分发处理。如果担心网络抖动导致画面跳动,可以在前端做插值平滑,让机器人从上一个位置平滑移动到当前接收到的位置。
3.5 可视化大屏联动
小岛场景属于“空间可视化”,大屏看板属于“数据可视化”,两者要联动才有完整效果。大屏上建议展示这些指标:
- 当前在线机器人数量
- 各状态机器人占比
- 任务完成总数与成功率
- 实时任务队列长度
- 各区域机器人密度热力
- 路径平均耗时
- 异常事件时间线
ECharts 负责图表渲染,三维场景负责空间展示。点击大屏上的某个机器人状态,可以过滤场景中对应状态的机器人;点击场景中的机器人,也可以在大屏上弹出它的详细任务信息。这种双向联动做好了,整体效果会显著提升。
4. 环境准备与前置条件
这个项目的环境准备和具体技术选型强相关。下面给出一套通用检查清单,你按自己的方案对照调整。
4.1 开发环境
| 依赖项 | 说明 |
|---|---|
| 操作系统 | Windows 10/11、Ubuntu 20.04/22.04、macOS 均可,以本机测试为准 |
| 前端运行时 | Node.js 16+ 或更高版本,用于 Three.js 项目构建和静态服务 |
| 后端运行时 | Python 3.9+ 或 Node.js 16+,用于调度服务和 WebSocket 服务 |
| 三维引擎 | Three.js(推荐学习成本低)或 Unity 2021 LTS 以上 |
| 数据库(可选) | SQLite 起步,任务量大了再换 PostgreSQL/MySQL |
| GPU 驱动 | 使用 GPU 渲染时,需要安装较新的显卡驱动 |
| 磁盘空间 | 项目代码本身不大,但 3D 模型和纹理资源需要预留 2GB~10GB |
4.2 创建项目基础结构
建议使用前后端分离的结构:
robot-island/ ├── frontend/ # 三维场景与可视化前端 │ ├── public/ # 模型、纹理、静态资源 │ └── src/ ├── backend/ # 调度与通信服务 │ ├── app/ │ ├── tasks/ │ └── requirements.txt ├── data/ # 任务配置、地图配置、测试数据 │ ├── maps/ │ └── tasks/ ├── scripts/ # 批量任务脚本、性能测试脚本 └── README.md4.3 端口规划
规划服务端口时,建议避开常用端口冲突区域:
| 端口 | 用途 |
|---|---|
| 8080 | 前端静态页面 |
| 8000 | 调度服务 REST API |
| 8001 | WebSocket 实时推送服务 |
如果端口被占用,可以使用lsof -i:8080(Linux/macOS)或netstat -ano | findstr 8080(Windows)查看占用进程。
5. 本地部署与启动方式
这里我给出两种方案:一种是纯 Web 方案,适合快速跑通演示;另一种是 Unity + Python 方案,适合更重的项目化开发。建议第一次先跑纯 Web 方案,成本最低。
5.1 方案一:Three.js + FastAPI 快速启动
先启动后端调度服务:
cd backend python -m venv venv source venv/bin/activate # Windows 下是 venv\Scripts\activate pip install -r requirements.txt uvicorn app.main:app --host 127.0.0.1 --port 8000如果requirements.txt还没有,可以先按最小依赖安装:
pip install fastapi uvicorn websockets pydantic再启动前端静态服务:
cd frontend npm install npm run dev如果前端是一个纯静态页面,也可以用 Python 快速启动:
cd frontend python -m http.server 8080启动完成后,浏览器访问http://127.0.0.1:8080,后端接口地址配置为http://127.0.0.1:8000,WebSocket 地址配置为ws://127.0.0.1:8001。
5.2 方案二:Docker 一键启动
如果你希望把整套环境做成一键启动,可以用 docker-compose。先写一个docker-compose.yml:
version: "3.8" services: backend: build: ./backend ports: - "8000:8000" - "8001:8001" volumes: - ./data:/app/data frontend: build: ./frontend ports: - "8080:80" depends_on: - backend然后执行:
docker-compose up -d需要说明的是,这套 Docker 配置只是通用模板。实际采用时,需要根据你的项目修改镜像构建文件、端口映射和数据卷路径。
5.3 方案三:Unity 工程启动
如果你选择 Unity 做三维场景,流程是:
- 创建 Unity 3D 工程。
- 导入机器人模型、小岛地形资源。
- 编写 C# 脚本,通过 WebSocket 或 HTTP 从调度服务拉取机器人状态。
- 在编辑器中点击 Play 运行,或者打包成 Windows 可执行程序。
Unity 方案的优点是视觉效果上限更高,适合做最终演示版。缺点是迭代成本高,前期的资源导入、坐标对齐和打包流程都需要时间。对于以验证和开发为主的阶段,我建议先用 Three.js 跑通逻辑,再决定是否迁移到 Unity。
6. 功能测试与效果验证
这个章节是重点。项目启动后,你需要按下面的顺序做一轮完整验证。只有所有环节都通了,这个可视化小岛才算真正可用。
6.1 场景加载测试
测试目的:确认小岛场景能够正常加载,机器人资源不缺失。
操作步骤:
- 启动前端服务。
- 打开浏览器访问页面。
- 观察小岛地图、建筑、道路、机器人模型是否正常渲染。
预期结果:
- 页面无白屏。
- 控制台无资源加载 404 错误。
- 相机可以正常移动旋转。
常见问题:
- 页面白屏:检查前端构建是否成功,模型路径是否正确。
- 模型显示为灰色:检查材质和光照设置。
6.2 单机器人任务下发测试
测试目的:验证从调度服务下发一个任务,机器人能否在场景中执行并移动到目标点。
使用 curl 下发一个任务:
curl -X POST http://127.0.0.1:8000/api/tasks \ -H "Content-Type: application/json" \ -d '{ "task_id": "TASK-001", "type": "move", "robot_id": "AGV-001", "start": {"x": 0, "y": 0}, "end": {"x": 15, "y": 10} }'预期结果:
- 接口返回任务创建成功。
- 三维场景中 AGV-001 从起点向终点移动。
- 机器人状态由
idle变为moving,到达后变为idle。 - 大屏上的任务完成数增加 1。
判断标准以我自己的经验来说:任务是否成功,不是看接口返回,而是看机器人是否真的在场景里动了,并且状态是否完整走完idle -> moving -> idle闭环。
6.3 多机器人调度可视化测试
测试目的:验证多台机器人同时执行任务时,场景中不会出现明显穿模、碰撞交叉和状态错乱。
操作步骤:
- 批量下发 5~10 个任务,指定给不同机器人。
- 观察机器人运行轨迹。
- 记录是否存在路径冲突。
预期结果:
- 多台机器人可以同时移动。
- 交叉路口处等待逻辑生效。
- 大屏上同时在线机器人数量正确。
如果出现两台机器人重叠,优先检查调度层的路径分配算法,看是否允许同一时间占用同一节点。这个问题的根源通常在前端渲染之外。
6.4 工作流进度展示测试
测试目的:验证单个工作任务的全流程展示,例如“搬运任务”的状态流转。
可以在场景中设计一条完整的工作流:
任务创建 -> 机器人接单 -> 移动到装载点 -> 装载 -> 移动到卸载点 -> 卸载 -> 任务完成对应状态:
{ "task_id": "TASK-002", "workflow": [ "created", "accepted", "moving_to_load", "loading", "moving_to_unload", "unloading", "completed" ], "current_stage": "loading" }预期结果:
- 场景中机器人按照工作流阶段执行动作。
- 大屏上工作流进度条同步更新。
- 每个阶段切换时,日志文件输出对应事件。
6.5 数据大屏联动测试
测试目的:验证三维场景与数据看板之间的双向联动。
操作步骤:
- 在大屏中点击某个机器人状态,例如“充电中”。
- 观察场景中是否只高亮充电中的机器人。
- 在场景中点击某台机器人,观察大屏是否显示该机器人详情。
预期结果:
- 筛选逻辑正常。
- 点击事件响应迅速,无明显卡顿。
6.6 批量任务测试
测试目的:验证批量导入任务时的执行能力和稳定性。
准备一个批量任务 JSON 文件:
[ {"task_id": "TASK-B001", "type": "move", "robot_id": "AGV-003", "end": {"x": 5, "y": 5}}, {"task_id": "TASK-B002", "type": "move", "robot_id": "AGV-004", "end": {"x": 8, "y": 12}}, {"task_id": "TASK-B003", "type": "move", "robot_id": "AGV-005", "end": {"x": 20, "y": 18}} ]然后写一个简单的批量提交脚本:
import json import requests with open("data/tasks/batch_001.json", "r", encoding="utf-8") as f: tasks = json.load(f) for task in tasks: response = requests.post( "http://127.0.0.1:8000/api/tasks", json=task, timeout=10 ) print(task["task_id"], response.status_code)预期结果:
- 所有任务进入队列。
- 机器人依次执行任务。
- 任务执行完成后,大屏统计数字正确。
- 如果某个机器人任务失败,系统能自动进入重试或标记失败。
批量任务最容易出现的问题是“前一个任务没完成,后一个任务已经下发,导致机器人状态冲突”。所以调度服务必须做任务队列,不能无脑并发执行。
6.7 异常与恢复测试
这个测试很多人会漏掉,但非常关键。你需要主动制造异常,验证系统的容错能力。
可以测试以下几种情况:
- 手动停止调度服务,再重新启动,确认 WebSocket 自动重连。
- 给指定机器人发送一个不可达的目标点,确认系统给出告警而不是崩溃。
- 强制使某个任务超时,确认任务进入失败队列。
- 拔掉网络,确认前端出现断线提示,恢复后数据能重新同步。
预期结果:
- 前端不断崩溃。
- 机器人在异常恢复后能回到正确状态。
- 日志文件完整记录异常时间线。
7. 接口 API 与批量任务设计
7.1 REST API 示例
以下是一组通用的 REST 接口设计,实际路径需要按自己的后端框架调整。
| 方法 | 路径 | 功能 |
|---|---|---|
| GET | /api/robots | 获取所有机器人状态 |
| GET | /api/robots/{robot_id} | 获取单台机器人详情 |
| POST | /api/tasks | 创建任务 |
| GET | /api/tasks?status=running | 查询任务列表 |
| POST | /api/tasks/batch | 批量创建任务 |
| DELETE | /api/tasks/{task_id} | 取消任务 |
创建任务接口的 JSON 请求体参考:
{ "task_id": "TASK-20250101-007", "type": "move", "priority": 1, "robot_id": "AGV-002", "start": {"x": 1.0, "y": 1.0}, "end": {"x": 18.0, "y": 20.0}, "timeout": 120 }响应示例:
{ "code": 0, "message": "task created", "data": { "task_id": "TASK-20250101-007", "status": "queued", "robot_id": "AGV-002" } }7.2 WebSocket 消息示例
服务端推送机器人状态:
{ "type": "robot/state", "data": { "robot_id": "AGV-002", "status": "moving", "position": {"x": 10.2, "y": 0, "z": 7.6}, "battery": 80.2, "task_id": "TASK-20250101-007" }, "timestamp": 1735689600000 }前端收到消息后,可以直接驱动 Three.js 场景中的机器人更新位置和状态动画。
7.3 批量任务与队列设计
批量任务不能“一把梭”直接全量下发,建议在调度服务中实现一个简单的队列状态机:
pending -> running -> completed -> failed -> retry -> running -> canceled批量任务建议按下面的配置控制:
{ "batch_id": "BATCH-20250101-001", "concurrency": 5, "max_retry": 3, "tasks": [ {"task_id": "TASK-001", "robot_id": "AGV-001"}, {"task_id": "TASK-002", "robot_id": "AGV-002"} ] }concurrency表示同时执行的任务数,设置过大会导致场景内机器人都挤在路口,设置过小则任务效率太低。需要根据小岛道路容量和机器人数量实测调整。
7.4 Python 通用 API 调用模板
import requests import json BASE_URL = "http://127.0.0.1:8000" def create_task(task): response = requests.post(f"{BASE_URL}/api/tasks", json=task, timeout=10) response.raise_for_status() return response.json() def get_robot_status(robot_id): response = requests.get(f"{BASE_URL}/api/robots/{robot_id}", timeout=10) response.raise_for_status() return response.json() if __name__ == "__main__": task = { "task_id": "TASK-DEMO-001", "type": "move", "robot_id": "AGV-001", "end": {"x": 12, "y": 8} } result = create_task(task) print(json.dumps(result, ensure_ascii=False, indent=2))8. 资源占用与性能观察
由于这个项目的渲染和仿真比例可以灵活调整,资源占用不能一概而论。下面说几个可以量化的观察角度。
8.1 三维场景性能
- 打开浏览器开发者工具的 Performance 面板,观察页面帧率。
- 如果机器人模型数量多,优先检查 draw call 次数。
- Three.js 场景中,建议用 InstancedMesh 渲染大量相同的机器人模型,可以显著降低 GPU 开销。
- 观察显存占用时,可以在浏览器任务管理器中查看对应标签页的 GPU 内存。
8.2 调度服务性能
- 观察进程 CPU 占用率,如果机器人数量和任务数量都不大但 CPU 很高,优先检查是否存在大量无效遍历。
- 批量任务执行时,观察内存增长情况,防止队列无限堆积。
- WebSocket 推送频率不宜过高,建议 10Hz 到 30Hz 之间即可。推送频率过高时,前端渲染会成为瓶颈。
8.3 降低资源占用的手段
| 优化手段 | 说明 |
|---|---|
| 降低推送频率 | 从 30Hz 降到 10Hz,肉眼几乎看不出差别 |
| 使用 InstancedMesh | 大量相同机器人复用同一网格和材质 |
| 简化模型 | 低模 + 贴图替换高精度模型 |
| 开启视锥裁剪 | 只渲染相机范围内的物体 |
| 关闭阴影 | 场景中机器人和建筑较多时阴影开销很大 |
| 限制同屏任务数 | 在调度层做并发限制,避免所有机器人同时移动 |
8.4 端口与进程检查
服务启动异常时,优先检查端口占用:
lsof -i:8000 lsof -i:8080如果端口被占用,可以在启动命令中显式指定新端口:
uvicorn app.main:app --host 127.0.0.1 --port 8002 python -m http.server 80819. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 页面白屏 | 前端资源路径错误或构建失败 | 打开浏览器控制台 Network 面板查看资源加载状态 | 修正静态资源路径,重新构建前端 |
| 机器人不移动 | 后端未下发位置消息或 WebSocket 未连接 | 检查后端日志,查看 WebSocket 连接状态 | 确认 WebSocket 地址配置正确并重启服务 |
| WebSocket 频繁断开 | 服务端崩溃或网络不稳定 | 查看服务端日志,检查心跳机制 | 客户端增加自动重连和心跳重连逻辑 |
| 机器人穿模重叠 | 调度层未做路径冲突检测 | 查看路径规划日志 | 在调度层增加节点占用检测与等待机制 |
| 批量任务执行混乱 | 并发数设置过高或任务队列未实现 | 检查队列状态和并发配置 | 降低并发数,加入任务状态机 |
| 模型加载缓慢 | 模型文件太大或格式复杂 | 检查模型文件大小和格式 | 压缩 glTF/GLB 模型,使用 draco 压缩 |
| 大屏数据不更新 | WebSocket 消息未正确解析 | 在 Network 面板中查看 WS 帧数据 | 检查消息 type 字段是否匹配前端分发逻辑 |
| 端口冲突 | 其他进程占用端口 | 使用 lsof/netstat 检查端口 | 更换端口或结束占用进程 |
| 接口返回 500 | 后端代码异常或数据格式错误 | 查看后端 traceback 日志 | 修复异常逻辑,校验请求 JSON 格式 |
| 机器人状态与场景不符 | 前端插值逻辑与后端状态不同步 | 检查机器人是否有唯一定位标识 | 以 robot_id 为唯一键更新状态,避免混淆 |
10. 最佳实践与使用建议
10.1 工程化建议
第一,第一次跑通流水线时,用小参数测试。地形小一点,机器人 5 台以内,任务 10 个以内,先把链路跑通,再逐步加压。不要一开始就模拟 100 台机器人,否则你分不清是渲染卡还是调度卡。
第二,把任务配置、地图配置、机器人配置都拆成外部 JSON,不要写死在代码里。后面调整地图和任务类型时,只需要改配置,不用改代码。
{ "map": "data/maps/island_map.json", "robots": ["data/robots/agv_001.json"], "task_batches": ["data/tasks/batch_001.json"] }第三,批量任务必须加日志和失败重试。建议日志记录每个任务的完整时间线:创建时间、开始时间、完成时间、失败原因。失败任务设置重试次数上限,避免死循环。
第四,接口服务要限制访问范围。开发阶段绑定127.0.0.1,局域网演示时再绑定0.0.0.0,但要注意服务暴露在局域网时的访问控制。不要把调度服务直接暴露到公网。
第五,数据管理要规范。模型文件、输入素材、输出结果分目录管理,不要全部堆在根目录。建议目录结构如下:
data/ ├── maps/ # 地图配置 ├── robots/ # 机器人配置 ├── tasks/ # 任务配置 ├── logs/ # 运行日志 └── outputs/ # 批量任务结果10.2 合规与隐私建议
这个项目涉及 AI 机器人和可视化数据,如果后续接入真实业务数据,要注意:
- 不要使用未脱敏的真实人员轨迹、人脸图像、车辆信息。
- 如果场景中使用了真实企业的地图布局,需要获得授权。
- 涉及机器人远程控制或调度真实设备时,必须增加安全控制机制,确保可视化系统不会绕过安全系统直接操作设备。
- 项目对外展示或开源时,检查所有素材是否允许再分发。
10.3 最容易踩的坑
根据这类项目的常见情况,有几个坑提前提醒:
- 坐标不一致。后端下发坐标使用小岛局部坐标系,前端 Three.js 使用世界坐标系,两者没有换算,机器人会跑到地图外。解决方案是统一约定坐标基准,建议所有层都使用小岛局部坐标系。
- WebSocket 消息频率过高。服务端每帧推送一次,前端来不及渲染,导致画面卡顿和消息堆积。需要在服务端节流。
- 任务状态混乱。多个任务同时引用同一台机器人,机器人状态被反复覆盖。需要在调度层为每台机器人加任务互斥锁。
- 模型轴心错误。导入的机器人模型轴心不在底部中心,导致机器人在场景里“悬浮”或“陷地”。需要在建模工具或 Three.js 中调整模型 pivot。
11. 总结与下一步
可视化 AI 机器人工作的小岛,技术重点不在三维效果本身,而在“AI 机器人的状态能不能被完整、实时、准确地表达出来”。先跑通场景加载,再做单机器人任务,最后扩展多机调度、批量任务和接口 API,这套路径最稳妥,也能让你在迭代过程中逐步理解整个系统各层之间的依赖关系。
建议收藏备用。最容易踩的坑是坐标不一致、WebSocket 推送频率过高、任务状态互相覆盖这三个,提前规避就能省很多时间。后续如果想继续扩展,可以考虑接入真实机器人的传感器数据,或者把路径规划算法换成强化学习版本,用这个小岛作为可视化验证环境。