Skip to content

[候选工作单元(WorkCell)D2] 装配拓扑、物理位姿与物料边界 #183

Description

@TablewareBox

独立设计文档(审阅中):候选工作单元(WorkCell)组合定义、启动与分层动作设计
变更审阅:PR #188

父地图:#181

Outcome

冻结候选工作单元(WorkCell)的物理设计表达:设备与固定资源的选型、数量、包含、库位(Site)绑定、连接、相对位置和旋转,同时阻止定义或启动覆盖真实物料(Material)与库位占用(SiteOccupancy)权威事实。

D2 已全部收口

D2-01:坐标、单位与旋转

  • 选择 A:物理位姿采用右手 Z-up;候选工作单元(WorkCell)根坐标中 X 向右、Y 远离工站正面、Z 向上。
  • pose.position.{x,y,z} 使用毫米;pose.rotation.{x,y,z} 使用度;XYZ 欧拉角按列向量矩阵 Rz(z) · Ry(y) · Rx(x) 解释。
  • 拒绝 NaN/Infinity;-0 规范为 0;角度规范到 [-180, 180);不做任意小数位舍入。
  • 2D 与 3D 编辑器共用同一毫米制物理 pose;候选工作单元(WorkCell)不增加节点级 ui_layout 或第二套像素坐标。
  • 定义级可选 layout_plane 只允许 XY | XZ | YZ;省略表示无首选 2D 平面。

D2-02:Python 位姿组合接口(Interface)

  • 选择 A:父子组合统一使用 assign_child_resource(member, pose=Pose(position=..., rotation=...))
  • pose 永远表达成员相对父节点的物理位姿,不塞进任意设备/资源作者句柄的私有 config
  • 省略 pose 时规范化为恒等位姿;物理可渲染成员产生结构化告警;Python 生成器始终输出显式 pose

D2-03:嵌套父子变换

  • 选择 A:T_world(child) = T_world(parent) · T_parent(child),以矩阵递归组合世界位姿。
  • 欧拉角只作为输入与派生展示,不把组合结果反写到定义。
  • 根世界位姿归候选启用图(Activation Graph);父子环、缺父、双父及 parent/children 不一致均在发布前失败。

D2-04:v1 物料边界

  • 选择 A:候选工作单元定义(WorkCell Definition)拥有固定结构、库位(Site)、物料设计约束和只读物料投影;库存权威(Inventory Authority)独占真实物料(Material)与库位占用(SiteOccupancy)动态事实。
  • 日常上料、移位、取下、消耗分别走库存命令;工作流(Workflow)造成的物理变化通过作业执行占用(JobExecutionClaim)、变更集(ChangeSet)和回执(Receipt)结算。
  • 动态缺料不阻止候选工作单元(WorkCell)启用,由任务物料准入(TaskMaterialAdmission)判定任务能否开始;定义升级不自动搬运、删除或迁移既有物料。

D2-05:库位(Site)

  • 选择 A:v1 复用 config.sites[].label/content_type/position/size
  • label 是所属成员内唯一、稳定的库位(Site)key;position/size 使用毫米并相对所属成员根;v1 容量固定为 1。
  • 数组顺序用于首次物化 Backend sort_order;物化后持久 Site.sort_order 成为传感器数组映射的权威顺序。
  • content_type 必须通过 PackageCatalog 解析为 Backend 允许的资源模板(ResourceTemplate)UUID。
  • 定义中禁止 occupied_byoccupied_material_uuid 和真实物料(Material)身份;孔位和 UI 热区不自动升级为领域库位(Site)。

D2-06:真实物料预置执行链推迟到 v2+

  • v1 可以描述和校验模板、预期数量与目标库位(Site)等物料设计预期,但不生成可执行预置命令。
  • 候选工作单元(WorkCell)启用、重启和定义升级都不得创建/移动真实物料(Material)或写库位占用(SiteOccupancy)。
  • v1 不增加 command_idrequest_digest、整批预置事务或持久回执,也不把它们写入候选启用快照(Activation Snapshot)。首次安装由操作者通过现有库存权威(Inventory Authority)接口准备真实物料。
  • 已讨论的稳定命令身份、请求摘要、整批事务和回执机制保留为 v2+ 候选目标;重开时重新评审,不成为 v1 实现依赖或接受门。

D2-07:遗留迁移

  • 选择 A:离线遗留适配器(Adapter)输出规范图和迁移报告,不在读取时静默猜测。
  • positionpose.positionposition3drotation 来源唯一时归一到 pose;等价重复告警;冲突失败并报告精确 JSON 路径。
  • 遗留 2D 编辑器的毫米坐标也进入物理 pose,不分流到 ui_layout;只有两个坐标时必须结合无歧义 layout_plane 和第三轴来源,不能静默补零。
  • occupied_by、非空 data、真实物料(Material)身份与库位占用(SiteOccupancy)不进入定义。
  • v1 不产生或接受可执行物料预置候选;遗留测试 seed 保留为显式测试夹具;逐夹具映射与固定点测试归 G1。

2D 物理布置与 layout_plane

2D 编辑器用于设计和测绘,显示与编辑的就是物理毫米坐标。普通拖动直接修改所选平面对应的两个 pose.position 分量,未显示的第三轴保持不变:

layout_plane 2D 编辑轴 保持不变
XY X / Y Z
XZ X / Z Y
YZ Y / Z X

Python 使用 layout_plane: Literal["XY", "XZ", "YZ"] | None = None;规范 JSON 仅在有首选平面时保存 graph.layout_plane。UI 的“None”规范化为 Python None / JSON 字段缺席,不保存字符串 "None"

layout_plane 只选择观察/编辑平面,不创建第二坐标系,不改变轴方向、单位、父子变换或 Backend relative_position,也不把未显示轴归零。嵌套定义各自拥有自己的首选平面。

修改草稿(Draft)中的 pose 不产生硬件副作用,也不会自动移动真实设备;发布后形成新定义 revision,既有候选启用快照(Activation Snapshot)和工作流任务(WorkflowTask)继续固定旧 revision。只有显式重新启用后,新 pose 才进入后续运行模型。

当前前沿

D2 已完成;整个 Wayfinder 剩余 23 项:D4 7、D5 8、G1 8。下一批进入 #185,一次确认 D4 全部 7 项。

完整确认批次:#issuecomment-5181824831

不包含

  • endpoint、串口、连接开关或敏感配置(Secret);
  • 库存权威(Inventory Authority)的日常增删改查(CRUD)、任务物料预留(TaskMaterialReservation)或作业执行占用(JobExecutionClaim)的实现;
  • 3D 渲染器的具体实现;
  • 编辑器临时 viewport、缩放、选中态和折叠态的持久化协议。

Acceptance gates

  • 2D/3D 共用唯一物理 pose;没有节点级 ui_layout 或第二套坐标;
  • layout_plane 只选择两条编辑轴,拖动时保持第三轴,不改变坐标系;
  • 相同父子位姿递归组合得到确定世界位姿;
  • JSON → Python → JSON 保留位姿、库位(Site)和稳定成员身份;
  • config.sites[] 在发布期完成稳定 key、几何、允许类型和顺序校验;
  • 遗留位置冲突失败关闭,运行事实不进入候选工作单元定义(WorkCell Definition);
  • v1 可以展示和校验物料设计预期,但启用、重启和定义升级均不创建/移动真实物料(Material),也不写库位占用(SiteOccupancy);
  • v1 代码、Schema、候选启用快照(Activation Snapshot)和测试门中不存在可执行真实物料预置合同。

关联

Metadata

Metadata

Assignees

No one assigned

    Labels

    feature:workcell-compositionWorkCell 组合定义、注册编译、可见性与 Action 发布ready-for-humanRequires human implementationstage:protocol-definitionDefining or freezing the OKF protocolwayfinder:grilling需要与人逐题确认的 Wayfinder 决策票

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions