---
title: 系统架构
description: 一个「点那个按钮」的决策，是怎样一步步变成触控笔落在玻璃上的——自底向上，从 FluidNC 主板讲到运行时循环，以及它如何把上下文压到最省。
---

## 硬件

PhysiClaw 硬件采用 [CoreXY](https://corexy.com/) 传动方式，由两个步进电机驱动 X/Y 平面运动，Z 轴方向则由电磁铁驱动。控制板运行 [FluidNC](https://github.com/bdring/FluidNC) 固件，通过 USB 串口接收电脑端 Python 服务器发来的 [G-code](https://zh.wikipedia.org/wiki/G代码) 指令，进而控制触控笔的移动与点击。

## MCP 工具

MCP 工具对底层硬件进行抽象，向智能体提供一组可直接调用的工具：通过摄像头观察手机屏幕、获取截屏、执行常用操作手势、将文本复制到手机剪贴板等。

| 分组 | 工具 |
| --- | --- |
| 观察 | `peek`、`screenshot` |
| 手势 | `tap`、`double_tap`、`long_press`、`swipe` |
| 导航 | `home_screen`、`go_back`、`force_quit` |
| 解锁 | `unlock_phone` |
| 文本 | `send_to_clipboard` |
| 连续动作 | `sequence` |

### OCR 与图标检测

对摄像头画面和截屏进行 OCR 与图标检测，再将检测结果连同压缩后的图片一并提供给智能体。

### 坐标映射

图像像素坐标 → 手机屏幕坐标 → 物理平面坐标，整条链路需要两个变换矩阵来完成坐标转换。

每次运行前都需要重新校准，以计算出准确的变换矩阵。

### 截图

摄像头画面有时会对焦模糊。这时机械臂会点按辅助触控：单击拍下 iOS 截屏，双击调用快捷指令将截屏上传到服务器——全程无需切换页面，效率更高。

### 输入文字

用手机键盘打字对人类而言十分自然，但对智能体并不友好：键盘按键小而密集，难以精确定位和点击，且每点击一个按键都需要调用一次大模型，导致效率低下、错误率高，并造成 token 的浪费。

更好的做法是通过快捷指令从电脑端获取文本，写入剪贴板后直接粘贴，既快速又准确。

快捷指令是 iOS 独有的——安卓系统没有原生支持，这也是目前我们选择 iPhone 的原因。

## 运行时循环

运行时持续执行一个循环，不断检查是否有定时任务到期、或屏幕是否因新消息而点亮，一旦满足条件就唤醒智能体。

唤醒后，智能体解锁手机、读取微信消息，打开对应 App 执行任务，再将结果反馈给用户，最后保存日志并结束对话。

## 上下文管理

智能体往往需要多轮大模型调用才能完成一项任务，而每一轮都要附上一张手机屏幕的图片供其查看。若没有合适的上下文管理，很快就会触及上下文窗口上限。

**压缩上下文。** 每次调用大模型时，除了返回要执行的操作，还要附带一段简要描述。只有最近一轮对话保留原始图片，更早的对话则用 OCR 文本替代；随着对话轮次增多，OCR 文本会进一步压缩为每一步的简要描述。

**更新进度。** 提示大模型在关键步骤更新任务执行进度，避免在上下文压缩后迷失方向。进度信息附在对话列表末尾，为大模型提供引导。

**让缓存稳定命中。** 把系统提示词、工具描述、记忆等固定内容放在最前面，并保持逐字节一致；每次压缩上下文时也尽量少改动前面的内容，以减少对缓存的破坏、提高缓存命中率。
