从Simon‘s Cat到FRAP:猫咪狂奔的运动规律拆解与行为识别实现 猫咪狂奔记Simons Cat从动画名场面到可落地的行为分析与运动规律拆解养过猫的人一定见过这种画面猫明明上一秒还在安静舔毛下一秒突然瞳孔放大、弓背炸毛像被看不见的东西追着一样满屋狂奔急刹车、跳上沙发、再冲刺、再急停过程持续十几秒甚至几分钟然后若无其事地停下来舔爪子。英文里管这种状态叫 Frenetic Random Activity Periods简写是 FRAP中文圈更习惯叫“猫咪疯跑综合征”或者“电量过载”。如果你看过 Simons Cat会对这个场景格外熟悉。这只由英国动画师 Simon Tofield 创作的黑白猫几乎每一集都会贡献一场让人笑出声的狂奔戏它为了食物狂奔为了躲避吸尘器狂奔为了追鸟狂奔更多时候看起来没有任何理由就是单纯想跑。这个 IP 从 2008 年第一部短片《Cat Man Do》发布至今已经在全球积累了极其庞大的播放量黑白简笔画风格、夸张又自然的神态、精准到帧的节奏感让它成为动画行业内被反复研究的对象。这篇文章想做的事情不是单纯回顾 Simons Cat 有多好笑而是把“猫咪狂奔”当成一个技术样本来拆解为什么 Simons Cat 的猫跑起来那么真实动画师用了哪些运动规律这些规律能不能换成代码语言用来做宠物行为识别、动画程序生成、甚至内容生产的自动化分析如果你正在做宠物科技产品、短视频内容分析、动画工具链或者单纯是好奇“一段动画为什么这么生动”这篇文章会给你一套从原理到代码的完整链路。1. 为什么 Simons Cat 是值得拆解的“技术样本”先把一个误区说清楚很多人以为 Simons Cat 只是“画风可爱的猫片”觉得它的成功靠的是萌是运气是 YouTube 早期红利。但从技术视角看这个判断站不住脚。Simons Cat 是一个产量极高、单集极短、节奏极密的内容产品。它的画面极其简单黑白线条背景几乎都是白色或浅色没有复杂配色没有写实光影角色动作在视觉上占据绝对主导。这意味着什么意味着每集动画的“信息量”几乎全部集中在一个维度上动作。所以它能逼着创作者把动物行为观察力和动画运动规律打磨到极致。猫怎么伸懒腰、怎么踩奶、怎么盯着鸟、怎么从静止状态突然进入狂奔这些细节全部要靠动画师一笔一笔画出来。网络上有人逐帧分析过 Simons Cat 的狂奔段落结果发现它的节奏感完全不亚于迪士尼的经典动画原则有预期、有蓄力、有拉伸、有挤压、有跟随动作、有慢出慢入。换句话说它看起来“真实”不是因为画面写实而是因为运动逻辑和真实猫高度吻合。这才是它值得被技术人研究的地方。真实猫的 FRAP 行为本身是一种凌乱、突然、能量爆发的运动而动画师通过观察把它翻译成了一组可控的运动规则。如果我们可以把这组规则逆向解构就能得到几样很值钱的东西一个用于宠物行为识别的事件模型一组可用于程序化生成卡通动画的运动参数一套内容平台做爆款短视频拆解的分析方法。从材料看Simons Cat 的官方账号、周边图书、电视特辑都在持续产出围绕这只猫的内容生态已经是一个成熟的工业化产品。而工业化产品的背后必然是流程、模板和可复用的方法论。这篇文章要做的就是把“看起来可爱”的表皮剥开看里面的工程结构。2. 核心概念从“猫咪狂奔”到行为序列与动画运动规律要拆解猫咪狂奔先从两个层面入手真实猫的行为和动画里的运动规律。这两个层面共享同一个底层逻辑行为可以被分解成离散的事件状态。2.1 真实猫的 FRAP 行为FRAP 是动物行为学里的术语指动物在没有明确外部刺激的情况下突然爆发式运动。猫的典型表现是突然警觉、竖耳、瞳孔扩张、尾巴膨胀、快速冲刺、跳跃、打滑、短暂停顿、再次冲刺。整个过程通常在 1 到 3 分钟内结束之后猫会迅速恢复平静甚至直接开始舔毛。从技术角度看FRAP 是一个非常适合机器识别的事件类型。它有明确的时间边界开始和结束点、有显著的运动特征加速度、速度、轨迹复杂度都远高于日常行走、有清晰的前置状态从静止或低活动状态突然切换。这些特征一旦量化成数字就可以送入分类模型或规则引擎做自动检测。2.2 动画里的运动规律动画行业有一套经典原则最早由迪士尼动画师总结后来的二维动画、三维动画、游戏动画几乎都在沿用。Simons Cat 虽然是独立动画但它的运动设计完全符合这套体系。这里重点讲四个和“狂奔”直接相关的原则因为它们是让一个动作看起来生动真实的关键。第一个是预期动作。真实猫狂奔之前往往会先压低前身、臀部翘起或者尾巴抽动一下这就是一个“做准备”的姿势。动画里如果没有预期角色直接从静止变成高速运动观众会感觉动作很“突”不自然。预期动作相当于告诉观众接下来要变快了你准备好。第二个是挤压与拉伸。猫在起跳时会先压低身体身体体积被“压扁”然后蹬地的一瞬间身体被拉长这就是挤压与拉伸。它模拟的是身体在受力时的形变。即使画面是二维简笔画只要保留这个形变观众就会觉得身体有质量、有肌肉感。第三个是跟随与重叠。猫高速奔跑时尾巴通常不会和身体完全同步它会在身体加速时拖在后面身体急停时尾巴还会因为惯性向前甩。尾巴和身体的时间差就是跟随动作。重叠动作则更细比如耳朵、肚子、胡须都可能和主躯干错开几帧摆动。这些细节决定了动作的“油润感”。第四个是慢出慢入。动画里的运动不是匀速的而是从慢到快再减速到停。真实猫的四肢蹬地力量有一个从蓄力到释放的过程途中速度不是恒定值。所以动画师会在关键帧之间插入不同的中间帧密度动作两端帧多、中间帧少模拟加速和减速。2.3 从动画帧率到程序思维动画制作中常见的一个技术参数是拍数。传统的 2D 动画按每秒 24 帧播放但并不是每一帧都需要重新画。如果动画师采用“一拍二”那就是每 2 帧才换一张画实际每秒只有 12 张新画“一拍三”则是每 3 帧换一张画每秒 8 张新画。静坐场景常常用一拍二甚至一拍三来节省工作量但狂奔这种高速动作必须接近“一拍一”否则画面会跳、会闪、缺少流畅感。这个参数对做程序化动画的人意义重大。它告诉你动作的“流畅感”不完全取决于渲染帧率而取决于关键帧之间的采样密度。你可以用 60fps 渲染画面但如果动画曲线的关键帧过少、插值方式不对观众照样觉得卡。反过来就算只有 12fps只要关键帧设计和缓动曲线正确画面依然有足够的表现力。Simons Cat 的画面风格本身就是低信息量的简笔画这恰恰让观众更会把注意力集中在运动曲线的质量上。3. 从动画原理到可编程物理技术映射的价值很多做 AI 内容生成、短视频特效、宠物摄像头产品的工程师都想过一个问题能不能把动画师的“手感”变成程序参数让代码自动生成接近手工动画质量的运动这其实是一个成熟的交叉领域。游戏引擎里的动画系统早就在做这件事不管动画师手K的关键帧如何引擎都会有一套插值算法、混合权重和物理模拟来驱动角色躯干、头发、尾巴的跟随运动。Simons Cat 这种 2D 动画没有代码但它的运动参数完全可以映射到程序动画系统里。下面用一张表把动画原则和程序实现做对照动画原则真实猫表现程序化实现思路典型缓动/插值方案预期动作冲刺前压低前身、翘臀为状态机增加 transition 状态控制加速前的起止帧先做一段反向小位移再接正弦加速挤压拉伸起跳时身体压扁拉长对骨骼缩放做非均匀变换Scale 用一个独立的 keyframe 曲线和位移曲线错开跟随重叠急停时尾巴甩过头尾骨链式反向动力学IK或延迟曲线对尾部骨骼使用滞后一阶滤波慢出慢入起步慢、途中快、减速停位移曲线用贝塞尔曲线控制速度变化曲线两端密、中间疏等价于 easeInEaseOut急停打滑高速奔跑后刹停、爪子滑行速度向量做衰减位置在前几帧不立刻归零位移上叠加一个指数衰减的 Slip 偏移从表格能看出来动画师靠画出来的“手感”在程序里其实就是几组曲线、几个状态、几个滤波参数。这也意味着只要能采集到足够多的真实猫运动数据训练一个模型去预测动画参数是完全可行的。Simons Cat 这类高质量动画 IP 的价值在于它给“运动规律”提供了大量经过人工提炼的样本——这些样本不是传感器数据但它们的动作节奏和曲线质量甚至比很多低质量动作捕捉数据更适合用来提取运动先验。所以如果你在做宠物行为识别不要只想着堆视频数据和标注人员。先去看几遍 Simons Cat把猫的典型动作列成行为清单再对应到姿态估计的关键点序列上你的标注模板会更贴近动物的真实运动模式。这个观点是我认为这只动画猫对技术人最大的启发。4. 环境准备用代码追踪和分析“狂奔”动画下面进入实操环节。我们不去复现动画制作流程而是做一个更贴近工程实践的实验从 Simons Cat 的视频片段中提取帧计算运动量找到“狂奔”发生的起止时间并输出一条运动热度曲线。这个过程可以复用到你自己的宠物视频分析项目里。实验环境建议如下版本不写死因为不同的系统、包管理器环境差异很大重点是先跑通流程再锁版本操作系统Windows 10/11、Ubuntu 20.04、macOS 均支持Python3.9 以上即可视频处理FFmpeg用于视频转帧图像处理OpenCVPython 的 opencv-python 包数值计算与可视化NumPy、Matplotlib安装依赖的命令如下pip install numpy opencv-python matplotlibFFmpeg 的安装方式根据系统而异这里给一个 Ubuntu 的示例。macOS 用户可以改用brew install ffmpegWindows 用户建议使用官方 Release 完整包并配置环境变量。sudo apt update sudo apt install -y ffmpeg安装完成后用一条命令验证 FFmpeg 是否可用ffmpeg -version正常情况下你会看到 FFmpeg 的版本号和编译配置信息。如果这一步失败说明 FFmpeg 没有正确安装或没有加入 PATH后续所有拆帧操作都会失败。视频素材方面你自己准备好一段 Simons Cat 的视频文件即可建议选择有典型“狂奔”名场面的片段时长控制在 30 秒到 1 分钟比如猫为了食物在厨房里来回冲刺的桥段。不建议刚开始就用完整剧集因为帧数多、处理慢不方便快速验证。5. 完整示例提取动画帧并量化运动幅度实验目标分三步拆帧、计算相邻帧差异、绘制运动曲线。5.1 用 FFmpeg 拆帧先把视频拆成一帧一帧的图片便于后续用 OpenCV 逐张读取。新建一个工作目录把视频文件放到目录里然后在终端执行mkdir -p frames ffmpeg -i simons_cat.mp4 -vf fps12 frames/frame_%04d.png这里用fps12是因为动画视频本身通常是 24fps 输出但我们要分析的是“运动幅度”而不是逐帧渲染细节12fps 足够捕捉到大部分动作变化同时能减少计算量。如果你的视频是 30fps 或 60fps建议也先统一降采样到 12fps 左右这样后续计算更稳定。运行完成后frames目录下应该生成一组按序号排列的 PNG 文件。用下面的命令确认数量ls frames | wc -l如果输出为 0 或者报错大概率是文件路径写错或者 FFmpeg 没识别到视频编码。可以先用ffprobe simons_cat.mp4查看视频基本信息判断文件是否完整。注意帧和帧之间如果动作太慢导致帧间差异几乎为零不是因为代码有问题而是原始视频中这一段确实没有明显运动。我们下一步就是量化这个差异。5.2 用 OpenCV 计算帧间差异这里写一个完整的 Python 脚本放在工作目录下文件名取motion_analysis.py。# 文件路径motion_analysis.py import cv2 import os import numpy as np def analyze_motion(frames_dir, start1, endNone): 计算连续帧之间的平均绝对差异用于量化视频运动强度。 返回一个列表第 i 个元素表示第 i 帧和 i1 帧之间的差异值。 files sorted([f for f in os.listdir(frames_dir) if f.endswith(.png)]) if end is not None: files files[start:end] else: files files[start:] scores [] prev_gray None for name in files: path os.path.join(frames_dir, name) img cv2.imread(path) if img is None: continue gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray cv2.resize(gray, (320, 180)) # 缩小以加速计算 if prev_gray is not None: diff cv2.absdiff(gray, prev_gray) mean_diff float(diff.mean()) scores.append(mean_diff) prev_gray gray return np.array(scores) if __name__ __main__: scores analyze_motion(frames) # 简单输出前 20 帧的运动量便于快速观察 for i, s in enumerate(scores[:20], start1): print(fFrame {i:4d} - {s:8.3f})这段代码的核心逻辑是读取所有 PNG 帧统一转成灰度图为了加速把每帧缩小到 320x180计算当前帧与上一帧的绝对差取全图平均值数字越大说明这一瞬间画面变化越剧烈。之所以能用这个指标找“狂奔”是因为猫静止舔毛时相邻帧差异会很小而冲刺时身体和四肢大面积位移帧间差异会显著变大。5.3 输出“运动热度曲线”找狂奔峰值段直接打印数字不够直观我们可以把得分绘制成曲线并标记出超过阈值的区间。在同一个文件里补充一个绘图函数。import matplotlib.pyplot as plt def plot_motion(scores, threshold12.0, save_pathmotion_curve.png): plt.figure(figsize(16, 5)) plt.plot(scores, labelframe difference, color#333333) plt.axhline(ythreshold, color#ff6b6b, linestyle--, labelfthreshold{threshold}) plt.xlabel(frame index) plt.ylabel(mean abs diff) plt.title(Simons Cat Motion Intensity Analysis) plt.legend() plt.savefig(save_path, dpi150, bbox_inchestight) print(fcurve saved to {save_path}) if __name__ __main__: scores analyze_motion(frames) plot_motion(scores)运行脚本python motion_analysis.py如果一切正常工作目录下会生成motion_curve.png同时终端会打印出前 20 帧的运动数值。6. 运行结果与效果验证下面的输出是一段典型的 Simons Cat 场景中可能出现的结果用来帮你理解怎么判断实验是否成功。假设你选择的是“猫慢慢走到厨房然后突然加速冲刺”的片段那么拆帧后运行脚本终端可能会输出类似这样的数字Frame 1 - 1.213 Frame 2 - 0.987 Frame 3 - 1.104 Frame 4 - 1.002 Frame 5 - 14.231 Frame 6 - 21.876 Frame 7 - 19.554 Frame 8 - 16.332 Frame 9 - 2.118 Frame 10 - 1.066前 4 帧差异值很低表示猫正在缓慢移动或者画面接近静止第 5 到第 8 帧差异值突然飙升说明发生了快速动作大概率对应冲刺起跑那一瞬间第 9 帧之后恢复低值表示动作结束或又回到低速状态。判断实验成功的标准有三条脚本正常读取并处理了全部帧没有报错输出的 motion_curve.png 里能看到明显的波峰波峰位置和原视频里“狂奔”出现的时间点大致对应。你可以在绘图函数里把阈值调整到合适区间。如果波峰太多说明阈值太低把微小的头部转动也当成运动了如果波峰太少说明阈值太高连真正的冲刺都被过滤掉了。调整阈值的过程就是理解“行为检测”本质的过程不存在一个万能参数不同画风、不同分辨率、不同视频码率都需要重新标定。如果最终结果里完全没有波峰应先检查拆帧出的图片质量。打开frames目录里的文件确认画面不是全黑或全白确认文件确实有变化。还有一种常见情况视频本身是教学讲解画面画面中猫占比很小、背景又复杂帧间差异主要被背景变化占据。这时候就不要用全局帧差异而应该先做猫体检测只计算目标框内的差异。7. 常见问题与排查思路在实际运行中最容易卡住的几个问题整理成表格方便你快速定位问题现象可能原因排查方式解决方案ffmpeg 找不到视频文件文件路径错误或文件名包含特殊字符检查当前目录和文件名使用完整绝对路径把视频放在脚本同目录换成简单英文名frames 目录为空FFmpeg 解码失败执行ffprobe video.mp4查看编码信息先转成 mp4/h264 再拆帧ffmpeg -i input.mkv -c:v libx264 output.mp4帧间差异全部为 0图片读取失败或因 resize 后图像全为黑色单独打印一张图的数组形状和均值检查视频是否真的包含画面用cv2.imshow查看单帧波峰太多区分不了狂奔背景有较大光影变化或标题字幕先做字幕裁剪Crop或者限制检测区域只计算画面主体区域的帧差或先跑一次物体检测波峰太少找不到狂奔阈值设置过高打印前 50 帧的分数分布降低阈值或者改用相对变化率判断视频分辨率太高计算慢每帧读取和 resize 耗时过大检查帧目录数量和图片尺寸先统一 resize 到 320x180 再计算也可用fps12降低总帧数这个表格覆盖了大多数入门实验的报错路径。如果你做的不是 Simons Cat 的帧分析而是自己家里的猫视频大概率遇到的问题会比这个更多因为真实视频有抖动的摄像头、光照变化、家具遮挡。此时要记住一个原则先降低问题复杂度再谈精确率。第一步先固定摄像头、统一时间段、控制光照拿到一条“干净”的数据再逐步引入真实场景的干扰。8. 把“猫咪狂奔”变成产品功能一个最小行为识别系统设计帧间差异分析只是最基础的“运动量”检测。真正想做宠物行为识别产品比如智能摄像头监测猫的 FRAP 事件或者自动剪辑“猫狂奔”精彩片段上传短视频平台这个方案远远不够。但我们可以基于上面的实验设计一个真正可扩展的识别系统。8.1 系统架构从工程角度一个完整的猫咪行为识别系统包含四层采集层摄像头或已有视频文件负责获取原始数据感知层目标检测模型负责在画面中框出猫的位置行为层基于姿态估计或时序模型输出行为类别应用层事件告警、自动剪辑、数据统计。其中感知层和行为层是技术难点。感知层可以用现成的目标检测模型比如 YOLO 系列、MediaPipe 等做猫体检测已有大量预训练权重开发量不大。行为层则需要你结合具体场景定义状态机或训练分类模型。8.2 用状态机描述 FRAP用一个最简状态机来建模猫的行为适合作为产品原型的起点。状态可以分为“静止”、“行走”、“奔跑”、“FRAP”四类。静止运动量低且持续时间长行走运动量中等速度相对稳定奔跑运动量高方向性好持续向前FRAP运动量高且方向随机、包含急停和转向。判断 FRAP 的核心特征不是“快”而是“不规则”。一只猫只是在走廊里狂奔运动量再高也可能只是奔跑真正的 FRAP 会有频繁的转向、突然的停顿、方向不确定性很高。所以状态机里面可以增加角度变化率、速度方差、轨迹弯曲度等指标。下面给出一个简化的 Python 状态机示例只用运动量和角度变化两个特征做判断方便你理解如何从真实视频数据里提取事件边界。# 文件路径frAP_state_machine.py import math import numpy as np class CatBehaviorStateMachine: def __init__(self, high_speed_threshold15.0, angle_change_threshold30.0): self.state idle self.high_speed_threshold high_speed_threshold self.angle_change_threshold angle_change_threshold self.last_angle None self.speed_buffer [] def update(self, speed, direction_angle, timestamp): self.speed_buffer.append(speed) if len(self.speed_buffer) 5: self.speed_buffer.pop(0) speed_mean float(np.mean(self.speed_buffer)) angle_change 0.0 if self.last_angle is not None: angle_diff abs(direction_angle - self.last_angle) % 360 if angle_diff 180: angle_diff 360 - angle_diff angle_change angle_diff self.last_angle direction_angle is_fast speed_mean self.high_speed_threshold is_turning angle_change self.angle_change_threshold if self.state idle: if is_fast: self.state running elif speed_mean 3.0: self.state walking elif self.state walking: if is_fast: self.state running elif speed_mean 1.0: self.state idle elif self.state running: if is_fast and is_turning: self.state frap elif speed_mean 3.0: self.state idle elif self.state frap: if speed_mean 2.0: self.state idle elif not is_turning and speed_mean 5.0: self.state running return self.state这段代码的意义不在于准确识别所有 FRAP 事件而在于给你一个开发思路行为识别不是上来就训练深度学习模型而是先定义可解释的状态划分用基础的运动学特征跑通闭环再考虑用更复杂的模型提高召回率。如果你有真实视频数据可以把第五节里的帧间差异值当作 speed 的近似值把猫的质心坐标变化角度当作 direction_angle然后将两个模块串起来做一个带事件时间戳输出的完整工具。8.3 识别之后做什么识别到 FRAP 事件后产品的下一步动作可以是自动剪辑。比如检测到连续 10 秒高运动量且伴随高频转向就截取这段时间的视频配上背景音乐和文字生成一个“猫发疯时刻”的短视频片段。这个过程可以用 FFmpeg 完成ffmpeg -i simons_cat.mp4 -ss 00:00:02 -t 00:00:05 -c copy frap_clip.mp4这里的-ss是起始时间-t是持续时间。实际系统里这个时间可以通过行为状态机的事件日志自动传入。整体来看宠物行为识别产品的核心难点不在于算法模型多么高级而在于事件定义是否清晰、数据标注是否统一、系统能否在低功耗设备上稳定运行。从 Simons Cat 动画里提炼行为编码本质上就是帮你建立一套更高质量的行文标签体系——这比盲目上模型有效得多。9. 最佳实践与工程建议做完实验和状态机设计下面把实践中容易踩的坑和建议整理一下。9.1 行为识别类产品的数据规范如果你要做猫的行为识别系统第一优先级不是模型而是先制定行为标签规范。FRAP、奔跑、跳跃、打闹这些行为在视频里经常是连续发生的标注者之间的分歧会非常大。建议参考 Simons Cat 的做法先定义什么叫“正常行走”什么叫“狂奔”什么叫“无目的冲刺”给出带起止时间和示例片段的标注文档。只有标签统一模型训练才有意义。9.2 动画制作工具的程序化想象如果你做的是动画工具或程序化内容生成可以尝试把本文提到的缓动曲线、状态机、运动量分析结合起来做一个自动生成“猫狂奔”动画的小工具。输入一段猫的位置轨迹输出一组带挤压拉伸和跟随尾巴的动画参数。这套东西不是科幻游戏引擎的动画蓝图已经很接近了只是很少有人专门为“动物日常行为”做这种参数化模板。9.3 生产环境要关注性能和隐私宠物摄像头产品通常运行在嵌入式设备上算力有限。建议把目标检测模型用轻量化版本比如在端侧跑 Tiny 模型然后把关键帧回传云端做精细行为分析。另外宠物视频往往拍摄于家庭环境涉及用户隐私必须在产品设计中明确数据脱敏、本地处理优先级、用户授权确认等合规流程。这一点不是细节而是产品能不能上线的基本要求。9.4 阈值参数不要拍脑袋运动量阈值、角度变化阈值、状态切换频率参数全部要依赖真实数据来标定。不同画质、不同镜头视野、不同猫的体型、不同房间面积参数都会变化。正确做法是在系统里预留配置接口并设计自动化调参流程同时记录每次识别事件的时间戳和置信度方便后续用人工复核结果迭代阈值。这也是从实验脚本走向工程化必须跨过的一步。9.5 内容创作团队可以参考的动作模板如果你做短视频运营或内容自动化Simons Cat 的节奏本身就是一套模板安静铺垫制造期待到突然爆发情绪高潮再到平静反萌情绪回落。用程序拆解自己的视频素材在时间轴上定位运动强度曲线找到符合这种节奏的片段再自动生成剪辑点完全可以复用本文中的运动分析代码。这里的关键不是技术多难而是你能不能用曲线的“形态”去匹配“内容的情绪变化”。10. 总结与后续方向这篇文章从 Simons Cat 这只“狂奔的猫”出发拆开了三层东西第一层是动画运动规律包括预期、挤压拉伸、跟随重叠、慢出慢入这些概念解释了为什么简笔画猫看起来如此生动第二层是技术化的分析方法用 FFmpeg 拆帧、OpenCV 计算帧间差异、Matplotlib 画运动曲线把一段动画转换成可量化的数据第三层是行为识别产品的落地路径从状态机建模到自动剪辑再到生产环境里的性能、隐私和参数调优问题。如果你只记住一句话我希望是这句Simons Cat 的成功不是偶然它是把真实猫的行为观察翻译成运动规则的成功而你在自己的技术产品里同样可以把这种“观察 - 编码 - 复现”的方法论用起来。下一步找一段猫发疯的视频拆帧、跑一遍运动分析看看你家的猫在哪个时间点完成了一次标准的 FRAP。把这条基线数据留在手里你会发现之前很多模糊的产品需求突然就变成了一张清晰的参数表。