v4.0 重大架构调整:从四层架构优化为双层架构
- 架构简化:L1-L2合并为「工艺设计层」,L3-L4合并为「现场执行层」
- 部署优化:Web工具(笔记本/PAD/云端)+ 本地工具(工控机/边缘设备)
- 离线支持:程序包传输机制,支持现场离线运行
- 元动作模型集成:GraspNet抓取姿态预测、WAM力控装配
- 反向同步机制:现场调试参数可反向同步至设计层
- 指标修正:10分钟→10-30分钟,2000倍→8-16倍(真实提升)
1. 概述
1.1 项目背景
JZTclaw(玑之龙虾)是一套面向柔性制造的机器人控制系统,采用双层解耦架构,让客户技术人员无需编程即可自主维护工艺逻辑。
核心设计原则
- 工艺设计层:工程师在笔记本/PAD/云端完成工艺设计和参数配置
- 现场执行层:现场工控机导入程序包,执行工艺并支持实时调试
- 离线运行:程序包传输机制,现场无需持续网络连接
- 反向同步:现场调试的参数可同步回设计层,形成闭环
支持的机器人类型
| 类型 | 形态 | 典型应用场景 | 协议支持 |
|---|---|---|---|
| 固定工作站 | 工业机械臂 + 固定底座 | 光模块测试、路由器组装、CNC上下料 | Modbus TCP、EtherCAT |
| 复合机器人 | AMR移动底盘 + 协作机械臂 | 跨工位物料搬运、柔性产线协同、仓储物流 | MQTT、CANopen、WiFi/5G |
1.2 核心指标(修正后)
| 指标 | 目标值 | 说明 |
|---|---|---|
| 工艺参数调整 | 10-30分钟 | 成熟设备改参数,不涉及新设备接入 |
| 简单流程变更 | 2-4小时 | 增删节点、调整顺序(现有设备) |
| 新设备接入 | 1-2天 | 驱动配置、标定、联调 |
| 系统响应延迟 | ≤100ms | 控制指令响应(本地执行) |
2. 整体技术架构
2.1 双层架构图
flowchart TB
subgraph DL["工艺设计层 Web工具"]
A1[Skill模板管理]
A2[可视化流程编辑]
A3[参数配置面板]
A4[程序包管理]
end
subgraph FL["现场执行层 本地工具"]
B1[程序包解析执行]
B2[元动作模型调用]
B3[实时状态监控]
B4[现场参数微调]
end
DL -->|程序包导出| FL
FL -->|反向同步| DL
2.2 架构优势
| 维度 | 原四层架构 | 新双层架构 |
|---|---|---|
| 部署复杂度 | 四层服务,依赖多 | 两个独立工具,解耦 |
| 网络依赖 | 层间通信依赖网络 | 程序包传输,断网可运行 |
| 现场调试 | 需远程连接多层 | 本地工具直接调试 |
| 响应速度 | 多层网络延迟 | 本地执行,低延迟 |
| 离线能力 | 不支持 | 完整支持 |
3. 与传统模式对比(修正后)
| 阶段 | 传统模式 | 玑之模式 | 提升 |
|---|---|---|---|
| 需求沟通 | 2-4小时 | 无需 | - |
| 供应商响应 | 4-8小时 | 无需 | - |
| 参数调整 | 4-8小时 | 10-30分钟 | 8-48倍 |
| 验证上线 | 2-4小时 | 1-2小时 | 1-4倍 |
| 总计 | 1-2天 | 2-3小时 | 8-16倍 |
4. 工艺设计层(L1-L2合并)
工具定位
名称:工艺设计工作站(Process Design Workstation)
部署:笔记本 / PAD平板 / 云端Web
4.1 功能模块
Skill
Skill模板库
• 浏览模板 • 导入导出 • 版本管理 • 分类筛选
Editor
状态树编辑器
• 拖拽编辑 • 节点配置 • 连线逻辑 • 验证检查
Params
参数配置面板
• 位姿参数 • 速度/加速度 • 温度/时间 • IO配置
Package
程序包管理
• 打包导出 • 版本标记 • 导入现场 • 反向同步
4.2 技术栈
| 组件 | 技术选型 | 用途 |
|---|---|---|
| 前端框架 | React 18 + TypeScript | UI组件、状态管理 |
| 流程编辑器 | ReactFlow | 可视化状态树编辑 |
| 后端服务 | Node.js + NestJS | API服务、业务逻辑 |
| 数据库 | PostgreSQL | 数据持久化 |
4.3 RESTful API
# Skill模板管理
GET /api/v1/skills
summary: 获取工艺模板列表
parameters:
- name: category
in: query
schema: { type: string, enum: [optical, assembly, cnc] }
POST /api/v1/skills
summary: 创建工艺模板
requestBody:
content:
application/json:
schema:
type: object
required: [name, category, nodes, edges]
# 状态树管理
GET /api/v1/state-trees
POST /api/v1/state-trees
PUT /api/v1/state-trees/{treeId}
# 程序包管理
POST /api/v1/state-trees/{treeId}/export
POST /api/v1/packages/import
# 变更同步
GET /api/v1/sync/pending
POST /api/v1/sync/{syncId}/apply
POST /api/v1/sync/{syncId}/reject
5. 现场执行层(L3-L4合并)
工具定位
名称:现场执行监控台(Field Execution Console)
部署:现场工控机 / 边缘计算设备(Jetson/Intel NUC)
5.1 功能模块
Execute
程序包执行
• 导入程序包 • 解析验证 • 状态树执行 • 版本切换
Monitor
实时状态监控
• 设备状态 • 执行进度 • 告警提示 • 遥测数据
Tune
现场参数微调
• 位姿修正 • 速度调整 • 参数优化 • 反向同步
5.2 技术栈
| 组件 | 技术选型 | 用途 |
|---|---|---|
| 执行引擎 | Rust + ROS2 | 高性能动作执行 |
| 运动规划 | MoveIt2 + Nav2 | 机械臂/AMR路径规划 |
| 模型推理 | Python + PyTorch | GraspNet/WAM推理 |
| 硬件控制 | Go/Python | 协议适配、设备控制 |
5.3 gRPC 接口
service FieldExecutionService {
rpc ImportPackage(ImportRequest) returns (ImportResponse);
rpc GetPackageInfo(PackageInfoRequest) returns (PackageInfo);
rpc StartExecution(StartRequest) returns (stream ExecutionResponse);
rpc StopExecution(StopRequest) returns (StopResponse);
rpc PauseExecution(PauseRequest) returns (PauseResponse);
rpc UpdateParam(UpdateParamRequest) returns (UpdateParamResponse);
rpc CreateSyncPackage(CreateSyncRequest) returns (CreateSyncResponse);
rpc UploadSyncPackage(UploadSyncRequest) returns (UploadSyncResponse);
}
enum ExecutionMode {
NORMAL = 0;
STEP_BY_STEP = 1;
SIMULATION = 2;
}
enum ExecutionStatus {
PENDING = 0;
RUNNING = 1;
PAUSED = 2;
COMPLETED = 3;
FAILED = 4;
STOPPED = 5;
}
6. 元动作模型集成
6.1 模型架构
flowchart TB
MM[模型管理器] --> GN[GraspNet抓取]
MM --> WM[WAM力控]
MM --> VM[视觉检测]
6.2 GraspNet集成
# graspnet_service.py
import rospy
from graspnet_msgs.srv import GraspPrediction, GraspPredictionRequest
class GraspNetService:
def __init__(self):
self.grasp_client = rospy.ServiceProxy('/graspnet/predict', GraspPrediction)
def predict_grasp(self, pointcloud_msg, object_type=None):
req = GraspPredictionRequest()
req.pointcloud = pointcloud_msg
req.object_type = object_type or ""
try:
resp = self.grasp_client(req, timeout=5.0)
if resp.success:
return {
'pose': resp.grasp_pose,
'width': resp.grasp_width,
'score': resp.score,
'approach_vector': resp.approach_vector
}
except rospy.ServiceException as e:
rospy.logerr(f"GraspNet服务调用失败: {e}")
return None
6.3 WAM力控装配集成
# wam_service.py
import rospy
from wam_msgs.msg import WAMCartesianCommand, WAMState
class WAMService:
def __init__(self):
self.cmd_pub = rospy.Publisher('/wam/cartesian_cmd', WAMCartesianCommand, queue_size=10)
self.state_sub = rospy.Subscriber('/wam/state', WAMState, self.state_callback)
def execute_force_assembly(self, target_pose, force_threshold=10.0,
torque_threshold=2.0, velocity=0.01):
cmd = WAMCartesianCommand()
cmd.pose = target_pose
cmd.velocity = velocity
cmd.force_control = True
cmd.force_threshold = force_threshold
cmd.torque_threshold = torque_threshold
self.cmd_pub.publish(cmd)
return self.wait_for_completion(timeout=30.0)
6.4 模型部署策略
| 模型 | 部署方式 | 推理延迟 | 硬件需求 |
|---|---|---|---|
| GraspNet | 边缘GPU | 100-500ms | CUDA GPU |
| WAM | 本地CPU/GPU | 10-50ms | 中等 |
| 视觉检测 | 边缘设备/VPU | 50-200ms | Intel NCS |
7. 程序包格式规范
7.1 程序包结构
{
"version": "2.0.0",
"package_format": "jzt-claw-v2",
"package_id": "pkg_20250401_001",
"package_name": "光模块测试工艺_v1.2",
"skill_info": {
"id": "optical-test-001",
"name": "光模块测试",
"category": "optical"
},
"state_tree": {
"nodes": [
{
"id": "node_001",
"type": "start",
"position": { "x": 100, "y": 100 }
},
{
"id": "node_002",
"type": "graspnet_pick",
"params": {
"model_version": "graspnet-v2.1",
"confidence_threshold": 0.8
}
}
],
"edges": [...]
},
"meta_actions": [...],
"hardware_config": {...},
"checksum": "sha256:..."
}
7.2 传输方式
| 方式 | 适用场景 |
|---|---|
| 网络传输 | 现场有网络连接:设计层导出 → 上传服务器 → 执行层下载 |
| USB传输 | 现场无网络或安全隔离:导出到U盘 → 插入执行层导入 |
| 本地文件 | 同一设备双系统:保存到共享目录 → 执行层直接读取 |
8. 反向同步机制
8.1 同步流程
sequenceDiagram
participant F as 现场执行层
participant D as 工艺设计层
F->>F: 参数微调
F->>D: 上传同步包
D->>D: 显示变更
D-->>F: 同步结果
8.2 同步包格式
{
"sync_version": "1.0.0",
"sync_id": "sync_20250401_001",
"source_package_id": "pkg_20250401_001",
"created_at": "2025-04-01T14:30:00Z",
"created_by": "现场工程师B",
"reason": "吸取位置偏移调整,提升抓取成功率",
"changes": [
{
"change_id": "chg_001",
"node_id": "node_002",
"node_type": "graspnet_pick",
"param_name": "approach_height",
"old_value": "50",
"new_value": "55",
"reason": "避免碰撞"
}
],
"validation": {
"tested_on_device": "robot_arm_001",
"test_count": 50,
"success_rate": "98%"
}
}
8.3 冲突处理策略
| 冲突类型 | 处理方式 |
|---|---|
| 同一参数多次变更 | 时间优先:以最新变更为准 |
| 设计层已修改 | 手动合并:提示用户选择版本 |
| 节点已删除 | 忽略变更:标记为无效 |
| 版本不兼容 | 拒绝同步:提示版本不匹配 |
9. 数据模型设计
-- 程序包管理
CREATE TABLE packages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
package_id VARCHAR(100) UNIQUE NOT NULL,
name VARCHAR(200) NOT NULL,
version VARCHAR(20) NOT NULL,
skill_id VARCHAR(100) NOT NULL,
state_tree JSONB NOT NULL,
meta_actions JSONB,
hardware_config JSONB,
checksum VARCHAR(100) NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 参数变更记录
CREATE TABLE param_changes (
id UUID PRIMARY KEY,
package_id UUID REFERENCES packages(id),
node_id VARCHAR(100) NOT NULL,
param_name VARCHAR(100) NOT NULL,
old_value TEXT,
new_value TEXT NOT NULL,
reason TEXT,
sync_status VARCHAR(20) DEFAULT 'pending',
changed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 同步包
CREATE TABLE sync_packages (
id UUID PRIMARY KEY,
sync_id VARCHAR(100) UNIQUE NOT NULL,
source_package_id UUID REFERENCES packages(id),
changes JSONB NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- 执行记录
CREATE TABLE execution_logs (
id UUID PRIMARY KEY,
instance_id UUID REFERENCES package_instances(id),
execution_id VARCHAR(100) NOT NULL,
status VARCHAR(20) NOT NULL,
started_at TIMESTAMP WITH TIME ZONE,
completed_at TIMESTAMP WITH TIME ZONE,
cycle_time INTEGER,
success_count INTEGER DEFAULT 0,
fail_count INTEGER DEFAULT 0
);
-- 索引
CREATE INDEX idx_packages_skill_id ON packages(skill_id);
CREATE INDEX idx_param_changes_package ON param_changes(package_id);
CREATE INDEX idx_sync_packages_status ON sync_packages(status);
10. 部署架构
10.1 工艺设计层部署
# docker-compose.design.yml
version: '3.8'
services:
design-frontend:
image: jzt/claw-design-frontend:latest
ports: ["80:80"]
volumes:
- package-storage:/data/packages
design-backend:
image: jzt/claw-design-backend:latest
ports: ["3000:3000"]
environment:
- NODE_ENV=production
- DB_HOST=postgres
postgres:
image: postgres:15-alpine
volumes:
- postgres-data:/var/lib/postgresql/data
10.2 现场执行层部署
# docker-compose.field.yml
version: '3.8'
services:
field-execution:
image: jzt/claw-field-execution:latest
ports:
- "50051:50051" # gRPC
- "8080:8080" # HTTP
privileged: true
model-inference:
image: jzt/claw-model-inference:latest
ports: ["50052:50052"]
runtime: nvidia # GPU支持
11. 开发规范
11.1 代码规范
TypeScript/React(工艺设计层)
• 组件: PascalCase (StateTreeEditor)
• 函数: camelCase (handleNodeClick)
• 常量: SCREAMING_SNAKE_CASE (MAX_RETRY_COUNT)
• 接口: PascalCase + I前缀 (IStateTree)
• 函数: camelCase (handleNodeClick)
• 常量: SCREAMING_SNAKE_CASE (MAX_RETRY_COUNT)
• 接口: PascalCase + I前缀 (IStateTree)
Rust(现场执行层)
• 结构体: PascalCase (ActionSynthesizer)
• 函数: snake_case (synthesize_action)
• 常量: SCREAMING_SNAKE_CASE (MAX_JOINT_COUNT)
• 模块: snake_case (motion_planning)
• 函数: snake_case (synthesize_action)
• 常量: SCREAMING_SNAKE_CASE (MAX_JOINT_COUNT)
• 模块: snake_case (motion_planning)
11.2 实施路线图
| 阶段 | 周期 | 关键任务 |
|---|---|---|
| Phase 1 | 2-3个月 | 基础双层架构:设计层工具、执行层工具、程序包格式 |
| Phase 2 | 2-3个月 | 模型集成:GraspNet部署、WAM部署、边缘设备适配 |
| Phase 3 | 2-3个月 | 现场验证:场景验证、反向同步完善、性能调优 |
© 2026 玑之科技 JZI. All rights reserved.
JZTclaw(玑之龙虾)双层架构技术实现方案 v4.0