返回博客

Aico Link 滚动工具设计

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) 的运动为例

  1. 计算主运动花费时间:确定主运动时长。时长由移动距离和一个预设的移动速率(默认 2500 单位/秒)换算得出,并且不少于 180ms。本例距离为 300 单位,换算为 120ms,按下限取 180ms。
  2. 终点前预留出两个单位,只考虑 650 到 352。
  3. 控制向手机报告坐标变化,形成 S 型曲线运动,公式为 s(t) = 10t³ − 15t⁴ + 6t⁵。
  4. 慢速尾段:在 100ms 内报告 24 次,匀速移动最后 2 个归一化单位(约 20 单位/秒),让抬手时的速度接近 0。
  5. 抬手。
手势匀速,无尾段只有 S 型曲线S 型曲线 + 尾段
上滑 300ms363–366 px216–445 px0
下滑 300ms364–386 px1–248 px0
上滑 180ms498–515 px567–841 px0
短滑 300ms140–143 px00

iPhone 上通过 HID 注入触控,测试页面为 Safari。表中数值为抬手后内容额外滚动的最大距离(CSS 像素),每种条件重复 3 次。上滑、下滑移动 310 个归一化单位,短滑移动 120 个单位。

可以意识到这里的 S 型曲线是从真实手指控制惯性的滚动中得到的灵感,可以让速度的过渡是连续性的,而真正起作用的是后面 2 像素的尾端收尾。至于完全去掉S型曲线,理论上是可行的。

关于 prompt 的优化

之前项目中有一个难点,对于操作滚动组件时,比如操作系统闹钟设定,是比较困难,容易反复的,在应用了工具改造后,agent 可能有更优的组件操作水平(取决于 agent 的智商),因此需要在 prompt 或者 skill 里给予模型引导。

如图所示,运动起点是滚动组件的边缘,而终点可以是全屏幕,这样就可以单次动作翻越大量数值,提升使用体验。

所以 Aico Link仍然采用”观察、动作、再观察”的循环。消除惯性的意义在于让每次滑动的结果可预测、不跳过内容。

Aiden Agent 硬件正式更名为 Aico Link, 产品介绍与共建指南

Aiden Agent 硬件正式更名为 Aico Link, 产品介绍与共建指南

Meet Aico Link, formerly Aiden Agent hardware. Learn how it works, explore software updates, and join development or beta testing with or without a board.