系统架构
PhysiClaw 硬件采用 CoreXY 运动结构,由两个步进电机驱动 X/Y 平面运动,Z 轴方向则由电磁铁驱动。控制板运行 FluidNC 固件,通过 USB 串口接收电脑端 Python 服务器发来的 G-code 指令,进而控制触控笔的移动与点击。
MCP 工具
Section titled “MCP 工具”MCP 工具对底层硬件进行抽象,向智能体提供一组可直接调用的工具:通过摄像头观察手机屏幕、获取截屏、执行常用操作手势、将文本复制到手机剪贴板等。
| 分组 | 工具 |
|---|---|
| 观察 | peek、screenshot |
| 手势 | tap、double_tap、long_press、swipe |
| 导航 | home_screen、go_back、force_quit |
| 解锁 | unlock_phone |
| 文本 | send_to_clipboard |
| 连续动作 | sequence |
OCR 与图标检测
Section titled “OCR 与图标检测”对摄像头画面和截屏进行 OCR 与图标检测,再将检测结果连同压缩后的图片一并提供给智能体。
图像像素坐标 → 手机屏幕坐标 → 物理平面坐标,整条链路需要两个变换矩阵来完成坐标转换。
每次运行前都需要重新校准,以计算出准确的变换矩阵。
摄像头画面有时会对焦模糊,这时机械臂会点按辅助触控。单击拍下 iOS 截屏,双击调用快捷指令将截屏上传到服务器。全程无需切换页面,效率更高。
用手机键盘打字对人类而言十分自然,但对智能体并不友好。键盘按键小而密集,难以精确定位和点击,且每点击一个按键都需要调用一次大模型,导致效率低下、错误率高,并造成 token 的浪费。
更好的做法是通过快捷指令从电脑端获取文本,写入剪贴板后直接粘贴,既快速又准确。
快捷指令是 iOS 独有的,安卓系统没有原生支持,这也是目前我们选择 iPhone 的原因。
运行时持续执行一个循环,不断检查是否有定时任务到期,或屏幕是否因新通知而点亮,一旦满足条件就唤醒智能体。
唤醒后,智能体解锁手机、读取微信消息,打开对应 App 执行任务,再将结果反馈给用户,最后保存日志并结束对话。
智能体往往需要多轮大模型调用才能完成一项任务,而每一轮都要附上一张手机屏幕的图片供其查看。若没有合适的上下文管理,很快就会触及上下文窗口上限。
压缩上下文。 每次调用大模型时,除了返回要执行的操作,还要附带一段简要描述。只有最近一轮对话保留原始图片,更早的对话则用 OCR 文本替代;随着对话轮次增多,OCR 文本会进一步压缩为每一步的一句话描述。
更新进度。 提示大模型在关键步骤更新任务执行进度,避免在上下文压缩后迷失方向。进度信息附在对话列表末尾,为大模型提供引导。
让缓存稳定命中。 把系统提示词、工具描述、记忆等固定内容放在最前面,并保持逐字节一致;每次压缩上下文时也尽量少改动前面的内容,以减少对缓存的破坏、提高缓存命中率。