Pose CLI 文档
面向运动科学家的开源运动分析工具包。使用 20+ 内置工具分析 3D 骨骼数据,或构建你自己的工具 — 全部在本地机器上运行。
概览
Pose CLI 将原始 3D 人体骨骼数据(来自 ARKit 或任何姿态估计系统)转化为可实践的运动分析报告。它完全在你的机器上运行:你的数据永远不会离开你的电脑。
获取方式:Pose CLI 通过 PyPI 分发。详见安装指南。
Pose Coach 录制 → JointData3D CSV → Pose CLI → JSON 输出
│
├── stats
├── detect_peak_energy
├── segment_motion_phases
├── detect_velocity
├── detect_action_boundaries
├── detect_highlight
├── annotate (web UI)
└── ... 超过 15 个工具
内置轻量后端
Pose CLI 内置 pose serve — 一个零配置的本地服务器,将你的电脑变为 Pose Coach iOS App 的开发后端:
pose serve # → http://0.0.0.0:8000 # → LAN → http://192.168.1.x:8000 (在 iPhone 上配置此地址)
运行前需先安装 pip install 'pose-platform[server]'(fastapi + uvicorn)。详见安装指南 →
在 iPhone 上录制 → 骨骼文件自动到达你的电脑。分析、AI 教练对话、训练计划和综合报告全部通过同一本地服务器运行。Pose Coach iOS App 将 pose serve 作为全功能后端连接。无需数据库、无需云端。配置指南 →
数据如何到达 Pose CLI
三种将录制数据从 iPhone(Pose Coach)传输到电脑的方式:
路径 A — 手动传输(零配置,始终可用)
iPhone 录制 → 文件 App → iCloud Drive 或 AirDrop → 电脑 → pose analyze ✅ 全区域可用 ✅ 完整会话文件夹(视频 + 骨骼 + 附属文件) ⚠ 每次手动操作 • iCloud Drive:通过文件 App 导出文件夹 → 通过 iCloud 同步到电脑 • AirDrop:导出全部数据 → ZIP 包含所有会话文件,直接发送(仅 Mac)
路径 B — 本地后端(一个命令,自动上传)
iPhone 录制 → 你的电脑(WiFi, pose serve)→ pose analyze ✅ 全区域可用 ✅ 自动上传 + 分析 + 对话 🔧 pip install pose-platform[server,llm] (需要 TestFlight 版本 — 设置中的 研究者后端)
路径 C — 云端后端(仅限美国/欧洲)
iPhone 录制 → Staging API(自动上传)→ pose data seed-session → 电脑 → pose analyze ✅ 全自动化 ❌ 中国不可用 ⚠ 不含 .mov 视频
| 路径 | 配置 | 网络 | 区域 | 获得内容 |
|---|---|---|---|---|
| A. 手动传输 | 无需 | iCloud 或 AirDrop | 全部 | 完整会话(视频 + 骨骼 + 附属文件) |
| B. 本地后端 | pose serve | 同一 WiFi | 全部 | 骨骼 + 附属文件(每次录制自动) |
| C. Staging | 后端访问权限 | 互联网(美国/欧洲) | 仅美国/欧洲 | 骨骼 + 附属文件(每次录制自动) |
推荐:首次录制使用AirDrop(路径 A)— 即时传输,无需配置。频繁录制时,一个命令即可配置路径 B:pose serve。完整本地后端配置指南 →
为未支持运动录制
如果你想分析 Pose Coach 尚未正式支持的运动(如篮球、高尔夫、网球):
- 打开 Pose Coach → 选择 Freeplay 作为运动
- 正常录制 — 你会获得完整的 3D 骨骼数据
- 将数据传输到电脑(使用上述路径 A 或 B)
- 使用 Pose CLI 的通用工具(
stats、segment_motion_phases、detect_action_boundaries、detect_highlight)进行分析 - 在此基础上构建运动专项工具 — 参见贡献指南
适用人群
| 角色 | 可做的事 |
|---|---|
| 运动科学家 / 研究员 | 分析运动数据、发表论文、构建新的分析工具 |
| 教练 / 表现分析师 | 评估技术动作、追踪进步、对比运动员 |
| 运动科学学生 | 通过动手分析数据学习生物力学 |
| 开发者 / 实验室 | 构建自定义工具、集成到现有数据处理流程 |
运动即插件
Pose CLI 使用 Python entry_points 自动发现运动包。内置运动(freeplay、sprint)随基础安装提供。额外运动以独立 pip 包形式安装:
# 内置(始终可用) pose version # → sports: freeplay, sprint # 安装羽毛球 — 由羽毛球研究者维护的独立包 pip install pose-platform[badminton] # → 安装 pose-sport-badminton(v1.13.4,8 个工具) # 或直接安装运动包 pip install pose-sport-badminton # 创建你自己的运动包 pose sports create basketball # → 生成 sports/basketball/ 脚手架及示例工具 # → pip install -e sports/basketball # → pose tools --sport basketball # 列出已安装的运动 pose sports
| 运动 | 包 | 安装 |
|---|---|---|
| freeplay | 内置 | 默认 |
| sprint | 内置 | 默认 |
| badminton | pose-sport-badminton | pip install pose-platform[badminton] |
| basketball(模板) | 通过 pose sports create 创建 | pip install -e sports/basketball |
| 你的运动 | 你的包 | pip install pose-sport-<名称> |
面向研究者:运动包是由领域专家维护的独立 PyPI 包。每个包有自己的版本、发布周期和维护者。参见贡献指南 →
Web 标注工具
在浏览器中交互式标注录制数据,视频与 2D 骨骼叠加同步显示:
pose annotate serve data/session.csv # → 自动打开 http://localhost:8001
在时间轴上拖拽即可标记动作(短跑阶段、挥拍、投篮)。标注数据可作为校准和算法验证的标准答案。
前提条件
Web 标注工具需要骨骼 CSV 和原始视频文件(.mov)。视频通过 iCloud Drive 或 AirDrop(路径 A)传输时包含,但本地后端和 Staging(路径 B/C)不包含视频。
界面
- 左侧面板:视频播放器 + 2D 骨骼叠加(15 根骨骼,21 个关节)+ 播放控制
- 右侧面板:标注列表 + 创建表单(起止时间、标签、质量、备注)
CLI 命令
# 创建标注 pose annotate create data/session.csv --start 2.3 --end 3.1 --label "sprint_drive" # 列出所有标注 pose annotate list data/session.csv # 打开 Web 标注界面 pose annotate serve data/session.csv
校准工作流
- 标注录制数据(Web 或 CLI)—
pose annotate serve - 自动评分已标注动作 —
pose calib auto-label - 人工审查并修正评分(专家审核)
- 验证工具一致性 —
pose calib validate
核心原则
- 数据本地化。所有分析在你的机器上运行。无需上传到云端。
- 内置本地后端。
pose serve提供完整的开发后端 — iPhone 自动上传、分析和 AI 对话全部在本地运行。 - 一次编写,全平台使用。构建一个工具 — 即可在 CLI、Pose Coach 应用或你的自定义应用中使用。
- 可扩展设计。每个工具都是一个 Python 类。编写你自己的,注册后即可随处使用。
- 内置缓存。分析结果自动缓存。重复运行同一文件 → 即时返回结果。
快速入门 — 5 分钟
从零到完成首次分析。
第一步:安装
pip install pose-platform pose version
第二步:获取示例数据
Pose CLI 内置了短跑示例录制数据 — 无需下载:
pose sample # → sample_sprint.csv 已复制到当前目录(438 KB)
第三步:运行首次分析
pose analyze sample_sprint.csv --tool stats
你将看到一份 JSON 报告,包含录制时长、帧率、关节数量、抖动比、数据质量评估以及每个关节的统计信息。
data_quality: "good"— 追踪质量可靠tracking_coverage: 0.98— 98% 的帧有有效骨骼数据jitter_ratio < 0.1— 稳定性极佳
第四步:尝试更多工具
# 找出运动片段(短跑 vs 站立)
pose analyze sample_sprint.csv --tool segment_motion_phases
# 检测速度峰值
pose analyze sample_sprint.csv --tool detect_velocity --param joint=body_position
# 提取高光时刻
pose analyze sample_sprint.csv --tool detect_highlight --param sport_id=sprint
# 使用运动员档案测量短跑速度
pose analyze sample_sprint.csv --tool measure_running_speed \
--param age=16 --param gender=male --param region=cn
第五步:使用你自己的数据
pose analyze /path/to/your/data.csv --tool stats
将 pose analyze 指向你自己的 JointData3D CSV 文件。参见数据格式了解如何从其他姿态估计系统准备数据。
第六步:用 Pose Coach 录制你自己的数据
获取 JointData3D 文件最简单的方式是用 Pose Coach iOS App 录制。
使用 Windows?直接跳到下方的"自动上传" — pose serve 原生支持 Windows,完全无需用到 AirDrop。
快速上手(无需配置):
- 通过 TestFlight 安装 Pose Coach(联系我们获取邀请链接)
- 录制一个会话 — 选择 Freeplay 作为运动
- 传输数据到电脑:
- AirDrop(最快,仅限 macOS — Windows 没有 AirDrop 客户端):回放菜单 → 导出全部数据 → AirDrop 到你的 Mac
- iCloud Drive(Windows 也可用):点击导出 → 保存到文件 → iCloud Drive → 在 Microsoft Store 安装 iCloud for Windows,用同一个 Apple ID 登录,然后在同步的本地文件夹中取出文件
- 对
_3d.csv文件运行pose analyze
自动上传(一个命令,Windows 推荐):
- 安装服务端扩展:
pip install 'pose-platform[server,llm]'
- 启动本地后端:
pose serve # → LAN → http://192.168.1.x:8000
- 在 Pose Coach 设置 → 研究者后端 → 自定义 URL → 输入你电脑的局域网 IP
- 开始录制 — 骨骼文件自动到达你的
pose-data/目录 - 分析和 AI 教练对话直接在 App 内运行(路由到你的本地服务器)
安装指南
系统要求
| 依赖项 | 最低版本 | 推荐版本 |
|---|---|---|
| Python | 3.10 | 3.12+ |
| pip | 22.0 | 24.0+ |
| 操作系统 | macOS 12+ / Linux (glibc 2.28+) / Windows WSL2 | |
| 磁盘空间 | 约 500 MB(含依赖) | |
方式一:pip(推荐)
pip install pose-platform pose version
方式二:从源码安装(适用于工具开发者)
git clone https://github.com/posecap/pose-platform.git cd pose-platform pip install -e .
-e 参数表示"可编辑"模式 — 源码修改立即生效。
方式三:虚拟环境(干净隔离)
python3 -m venv pose-env source pose-env/bin/activate # macOS / Linux # pose-env\Scripts\activate # Windows pip install pose-platform
可选依赖
# 运动包 — 安装专项运动分析工具 pip install 'pose-platform[badminton]' # 羽毛球:挥拍检测、击球分类、评分 # pip install 'pose-platform[basketball]' # 篮球(即将推出) # 全部运动 pip install 'pose-platform[all-sports]' # 本地后端 (pose serve) — 接收 iPhone 上传 + 运行分析服务器 pip install 'pose-platform[server]' # LLM 对话 (pose chat) — 三种模式可选 pip install 'pose-platform[llm]' # REPL 模式(openai SDK) pip install 'pose-platform[mcp]' # Claude Code 模式(mcp SDK, >=1.0,<2.0) # 全部 — 所有运动 + 后端 + AI 对话 pip install 'pose-platform[all]' # Claude Code 前端(可选,用于 --mode claude / --mode claude-ds) npm install -g @anthropic-ai/claude-code
| Extra | 包含 | 用途 |
|---|---|---|
| [badminton] | pose-sport-badminton | 羽毛球分析 |
| [all-sports] | 所有运动包 | 多运动研究 |
| [server] | fastapi, uvicorn, python-multipart | pose serve |
| [llm] | openai, anthropic | pose chat、pose serve /chat |
| [mcp] | mcp>=1.0,<2.0 | pose chat --mode claude / --mode claude-ds |
| [all] | all-sports + server + llm | 完整安装 |
常见问题排查
pip: command not found
python3 -m ensurepip --upgrade
error: externally-managed-environment(macOS Homebrew Python)
使用虚拟环境(方式三)或:
pip install --break-system-packages pose-platform
pip 安装后 pose: command not found
# 添加到 ~/.zshrc 或 ~/.bashrc
export PATH="$HOME/.local/bin:$PATH"
# Windows(原生安装)— 先找到 Scripts 目录:
python -c "import sysconfig; print(sysconfig.get_path('scripts'))"
# → 例如 C:\Users\you\AppData\Roaming\Python\Python312\Scripts
# 将该目录加入 PATH(系统属性 → 环境变量),然后重启终端。
# 任何系统上的替代方案 — 不通过 pose 命令运行
python3 -m products.pose_cli.cli version # Windows 上用 python
Apple Silicon(M1/M2/M3)
平台原生支持 ARM 架构。验证:
python3 -c "import platform; print(platform.machine())" # 应输出:arm64
Windows
推荐使用 WSL2。原生 Windows 也可以 —— 若 pip 安装后 pose 命令不存在,请按上一条将 Python 的 Scripts 目录加入 PATH。
wsl --install wsl # 然后按上述 Linux 方式操作
pose chat 启动后提示 "HTTP API key not set" 退出
pose chat 需要 openai 包和 API key:
pip install openai>=1.50 echo 'POSE_DEEPSEEK_API_KEY=sk-xxx' > .env # 免费注册:platform.deepseek.com pose chat
数据格式 — JointData3D
这是使用 Pose CLI 之前需要理解的最重要概念。每个工具都读取 JointData3D CSV 文件。
⚠️ 重要:理解世界坐标与模型坐标的区别对于正确分析至关重要。详见下文。
12 列格式
Pose CLI 接受无表头的 CSV 文件。每行代表一个时间戳上的一个关节。
timestamp, joint, wx, wy, wz, mx, my, mz, ldq_x, ldq_y, ldq_z, ldq_w
| # | 列名 | 类型 | 说明 |
|---|---|---|---|
| 1 | timestamp | float | 自录制开始的秒数 |
| 2 | joint | int 或 string | 关节标识符(名称或索引) |
| 3–5 | wx, wy, wz | float | 世界坐标(ARKit 世界锚点坐标) |
| 6–8 | mx, my, mz | float | 模型坐标(相对于身体质心) |
| 9–12 | ldq_x … ldq_w | float | 局部旋转四元数(x, y, z, w) |
世界坐标 vs. 模型坐标
| 坐标系统 | 来源 | 适用场景 | 稳定性 |
|---|---|---|---|
| wx, wy, wz | ARKit 世界锚点 | 绝对场地位置、热力图 | ⚠️ 跨会话可能漂移 |
| mx, my, mz | 身体质心相对坐标 | 关节角度、相对运动、技术分析 | ✅ 单次会话内稳定 |
经验法则:所有生物力学分析都使用模型坐标(mx/my/mz)。所有内置工具默认使用模型坐标。
数据质量检查清单
jitter_ratio< 0.3(运行pose analyze data.csv --tool stats)tracking_coverage> 0.5(大部分录制时间骨骼被追踪到)- 录制距离 2–8 米(ARKit 最佳范围)
- 全身可见(未被物体或其他人遮挡)
- 画面中仅一人(ARKit 只能追踪一个身体)
- 设备保持静止(建议使用三脚架)
从其他系统准备数据
如果你使用 OpenPose、MediaPipe、BlazePose 或动作捕捉系统,请将数据转换为 12 列格式。关键要求:
- 时间戳:单调递增,自起始秒数
- 关节顺序:必须匹配 19 关节 ARKit 人体骨骼(或使用字符串名称)
- 模型坐标:如不可用,设为与世界坐标相同(部分工具精度会降低)
- 四元数:如不可用,设为
ldq_x=0, ldq_y=0, ldq_z=0, ldq_w=1(单位四元数)
import numpy as np
# 你的数据:timestamps (T,), joint_names 列表, world_positions (T, J, 3)
for t_idx, t in enumerate(timestamps):
for j_idx, jname in enumerate(joint_names):
wx, wy, wz = world_positions[t_idx, j_idx]
mx, my, mz = world_positions[t_idx, j_idx] # 或计算模型坐标
# 单位四元数:无旋转数据
print(f"{t},{jname},{wx},{wy},{wz},{mx},{my},{mz},0,0,0,1")
CLI 命令参考
所有命令在本地运行。分析命令无需网络连接。
pose analyze
对 JointData3D CSV 文件运行分析工具。
pose analyze <file.csv> [--tool <name>] [--no-cache] [--param KEY=VALUE ...]
| 选项 | 说明 |
|---|---|
| <file.csv> | JointData3D CSV 文件路径(必填) |
| --tool <name> | 要运行的工具(默认:stats) |
| --no-cache | 跳过缓存,强制重新计算 |
| --param KEY=VALUE | 向工具传递参数(可重复使用)。自动检测类型 |
| --env <env> | 后端环境:local、staging 或 prod(默认:自动检测) |
| --subject-id <ID> | 用于训练计划停滞检测(需要 POSE_API_TOKEN) |
# 基本分析
pose analyze data/session.csv
# 指定工具
pose analyze data/session.csv --tool detect_peak_energy
# 带参数
pose analyze data/session.csv --tool measure_running_speed \
--param age=16 --param gender=male --param region=cn
# 强制重新计算
pose analyze data/session.csv --tool stats --no-cache
pose tools
列出所有已注册的工具,含版本号。
pose tools # 简洁表格:名称、版本、状态、运动、描述 pose tools --detail # 每个工具的完整参数详情 pose tools --sport <id> # 按运动筛选(如 badminton、sprint)
pose sample
将内置的示例数据文件(sample_sprint.csv)复制到当前目录。无需网络 — 示例文件已包含在 pip 包中。
pose sample # → 示例数据已复制到当前目录(438 KB) # → 下一步:pose analyze sample_sprint.csv --tool stats
pose sports
管理运动:列出已安装的运动、添加自定义运动或创建新的运动包。
pose sports list # 内置 + 已安装运动包(默认) pose sports add <id> # 添加自定义运动(写入 .pose/config.json) pose sports remove <id> # 移除自定义运动 pose sports create <id> # 生成新的运动包脚手架
安装运动包:额外运动以独立 pip 包形式分发。通过 pip extras 或直接安装:
pip install pose-platform[badminton] # 或 pip install pose-sport-badminton
创建新运动:使用 pose sports create 生成脚手架,然后以可编辑模式安装:
pose sports create basketball # → 生成 sports/basketball/ 含 pyproject.toml、示例工具、测试 pip install -e sports/basketball pose tools --sport basketball
pose gaps
管理能力缺口登记 — 本地追踪功能请求与工具构想。
pose gaps list # 活跃的缺口 pose gaps list --all-statuses # 全部包括已解决的 pose gaps submit "<title>" # 登记新的缺口 pose gaps show <gap_id> # 查看缺口详情及临时实现 pose gaps summary # 统计摘要
pose cache
管理分析结果缓存。当源文件或工具版本变更时缓存自动失效。
pose cache list # 所有缓存条目 pose cache clear # 清空全部缓存 pose cache clear <file.csv> # 清空特定文件的缓存
pose version
显示版本信息 — 动态检测已安装的运动包。
pose version # 平台 + 已安装运动 pose version --changelog # 技术更新日志(CHANGELOG.md) pose version --release-notes # 面向用户的发布说明
示例输出:
{
"platform": "1.25.10",
"sports": {
"freeplay": {"version": "1.25.10", "builtin": true},
"sprint": {"version": "1.25.10", "builtin": true},
"badminton": {"version": "1.13.4", "builtin": false, "tools_count": 8}
}
}
pose chat
启动交互式 LLM 分析会话。需要 [llm] 扩展(pip install openai)和 API key。配置方式见LLM 对话。
pose chat [data_dir] # 默认数据目录:../pose-data
pose annotate
创建、列出和删除录制的标注。也可启动 Web 标注界面。
pose annotate create <file.csv> --start <s> --end <s> --label <名称>
[--peak_s <s>] [--hand left|right]
[--quality good|acceptable|poor] [--note "备注"]
pose annotate list <file.csv>
pose annotate delete <file.csv> <标注ID>
pose annotate serve <file.csv> # Web 标注界面
pose calib
评分校准工作流 — 将工具评分与专家标注进行对比,验证算法准确性。
pose calib auto-label # 自动评分已标注动作 pose calib validate # 对比专家标注验证工具一致性
| 指标 | 说明 |
|---|---|
| MAE | 工具评分与专家标注之间的平均绝对误差 |
| Spearman ρ | 排名相关性 — 工具保留正确排序的程度 |
| 等级一致性 | 工具等级与专家等级一致的比例(±1 个字母容差) |
pose feedback
提交和管理反馈 — 包括 bug 报告、功能请求和工具改进建议。
pose feedback list # 列出所有反馈 pose feedback stats # 统计摘要 pose feedback resolve <id> # 标记为已解决 pose feedback dismiss <id> # 带原因驳回
pose telemetry
pose telemetry stats # 今日统计 pose telemetry stats --since 7d # 最近 7 天 pose telemetry stats --since 24h # 最近 24 小时
pose data
管理本地数据文件。
pose data delete <file> [--yes] [--dry-run]
工具参考
Pose CLI 拥有 20+ 内置工具。以下是三个主要的通用工具。运动专项工具文档见完整仓库。
stats
稳定 Tier 1 · 全运动 · 自 v1.4.0计算 JointData3D 录制的综合统计信息。任何新数据都应先运行此工具 — 它是你的数据质量报告卡。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| path | string | — | JointData3D CSV 文件路径 |
| video_duration_s | float | (自动) | 手动指定录制时长 |
关键输出字段
| 字段 | 说明 |
|---|---|
| recording_duration_s | 总录制时长 |
| tracking_coverage | 有效骨骼帧占比(< 0.5 = 差) |
| jitter_ratio | 高抖动帧占比(< 0.1 = 好,> 0.3 = 差) |
| data_quality | 综合评定:"good"、"acceptable" 或 "poor" |
| per_joint.<name>.motion_std | 模型坐标运动标准差 |
pose analyze data/session.csv --tool stats
detect_action_boundaries
稳定 Tier 1 · 全运动 · 自 v1.1.0使用全身能量分析检测动作边界 — 离散运动的开始、峰值和结束。无需针对特定运动调参即可工作。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| onset_energy_ratio | float | 0.01 | 动作起始的能量阈值比例 |
| max_filter_win_s | float | 1.0 | 最大能量平滑窗口 |
| prominence | float | 0.1 | 最小峰值显著性 |
| min_action_duration_s | float | 0.2 | 最短动作持续时间 |
| min_peak_gap_s | float | 0.5 | 检测动作之间的最短间隔 |
输出字段
| 字段 | 说明 |
|---|---|
| actions[].start_s | 动作起始 — 身体能量开始上升的时刻 |
| actions[].peak_s | 最大能量时刻 |
| actions[].end_s | 动作结束 — 能量回归基线 |
| actions[].peak_energy | 峰值归一化能量(1.0 = 录制中的最大值) |
| actions[].duration_s | 动作总持续时间 |
# 篮球 — 找出跳跃、投篮、突破
pose analyze data/basketball_play.csv --tool detect_action_boundaries \
--param min_action_duration_s=0.2 --param min_peak_gap_s=0.3
# 短跑 — 找出发力阶段
pose analyze data/sprint_100m.csv --tool detect_action_boundaries \
--param onset_energy_ratio=0.01
何时使用此工具而非运动专项工具:探索新数据或分析未支持的运动时使用 detect_action_boundaries。需要动作分类(扣杀 vs 高远球、跳投 vs 上篮)时使用运动专项工具。
segment_motion_phases
稳定 Tier 1 · 全运动 · 自 v1.5.0将录制分解为三个层级:在场片段、运动/静止片段和暂停。是理解训练节奏的基础工具。
参数
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| presence_gap_s | float | 1.0 | 拆分在场片段的最大时间戳间隔 |
| static_threshold | float | 0.03 | 判定为静止的能量阈值 |
| min_static_ms | int | 500 | 有效静止片段的最短时长 |
| min_motion_ms | int | 300 | 有效运动片段的最短时长 |
| pause_prominence | float | 0.5 | 运动片段内检测暂停的灵敏度 |
| energy_filter | string | "mean" | "mean" 或 "max" — 平滑滤波器 |
| max_filter_win_s | float | 1.0 | 能量滤波窗口大小 |
| motion_trailing_pad_s | float | 0.3 | 运动片段尾部额外填充(覆盖随挥动作) |
输出字段
| 字段 | 说明 |
|---|---|
| presence_segments | 画面中有人物的连续时间段 |
| motion_segments | 活动时间段(挥拍、跑步、跳跃) |
| static_segments | 静止时间段(站立、等待) |
| pauses | 活动片段内的短暂停顿 |
| summary.motion_ratio | 在场时间中运动所占比例 |
pose analyze data/basketball_drill.csv --tool segment_motion_phases
使用建议:爆发性运动(短跑、篮球突破)使用 energy_filter="max"。默认 "mean" 适合持续运动。结合 detect_action_boundaries 可在运动片段中定位具体动作峰值。
环境变量
分析与数据
| 变量 | 默认值 | 说明 |
|---|---|---|
| POSE_DATA_DIR | ../pose-data | 数据文件目录 |
| POSE_ENABLE_WIP_TOOLS | 0 | 设为 1 以启用在研工具 |
| POSE_PLATFORM_SPORTS | (空) | 额外平台运动。格式:badminton:v1.0.0,fitness:v1.13.0。在 Pose Coach 后端设置以暴露 CLI 基准之外的运动 |
LLM 提供商(用于 pose chat)
| 变量 | 提供商 | 说明 |
|---|---|---|
| ANTHROPIC_API_KEY | Claude(Anthropic) | API key 来自 console.anthropic.com |
| POSE_DEEPSEEK_API_KEY | DeepSeek | API key 来自 platform.deepseek.com(免费额度可用) |
| POSE_DEEPSEEK_API_ENDPOINT | DeepSeek | 覆盖 Base URL(默认:https://api.deepseek.com) |
| POSE_CN_API_KEY | Qwen(DashScope) | API key 来自 dashscope.aliyun.com |
| POSE_CN_API_ENDPOINT | Qwen(DashScope) | 覆盖 Base URL。国际访问使用 https://dashscope-intl.aliyuncs.com/compatible-mode/v1 |
对话模式
| 变量 | 默认值 | 说明 |
|---|---|---|
| POSE_CHAT_MODE | repl | 对话前端模式:repl(内置 + DeepSeek)、claude(Claude Code + Claude)、claude-ds(Claude Code + DeepSeek)。CLI --mode 参数可覆盖 |
区域与语言
| 变量 | 默认值 | 说明 |
|---|---|---|
| POSE_REGION | us | LLM 路由区域:us、eu、cn 或 cloud |
| POSE_LANG | (自动检测) | 输出语言。未设置时从 LANG/LC_ALL 自动检测 |
缓存机制
Pose CLI 缓存工具结果以避免重复计算相同分析。缓存键为:文件标识(mtime + size)+ 工具名称 + 工具版本。
缓存失效
源文件变更(mtime/size)或 pose-manifest.json 中工具版本变更时,缓存自动失效。工具升级后旧缓存自动作废。
缓存命令
pose cache list # 所有缓存条目 pose cache clear # 清空全部缓存 pose cache clear <file.csv> # 清空特定文件的缓存
跳过缓存:pose analyze data.csv --tool stats --no-cache。命中缓存时 CLI 输出 [CACHE HIT]。
CI/CD 集成
在 CI 流水线中缓存 .pose/cache/ 目录。以 pose-manifest.json 的哈希值作为缓存键可在工具版本升级时正确失效。
LLM 驱动的分析(pose chat)
Pose CLI 包含 AI 对话模式,让你用自然语言询问数据问题。默认使用 DeepSeek — 免费额度,邮箱注册,全球可用。
快速配置
安装 LLM 扩展并创建 .env 文件 — Pose CLI 自动加载。无需 export、无需 source。
pip install 'pose-platform[llm]' echo 'POSE_DEEPSEEK_API_KEY=sk-xxx' > .env pose chat
在 platform.deepseek.com 免费注册获取 DeepSeek API key。
提供商配置
DeepSeek(默认)
免费额度,邮箱注册,全球可用。
echo 'POSE_DEEPSEEK_API_KEY=sk-xxx' > .env pose chat
Claude(最佳分析质量)
需要 Anthropic API key。可选安装 Claude Code CLI shell。
export ANTHROPIC_API_KEY=sk-ant-... pose chat
Claude Code shell(可选):npm install -g @anthropic-ai/claude-code
Qwen / DashScope(中文优化)
export POSE_REGION=cn export POSE_CN_API_KEY=sk-xxx pose chat
对话模式
pose chat 支持三种前端模式。通过 --mode 参数或 POSE_CHAT_MODE 环境变量切换。
| 模式 | 前端 | 后端 | 安装 |
|---|---|---|---|
| repl | 内置 REPL | DeepSeek | [llm] + key |
| claude | Claude Code CLI | Claude 原生 | Claude Code + [mcp] |
| claude-ds | Claude Code CLI | DeepSeek | Claude Code + [mcp] + key |
# REPL 模式(默认) pose chat # Claude Code + Claude 原生(最佳体验) npm install -g @anthropic-ai/claude-code pip install 'pose-platform[mcp]' pose chat --mode claude # Claude Code + DeepSeek echo 'POSE_DEEPSEEK_API_KEY=sk-xxx' > .env pose chat --mode claude-ds
工作原理
pose chat 读取 POSE_DEEPSEEK_API_KEY,在启动 Claude Code 前自动将以下环境变量注入:
| Claude Code 环境变量 | 值 |
|---|---|
| ANTHROPIC_BASE_URL | https://api.deepseek.com/anthropic |
| ANTHROPIC_AUTH_TOKEN | $POSE_DEEPSEEK_API_KEY |
| ANTHROPIC_MODEL | deepseek-v4-pro[1m] |
这把 DeepSeek 兼容 Anthropic 的 API 端点桥接到 Claude Code 的原生认证模型。你只需要 POSE_DEEPSEEK_API_KEY — 转换过程由 pose chat 透明处理。
注意:如果你直接启动 Claude Code(不通过 pose chat),则需要自行设置 ANTHROPIC_BASE_URL + ANTHROPIC_AUTH_TOKEN。pose chat --mode claude-ds 会自动为你完成这些配置。
使用 --mode claude 或 --mode claude-ds 时,Pose CLI 同时自动生成临时 .mcp.json,将 Claude Code 连接到 pose-analysis MCP 服务器并加载所有已注册工具 — 无需手动配置。
区域路由
默认配置在所有区域使用 DeepSeek。可通过 pose-manifest.json 或环境变量覆盖。
# 默认路由: # US/EU 区域:DeepSeek (http_api) → Claude(如已配置则回退) # CN 区域: Qwen-Plus (http_api) → DeepSeek(回退) # 强制指定区域: export POSE_REGION=cn # CN 路由(需 manifest 配置) export POSE_REGION=us # US 路由(默认)
示例会话
> 这段录制中有多少个动作片段? [Tool: detect_action_boundaries] 检测到 14 个动作片段 > 最快的是哪个? [Tool: detect_velocity] 峰值在 2.3 秒,18.5 m/s > 分析跑步步态模式 [Tool: analyze_running_gait] 步频:180 spm,对称性:0.94,...
本地后端配置
用 iPhone 上的 Pose Coach 录制运动数据,骨骼文件自动传输到你的电脑 — 无需云端、无需 staging 服务器、无需 Mac。
pose servepose-data/pose analyze data.csv前提条件
- iPhone 已通过 TestFlight 安装 Pose Coach(联系我们获取邀请链接)
- 电脑 已安装 Pose CLI(在 pose_platform 仓库中
pip install -e .) - 两台设备连接同一 WiFi 网络
步骤 1:启动本地后端
# 安装服务端扩展(如尚未安装) pip install 'pose-platform[server,llm]' # 启动后端 pose serve # → http://0.0.0.0:8000 # → LAN → http://192.168.1.x:8000 (在 iPhone 上配置此地址) # → data → /Users/you/pose-data
服务器默认监听所有网络接口,局域网 IP 自动打印。可选参数:pose serve --port 9000、pose serve --data-dir ~/my-data。
步骤 2:在 iPhone 上配置 Pose Coach
- 在 iPhone 上打开 Pose Coach
- 进入设置(齿轮图标)
- 滚动到 研究者后端 区域
- 选择自定义 URL
- 输入
http://<你的IP>:8000(例如http://192.168.1.42:8000) - 点击应用
- 按提示重启应用
注意:研究者后端区域在 TestFlight 版本中自动可见。
步骤 3:录制与分析
- 在 Pose Coach 中选择 Freeplay(任何尚未正式支持的运动都用此模式)
- 录制动作 — 停止录制后骨骼 CSV 自动上传
- 文件自动到达
pose-data/目录
# 查看到达的文件 ls pose-data/*_3d.csv | tail -5 # 运行分析 pose analyze pose-data/20260723T140000_seg_1_iPhone_3d.csv --tool stats pose analyze pose-data/20260723T140000_seg_1_iPhone_3d.csv --tool segment_motion_phases pose analyze pose-data/20260723T140000_seg_1_iPhone_3d.csv --tool detect_action_boundaries
步骤 4(可选):获取视频文件
.mov 视频不会上传到后端(隐私保证)。获取方式:
- 在 Pose Coach 录制后,点击导出按钮(分享图标)
- 选择保存到文件 → iCloud Drive
- 在电脑上从 iCloud Drive 下载
.mov视频与_3d.csv骨骼文件同名配对
支持的端点
pose serve 实现了 20+ 个与 Pose Coach iOS App 兼容的 API 端点:
| 端点 | 方法 | 用途 |
|---|---|---|
| /health /health/strict | GET | 健康检查 |
| /auth/anonymous | POST | 匿名认证(返回 JWT) |
| /auth/refresh | POST | 令牌刷新 |
| /user/me | GET | 用户档案 |
| /sports | GET | 运动列表 |
| /capabilities | GET | 工具列表 + 缺口 |
| /tools | GET | 工具定义 |
| /models/{sport} | GET | AFM 模型状态 |
| /upload | POST | 接收录制数据 |
| /sessions | GET | 录制列表 |
| /sessions/metadata | POST | 自动生成标题/摘要 |
| /analyze | POST | 运行分析工具 |
| /chat | POST | AI 教练对话 |
| /chat/stream | POST | SSE 流式对话 |
| /subjects | GET | 受试者列表 |
| /subjects/{id}/sessions | GET | 受试者录制记录 |
| /subjects/{id}/progress | GET | 进度数据 |
| /generate_report | POST | 综合报告 |
| /generate_subject_training_plan | POST | 跨录制训练计划 |
| /annotations/status | POST | 标注状态 |
| /corrections | POST | 骨骼修正 |
| /ios/feature-flags | GET | 功能开关 |
pose serve 与云端后端对比
| 功能 | pose serve |
云端后端 |
|---|---|---|
| 文件上传 | ✅ | ✅ |
| 分析(全部工具) | ✅ | ✅ |
| AI 教练对话 | ✅ | ✅(SSE 流式) |
| 训练计划(单次) | ✅ | ✅ |
| 训练计划(综合) | ✅ | ✅ |
| 综合报告 | ✅ | ✅ |
| 会话历史 | ✅(内存) | ✅(数据库) |
| 用户档案 | ✅ | ✅ |
| 用户账户 | ❌ | ✅ |
| 多设备 | ❌ | ✅ |
| 数据库 | ❌ | ✅ |
常见问题排查
iPhone 上显示 "无法连接后端"
- 确认两台设备在同一 WiFi 网络
- 检查防火墙:允许端口 8000 的入站连接
- Windows:可能需要在 Windows 防火墙中允许 Python
录制后 "上传失败"
确认 pose serve 仍在运行,且数据目录存在且可写。
设置中没有显示 研究者后端
请确认使用的是 Pose Coach 的 TestFlight 版本(非 App Store 版本)。TestFlight 版本中研究者后端区域会自动显示。
切换回正常使用
设置 → 研究者后端 → 选择 Staging(或 Production)→ 应用 → 重启应用。
贡献指南
Pose CLI 被设计为可扩展的。构建新工具、添加运动支持或贡献代码。
构建新工具
一个工具就是一个 Python 类。编写一次,注册后即可在任何地方使用 — CLI、Pose Coach 应用、自定义应用。
步骤 1:在 capabilities/tools/my_tool.py 中创建工具类
from capabilities.tools.base import DirectTool
from capabilities.tools.loader import load_pose
import json
from pathlib import Path
class MyTool(DirectTool):
name = "my_tool"
description = "这个工具做什么"
input_schema = {
"type": "object",
"properties": {
"path": {"type": "string", "description": "CSV 文件路径"},
"my_param": {"type": "number", "default": 1.0},
},
"required": ["path"]
}
status = "wip" # "wip" 或 "stable"
supported_sports = [] # [] = 所有运动
tier = 1 # 1 = 主要, 2 = 备选
depends_on = [] # 可选:工具依赖
requires_session_context_by_sport = ["badminton"] # 可选:运动专项元数据
def run(self, tool_input: dict, output_dir: Path) -> str:
pose = load_pose(tool_input["path"])
result = {"your_field": 42}
return json.dumps(result, ensure_ascii=False)
步骤 2:在 capabilities/tools/registry.py 中注册 — 添加 import 和实例到 all_tools 列表。
步骤 3:启用并测试:
export POSE_ENABLE_WIP_TOOLS=1 pose tools | grep my_tool pose analyze data/test.csv --tool my_tool
扩展运动支持
三行代码添加一项新运动:
# pose_platform_core/sports_catalog.py
OFFICIAL_SPORTS = [
# ... 已有的 ...
SupportedSport(id="basketball", since_version="1.24.0"),
]
然后构建工具时设置 supported_sports = ["basketball"]。通用工具会自动适用。
将工具提升为稳定版
- 编写单元测试(≥ 1 个)—
pytest tests/unit/ - 使用 10+ 个真实录制数据进行测试
- 测试边缘情况(空数据、单帧、缺失关节)
- 在
docs/features/<tool_name>.md中添加文档 - 将工具类中的
status = "stable" - 在
pose-manifest.json→tools中添加版本条目
分发你的工具
两种分发自定义工具的方式:
| 路径一:运动包 | 路径二:并入平台 | |
|---|---|---|
| 最适合 | 运动专项工具集 | 通用工具 |
| 分发方式 | 独立 PyPI 包 | 成为 pose-platform 的一部分 |
| 版本管理 | 你自己的版本号和发布周期 | 跟随平台发布节奏 |
| 操作方法 | pose sports create <id> 然后发布 | 向 posecap/pose-platform 提交 PR |
数据加载最佳实践
- 使用
pose.mpoints(模型坐标)进行生物力学分析 - Oreason 过滤是自动的 —
load_pose()会排除异常帧 - 使用
pose.joint_names动态查找关节索引 - 在输出中返回
data_quality以帮助用户评估结果可靠性 - 算法变更时在
pose-manifest.json中提升工具版本 — 旧缓存自动失效
许可证
Pose CLI — 运动分析工具包 · 版权所有 © 2026 PoseCap Inc. 保留所有权利。
1. 研究许可(非商业用途)
学术研究人员、教育机构和个人学习者被授予免版税、非排他、不可转让的许可,可为非商业研究和教育目的使用、修改和创作衍生作品,但须遵守以下条件:
- 署名 — 任何出版物必须引用 Pose Platform(BibTeX 引用格式见下文)
- 禁止再分发 — 未经事先书面同意,不得向第三方再分发本软件或其核心算法
- 禁止商业使用 — 不得嵌入商业产品、提供基于本软件的付费服务或出售分析结果
- 修改 — 你开发的工具和扩展属于你自己的知识产权。向代码库贡献即授予 PoseCap Inc. 使用和分发你贡献的许可
2. 商业许可
任何商业用途均需与 PoseCap Inc. 另行签订书面协议。联系 contact@posecap.com 获取商业许可。
引用格式
如在研究中使用 Pose CLI,请引用:
@software{pose_platform,
title = {Pose Platform: Open Motion Analysis Toolkit},
author = {{PoseCap Inc.}},
year = {2026},
url = {https://github.com/posecap/pose-platform},
}
免责声明
本软件按"原样"提供,不提供任何明示或暗示的保证。在任何情况下,作者或版权持有人均不对因使用本软件而产生的任何索赔、损害或其他责任负责。