Aico Link 滚动工具设计
Aico Link 通过 HDMI 采集手机画面,让 agent “看见”屏幕;再通过 USB HID 模拟触控,像人一样操作屏幕,比如点击某个位置。点击只需要一个坐标,但对于进一步的滑动屏幕操作,手指离开屏幕时往往还带着速度,屏幕会继续惯性滚动一段距离。这对于特定需要精确定位的任务很可能导致 agent 重复反方向滑动或者错过重要的屏幕信息。
主流工具设计
为了解决此问题,可以参考其他主流带 computer-use 工具的 agent 滚动工具设计,目前的主流工具有: OpenAI 的 computer-use 和 Gemini 的 Computer Use(Mobile 环境)。
OpenAI 把滚动和拖动拆成两个动作:scroll 和 drag。scroll 的参数是滚轮的像素增量,drag 是一串鼠标轨迹点,官方参考实现分别用鼠标滚轮和鼠标拖拽来执行。这套设计面向的是桌面和浏览器,而不是原生手机的触控交互。
Gemini 的 Mobile 环境没有单独的滚动动作,对应的是 drag_and_drop。它的参数是起点坐标、终点坐标,以及一个 intent 字段,即模型对这一步意图的自然语言描述,不参与执行。动作由开发者在客户端执行。Google 官方 Android 示例中的实现是一次 adb input swipe,时长固定为 300ms。如果滑动距离较长,这就是一次快速 fling,同样会产生惯性问题。
对 Aico Link来说,从起点精确滚动到终点,并不适合用鼠标滚轮实现,原因是复杂与多样的:首先滚轮的单位是”格”而不是像素。每格滚多远由系统和 App 决定,agent 无法从滚动量推算出实际位移。并且 iPhone 的滚轮支持比较薄弱,没有原生的触摸滚动更好,更重要的是,单纯的鼠标滚动并不能解决屏幕加速度不可控的问题。
猜想与实验
我们用真实手指滑动手机时,其实能很好地控制滚动距离。想大幅滚动又不希望页面继续滑走时,通常会在结尾让手指停顿一下再抬起。那么,模拟触控能不能也在终点停顿一下,来避免惯性呢?
开发中我们发现,这个方法并不能可靠地消除惯性。问题出在”停顿”本身。HID 报告的是坐标,手机系统要根据坐标的变化来估算手指的速度。当我们在终点停住时,坐标不再变化,系统就收不到新的移动样本,于是一直沿用停住前最后估算的速度。等到抬手,系统依然认为手指是高速离开屏幕的,惯性照样触发。
这很奇怪,临时做了一个真机滚动的对比实验,看看真实手指在真机上有意控制屏幕惯性时,像素距离发生了什么变化。
可以看到真实手指在滚动过程中是有速度控制的,虽然有意在终点停留,但让惯性消失的原因其实是终点前的减速行为。当然可以增大 S 型曲线的运动速度,使得运动过程更快。
Aico Link 滚动工具内部设计
首先 HID 无法告诉手机手指速度是多少,他能做的只是每隔一段时间报告一次手指现在的(x, y),而手机会根据相邻两次报告来算速度,因此控制速度的本质就是控制时间与坐标变化。
我们将两个坐标之间的单次运动过程拆成五个阶段:
以坐标 (500, 650) 到 (500, 350) 的运动为例
- 计算主运动花费时间:确定主运动时长。时长由移动距离和一个预设的移动速率(默认 2500 单位/秒)换算得出,并且不少于 180ms。本例距离为 300 单位,换算为 120ms,按下限取 180ms。
- 终点前预留出两个单位,只考虑 650 到 352。
- 控制向手机报告坐标变化,形成 S 型曲线运动,公式为 s(t) = 10t³ − 15t⁴ + 6t⁵。
- 慢速尾段:在 100ms 内报告 24 次,匀速移动最后 2 个归一化单位(约 20 单位/秒),让抬手时的速度接近 0。
- 抬手。
| 手势 | 匀速,无尾段 | 只有 S 型曲线 | S 型曲线 + 尾段 |
| 上滑 300ms | 363–366 px | 216–445 px | 0 |
| 下滑 300ms | 364–386 px | 1–248 px | 0 |
| 上滑 180ms | 498–515 px | 567–841 px | 0 |
| 短滑 300ms | 140–143 px | 0 | 0 |
iPhone 上通过 HID 注入触控,测试页面为 Safari。表中数值为抬手后内容额外滚动的最大距离(CSS 像素),每种条件重复 3 次。上滑、下滑移动 310 个归一化单位,短滑移动 120 个单位。
可以意识到这里的 S 型曲线是从真实手指控制惯性的滚动中得到的灵感,可以让速度的过渡是连续性的,而真正起作用的是后面 2 像素的尾端收尾。至于完全去掉S型曲线,理论上是可行的。
关于 prompt 的优化
之前项目中有一个难点,对于操作滚动组件时,比如操作系统闹钟设定,是比较困难,容易反复的,在应用了工具改造后,agent 可能有更优的组件操作水平(取决于 agent 的智商),因此需要在 prompt 或者 skill 里给予模型引导。
如图所示,运动起点是滚动组件的边缘,而终点可以是全屏幕,这样就可以单次动作翻越大量数值,提升使用体验。
所以 Aico Link仍然采用”观察、动作、再观察”的循环。消除惯性的意义在于让每次滑动的结果可预测、不跳过内容。