「能不能同时装」:兼容性问错了问题
本文首发于 RoboParts 机器人零件兼容性判定层。
几乎所有兼容性平台,都在回答同一个问题:
A 能不能插进 B?
这是一个二段关系:两个零件,一个接口,插得上还是插不上。
但工程师真正在问的,往往是另一个问题:
我这台机器人,能不能同时装一个夹爪和一个力传感器?
这不是二段关系。这是三段关系:
宿主机器人(工具侧)
/ \
器件 A 器件 B
(夹爪) (力传感器)
A 和 B 之间根本没有直接的接口——它们各自插到宿主上。所以"A 能不能插进 B"这个问题,在这里问错了。
为什么平台答不了这个问题
不是数据不够。是模型里没有"宿主"这个角色。
我们查过自己库里所有 platforms 类别的实体:它们记录的都是零件本体自己的法兰("我这个关节怎么装到别人身上"),没有一条声明"我是一台机器人,我的工具侧有几个电气接口"。
缺的不是零件数据,是角色。
补再多零件,也补不出一个"宿主"。
三段判据:三个必须同时成立的约束
要回答"能不能同时装",需要三个独立判据:
| 判据 | 问什么 | 与二段关系的区别 |
|---|---|---|
机械同型 mount_fit | 器件法兰 ≡ 宿主工具法兰? | 问"是否同型",而非"是否互插" |
位数预算 port_budget | 已装 + 本次 ≤ 宿主工具侧位数? | 共装独有:二段关系里不存在争抢有限资源 |
信号互补 signal_complementary | 一方输出、另一方感知? | 沿用跨角色判据 |
注意第二个判据——位数预算。这是二段关系里根本不存在的概念:一个接口要么插上要么没插上,不存在"装了两个就装不下第三个"。
一个真实的踩坑:位数、针数、器件数是三个量
我们初版实现时犯过一个错:把"每次装 1 件"当成预算。
结果:UR(工具侧是单个 8-pin 连接器)被判成"可以同时装两个器件"。
把唯一正确的约束判反了。
正确算法是:共装的语义是同时装两个器件,各占一位,所以要算 已占 + 2 ≤ 位数。UR 只有 1 位,所以"同时装夹爪 + 传感器"在 UR 上物理不可行。
位数、针数、器件数是三个不同的量。 任何两个混用,都会得出反向结论。
第三种答案:装不下 ≠ 不知道
这里有一个关键的区分。
UR 工具侧只有 1 个连接器位——这不是"我们不知道能不能装",而是确定装不下(需要转接件或换本体)。
所以我们在三态(是 / 否 / 不知道)之外,引入了第四个裁决态:
port_exhausted= 装不下(工程约束)unknown= 数据不足(我们不知道)
把这两者混为一谈,就是把"不知道"伪装成"不行"——这会让你错误地排除一个其实可行的方案(比如加个转接件就能装)。
这对你的意义
下次当你的工具问你"这两个零件兼容吗",先问清楚:
- 你在问"A 插 B"(二段互插)?
- 还是"A 和 B 同时装在一台机器人上"(三段共装)?
这是两个问题,答案可能相反。一个力传感器和一个夹爪可能"互不兼容"(因为它们的接口都是输出侧),但完全可以同时装在同一台机器人的工具侧。
问题问对了,答案才有意义。
RoboParts 的共装查询:check_co_mount({host, a, b}) 或 GET /api/co-mount?host=&a=&b=。四态裁决:可共装 / 装不下 / 类型错误 / 未知。