原子动作切分
更新时间:2026-07-29
简介
基于运动学启发式(停顿点 + gripper 翻转点)把一条连续的 7-DoF 动作序列切分为若干原子动作片段,AIHC 自研,纯 numpy、离线 CPU、无模型依赖,是 7-DoF 动作链路的中间处理环节。
功能描述
• 停顿切分:前 3 维平移速度低于阈值视为停顿,在“运动↔停顿”状态翻转处切分(segment_by 含 pause)
• 抓取翻转切分:第 7 维 gripper 开合状态翻转处切分(segment_by 含 gripper_flip)
• 短片段归并:长度小于 min_segment_len 的片段并入相邻片段,保证片段连续覆盖 [0, N)
• 片段输出:每个片段为半开区间 [start, end) 并带切分触发类型(pause/gripper_flip/start/merged)
算子参数
输入
| 输入 | 含义 |
|---|---|
| action_seq | 一条 7-DoF 动作序列,形状 [N, 7]([dx,dy,dz,drx,dry,drz,gripper]),类型 list<list |
输出
| 输出 | 含义 |
|---|---|
| result | 片段列表,类型 list<struct{start:int32, end:int32, type:string}>,start/end 为半开区间,type 为切分触发类型。 |
参数
| 参数名称 | 类型 | 默认值 | 描述 | |
|---|---|---|---|---|
| segment_by | list[str] |None | None(等价于 ["pause","gripper_flip"]) | 切分依据,可选项 pause / gripper_flip 的子集 | |
| pause_velocity_thresh | float | 0.01 | 停顿判定的平移速度阈值(前 3 维增量模长) | |
| min_segment_len | int | 5 | 最小片段长度,短于此长度的片段并入相邻段(须 >= 1) | |
| gripper_flip_thresh | float | 0.5 | gripper 开合翻转阈值(小于阈值视为闭合) |
调用示例
Python
1from __future__ import annotations
2import os
3import daft
4from daft import col
5from daft.aihc.common.udf import aihc_udf
6from daft.aihc.functions.embodied.atomic_action_segment import AtomicActionSegment
7
8if __name__ == "__main__":
9 if os.getenv("DAFT_RUNNER", "native") == "ray":
10 import ray
11 ray.init(dashboard_host="0.0.0.0", ignore_reinit_error=True)
12 daft.set_runner_ray()
13 daft.set_execution_config(min_cpu_per_task=0)
14
15 # 一条 12 帧 7-DoF 序列:前段运动、中段停顿、末段运动(会在停顿边界切分)
16 seq = (
17 [[0.1, 0.0, 0.0, 0, 0, 0, 1.0]] * 4 # 运动
18 + [[0.0, 0.0, 0.0, 0, 0, 0, 1.0]] * 4 # 停顿
19 + [[0.1, 0.0, 0.0, 0, 0, 0, 1.0]] * 4 # 运动
20 )
21 samples = {"action_seq": [seq]}
22 ds = daft.from_pydict(samples)
23 ds = ds.with_column(
24 "segments",
25 aihc_udf(
26 AtomicActionSegment,
27 construct_args={"segment_by": ["pause"], "pause_velocity_thresh": 0.05, "min_segment_len": 3},
28 num_cpus=1, concurrency=1, batch_size=1,
29 )(col("action_seq")),
30 )
31 ds.show()
评价此篇文章
