跳转到内容

它如何工作

PhysiClaw 做的每个动作,都是同一个四阶段循环转一圈。把循环固定下来,正是系统可靠的原因:每个阶段只干一件事,而且都以查看结果收尾。

┌──────────────────────────────────────────────────────────┐
│ │
▼ │
LOOK ─────────────► DECIDE ─────────► MOVE & TOUCH ──────► CHECK
overhead camera agent picks a arm drives stylus look again:
+ on-device vision box + a gesture to the box, taps did it change?
boxes every (tap / swipe / then lifts away │ │
element long-press) yes│ no│
│ │
next action ◄──┘ │
retry / re-aim ◄──────┘

整套系统就一台相机加一支机械臂。没有第二台相机,也没有深度传感器 —— 可靠性来自每次移动后都重新看一眼,而不是更花哨的硬件。

PhysiClaw 给屏幕拍一张照,再把它喂给设备本地的视觉模型 —— 用 OCR 识文字,用一个小巧的图标检测模型识按钮和图片。输出的不是原始像素,而是一份整洁的清单,其中每个元素都已经带好了框和标签:

id kind label bbox [left,top,right,bottom] conf
12 icon "Clock" [0.41, 0.55, 0.49, 0.63] 0.97
13 icon "Settings" [0.51, 0.55, 0.59, 0.63] 0.96
14 text "Wednesday 14" [0.30, 0.08, 0.70, 0.13] 0.99

一个 bbox(「边界框」)就是框住某个元素的一个矩形,用四个从 01 的数字表示 —— 也就是屏幕宽和高的比例。[0.41, 0.55, 0.49, 0.63] 的意思是「从横向 41%、纵向 55% 处开始,到横向 49%、纵向 63% 处结束」。用比例而不是像素,正是让一切都可移植的关键:同一份清单在任何尺寸的手机上都讲得通。

agent —— Claude,或者你指给 PhysiClaw 的任何模型 —— 读这份清单,挑出一个框一个手势。要打开时钟,它就挑元素 12 并调用 tap。它从不跟电机坐标或像素打交道;它只是点名一个框和一个动作。这就是它的全部词汇表,详见 MCP 工具参考。

PhysiClaw 把选中的框换算成机械臂坐标(这套映射正是校准要建立的),把触控笔送到框的中心,笔尖落下完成一次触碰。笔尖装在一个快速电磁铁 —— solenoid(电磁铁)—— 上,所以一次 tap 是干脆利落的一落一抬,长按则只是把笔尖多按一会儿。然后机械臂把触控笔停到一边、移出相机视野,好让下一张照片不被挡住。

PhysiClaw 再看一眼,生成一份新的清单。agent 把它跟自己的预期作比较:

  • 按计划变化了 → 进行下一个动作。
  • 什么都没变 → tap 没点中,或者框选错了;重新瞄准,再试一次。
  • 冒出了意料之外的东西(弹窗、广告、权限请求)→ 那就是新状态而已。agent 读一读,再重新决策一遍 —— 没有脆弱的脚本会因此崩掉。

这套「观察结果,再重新决策」的设计,就是可靠性的全部秘密。PhysiClaw 应对意外的方式跟人一样:看一眼,再试一次。

LOOK 其实有两挡,agent 按需要来挑:

peekscreenshot
来源俯拍相机手机自己的截屏
速度~4s~12s
清晰度对大多数目标够用像素级精准
副作用app 可能会察觉到截屏(分享面板、水印)

peek 是默认选项 —— 快,而且不留痕迹。只有当目标太小、相机分辨不清,或者反光让画面没法读时,agent 才会升级到 screenshot。这种分工为什么存在、视觉流水线又是怎么运转的,都在它如何看见里。