基于 SAGE、Kimodo 和 ProtoMotions 的大规模 paired HSI 数据生成方案
本文档针对当前 PhysHSI 代码库,给出一份可落地的调研报告和实验计划:如何基于 SAGE 室内场景,批量生成 paired HSI 数据,用来训练 SMPL humanoid policy。
核心判断是:当前仓库已经有 SAGE 任务生成、affordance hint、Kimodo root-level constraint 转换、ProtoMotions 子模块和统一指标框架。下一步不应该把 Kimodo 当成完整室内 HSI 的端到端生成器,而应该新增一个 object/scene-conditioned primitive constraint 层,再用 Kimodo 生成 kinematic proposal,用 ProtoMotions 做物理跟踪、验证和 rollout 收集。
1. 总览结论
1.1 当前代码库已经具备的能力
当前仓库已经有以下关键组件:
utils/sage_task_generator/- 读取 SAGE scene,构建 occupancy/nav map,规划 A* 路径。
- 生成或校验
task_plan.json、scene_context.json、task_validation.json。 - 对 chair、sofa、support、pickup object 已经有 category-level heuristic。
-
vlm_task_generator.py已经会写入explicit_interaction_targets_by_mode、seat_front_direction_xy、seat_front_standing_point_hint_xy、standing_xy、path_points等关键字段。 -
utils/kimodo/ plan_to_constraints.py已经能把 SAGE validated plan 转成 Kimodo 输入。- 当前支持
root2ddense path、global_root_heading、sit/get_up 的root3dkeyframe。 -
root3d_constraint.py通过 wrapper/monkey patch 扩展 Kimodo constraint 类型,不直接改submodules/kimodo。 -
submodules/ProtoMotions/ - 已包含 ProtoMotions3。
- 本地文档已有 Kimodo-generated SOMA/G1 motion 到 ProtoMotions
.motion/MotionLib.pt的转换流程。 scene_lib.py支持SceneObject、MeshSceneObject、BoxSceneObject、motion-controlled object、SceneLib.save_scenes_to_file(...)。-
examples/env_kinematic_playback.py可作为 motion + scene 对齐的第一道验证。 -
utils/metrics/ - 已有跨 baseline 的 success、collision、fall、big-force、episode 聚合指标。
- 可以复用为 HSI rollout 的物理质量过滤和批量统计层。
1.2 当前缺口
当前系统仍缺少以下部分:
- primitive/constraint factory
- 目前 Kimodo constraints 主要是 root-level。
- 缺少 object-conditioned pelvis、foot、hand、keyframe、contact constraints。
-
缺少 sit、pick、place、carry 的统一中间表示。
-
paired HSI data contract
- 当前 plan、constraints、motion、scene、rollout、metrics 还没有被打包成一个统一 sample。
-
后续 TokenHSI/VLM-RMD 风格训练需要 language、scene graph、primitive plan、kinematic reference、physical rollout、object trajectory、contacts、quality labels 同时可用。
-
ProtoMotions bridge
- ProtoMotions 子模块在位,但还没有 repo-level bridge 把 Kimodo 输出、SAGE scene proxy、object trajectories 一起打包为 MotionLib + SceneLib + rollout dataset。
-
SMPL humanoid 目标需要确认 Kimodo output skeleton 与 ProtoMotions
smpl/smplxconverter 的兼容路径。 -
validation gates
- 当前还没有一套从 single-sample dry run 到 large-scale batch 的验收脚本。
- 坐下、拿取、放置、携带的成功标准需要从 task validation 扩展到 kinematic/physics 两层。
1.3 推荐路线
推荐新增中间层:
SAGE scene + scene_context + task_validation
-> HSI primitive constraint factory
-> Kimodo segmented constraints
-> Kimodo kinematic proposals
-> kinematic repair/filter
-> ProtoMotions MotionLib + SceneLib bridge
-> tracker/inference rollout
-> physics filter + paired dataset writer
最关键的新研究模块是:
它不直接生成 full SMPL motion,而是生成 root、pelvis、feet、hands、timing、contact、mask 等低维约束。早期可由 procedural rules bootstrap,随后用 Kimodo + ProtoMotions validation 产生成功样本训练 residual predictor。
2. 当前代码库地图
2.1 SAGE task 和 affordance 生成
主要文件:
utils/sage_task_generator/planner.pyutils/sage_task_generator/vlm_task_generator.pyutils/sage_task_generator/navigation.pyutils/sage_task_generator/interactable_bbox_projection.pyutils/sage_task_generator/isaac_scene_builder.pyutils/task_validator/
当前能力:
- scene loading 和 object typing
planner.py定义了SEAT_TYPE_PRIORITY、SUPPORT_TYPE_PRIORITY、PICKUP_TYPE_PRIORITY。-
_is_seat_type(...)、_is_support_type(...)、_pickup_type_score(...)已经能从 SAGE object category 中筛选坐、放、拿的候选物体。 -
navigation
navigation.py提供 occupancy map、A* path、path length 等。-
vlm_task_generator.py在 validated step 中输出path_points和standing_xy。 -
sitting affordance hints
planner.py里已有 seat height、seat orientation、sit target 的 mesh/bbox heuristic。-
vlm_task_generator.py会为座椅类 object 输出:explicit_interaction_targets_by_mode["sit"]seat_front_direction_xyseat_front_standing_point_hint_xyrecommended_move_target_xy
-
manipulation target hints
- support object 会输出
explicit_interaction_targets_by_mode["place"]。 -
pickup object 有 type-based priority,但 grasp/socket/contact 表示还没有系统化。
-
validated task plan
task_validation.json中的validated_steps是当前最适合给下游消费的 authoritative artifact。- 每个 step 可包含
action_type、action_name、target_id、target_label、standing_xy、target_xyz、path_points。
结论:当前 SAGE 层已经提供了坐、放、导航的第一层 affordance anchor。下一步应该复用这些字段作为 primitive factory 的输入,而不是重新写 scene parser。
2.2 Kimodo 集成
主要文件:
utils/kimodo/README.mdutils/kimodo/plan_to_constraints.pyutils/kimodo/root3d_constraint.pytools/kimodo/sage_kimodo_demo.pytools/kimodo/sage_scene_overlay.py
当前能力:
- 坐标转换
- README 已明确 SAGE 是 Z-up,Kimodo 是 Y-up。
- 当前映射为:
- root path constraint
plan_to_constraints.py根据validated_steps[*].path_points生成root2d。global_root_heading随 path tangent 生成。-
对 sharp reversal 已有 turn padding。
-
sit/get_up root3d
- 对
sit,最后一帧在 seat surface + offset 处添加root3d。 - 对
get_up,第一帧在 seat surface + offset 处添加root3d。 -
当前没有 full-body pose、foot constraint、pelvis constraint、hand constraint。
-
wrapper-first 设计
root3d_constraint.py通过 wrapper patch 扩展 Kimodo,不改 submodule。- 后续新增 constraint extension 也应保持这个原则。
结论:当前 Kimodo 集成已经足以跑 path + root-sit demo,但不够生成高质量 HSI 数据。它需要一个上游 primitive constraint bundle,把 object-specific keyframes、end-effector targets、contact schedule 补齐。
2.3 ProtoMotions 子模块
主要文件:
submodules/ProtoMotions/docs/source/getting_started/kimodo_preparation.rstsubmodules/ProtoMotions/docs/source/getting_started/amass_preparation.rstsubmodules/ProtoMotions/protomotions/components/motion_lib.pysubmodules/ProtoMotions/protomotions/components/scene_lib.pysubmodules/ProtoMotions/examples/env_kinematic_playback.py
当前能力:
- MotionLib
motion_lib.py可加载.motion、.yaml、目录、packaged.pt。-
存储 rigid body position/rotation/velocity、DOF、contacts、motion lengths 等。
-
Kimodo output conversion
- 本地 Kimodo preparation 文档支持:
- Kimodo SOMA
.npz->convert_soma23_npz_to_proto.py->.motion-> MotionLib.pt - Kimodo G1
.csv->convert_g1_csv_to_proto.py->.motion-> MotionLib.pt
- Kimodo SOMA
-
用户目标是 SMPL humanoid,因此需要进一步验证 Kimodo-SMPLX/AMASS-style output 到 ProtoMotions
smpl/smplx的兼容路径。 -
SceneLib
- 支持 mesh object、box/sphere/cylinder primitive object、moving object trajectories。
Scene可绑定humanoid_motion_id。-
SceneLib.save_scenes_to_file(...)可保存 scene bundle。 -
kinematic playback
examples/env_kinematic_playback.py是 motion + scene 对齐的第一道 gate。
结论:ProtoMotions 应作为 physicalizer、tracker、validator、rollout collector,而不是只用作 visualization。当前缺的是 repo-level bridge:把 SAGE scene proxy + Kimodo motion + object trajectory 写成 ProtoMotions 能消费的 MotionLib/SceneLib artifact。
2.4 Metrics 和 task validation
主要文件:
utils/metrics/README.mdutils/metrics/*utils/task_validator/README.mdutils/task_validator/*
当前能力:
metrics- 支持 success、precision、collision、fall、big_force 和 episode 级聚合。
-
可直接复用做 physical rollout 的统一统计。
-
task_validator - 已有 canonical task plan 和 offline trace adapter。
- 它消费统一 observation frame,而不是绑定某个 baseline。
结论:paired HSI dataset writer 应该同时输出 offline trace,便于用 utils/task_validator 复评 long-horizon completion。
3. 目标数据协议
3.1 sample 目录结构
建议每个 generated HSI sample 最终写成一个目录:
sample_000123/
manifest.json
scene_context.json
task_plan.json
task_validation.json
primitive_plan.json
primitive_constraints.json
kimodo_inputs/
meta.json
constraints.json
info.json
kimodo_outputs/
motion_raw.npz
motion_repaired.npz
protomotions/
motions/
motion_lib.pt
scene_lib.pt
playback_report.json
rollouts/
physical_trace.jsonl
object_states.npz
humanoid_states.npz
actions.npz
metrics/
kinematic_metrics.json
physical_metrics.json
task_validator_report.json
manifest.json 应该作为顶层索引:
{
"sample_id": "sage_hsi_000123",
"scene_id": "sage_scene_xxx",
"task_id": "task_xxx",
"instruction": "走到沙发前并坐下",
"primitive_sequence": ["navigate", "align_to_sit", "sit"],
"target_objects": ["sofa_12"],
"files": {
"scene_context": "scene_context.json",
"task_validation": "task_validation.json",
"primitive_plan": "primitive_plan.json",
"primitive_constraints": "primitive_constraints.json",
"kimodo_motion": "kimodo_outputs/motion_repaired.npz",
"motion_lib": "protomotions/motion_lib.pt",
"scene_lib": "protomotions/scene_lib.pt",
"physical_trace": "rollouts/physical_trace.jsonl"
},
"quality": {
"kinematic_success": true,
"physical_success": true,
"task_success": true
}
}
3.2 Primitive plan
primitive_plan.json 是 task plan 和模型约束之间的显式中间层:
{
"version": 1,
"source_task_validation": "task_validation.json",
"primitives": [
{
"primitive_id": "p000",
"type": "navigate",
"source_step_ids": [1],
"target_object_id": "sofa_12",
"start_frame_hint": 0,
"duration_s": 4.2,
"inputs": {
"path_points_sage_xy": [[0.0, 0.0], [1.0, 1.0]],
"standing_xy_sage": [1.0, 1.0]
}
},
{
"primitive_id": "p001",
"type": "align_to_sit",
"source_step_ids": [2],
"target_object_id": "sofa_12",
"duration_s": 1.0
},
{
"primitive_id": "p002",
"type": "sit",
"source_step_ids": [2],
"target_object_id": "sofa_12",
"duration_s": 2.5
}
]
}
3.3 Primitive constraints
primitive_constraints.json 存放 object-conditioned constraints,并且不绑定 Kimodo 内部 JSON 格式:
{
"version": 1,
"coordinate_frame": "sage_world",
"constraints": [
{
"primitive_id": "p002",
"type": "sit",
"target_object_id": "sofa_12",
"constraint_targets": {
"pre_sit_root": {
"xyz": [1.0, 2.0, 0.0],
"yaw_forward_xy": [0.0, 1.0],
"hardness": "medium"
},
"final_root": {
"xyz": [1.0, 2.35, 0.52],
"yaw_forward_xy": [0.0, 1.0],
"hardness": "hard"
},
"pelvis": {
"xyz": [1.0, 2.35, 0.55],
"hardness": "hard"
},
"left_foot": {
"xyz": [0.85, 1.95, 0.0],
"hardness": "medium"
},
"right_foot": {
"xyz": [1.15, 1.95, 0.0],
"hardness": "medium"
}
},
"contact_schedule": [
{"body": "pelvis_proxy", "object_part": "seat", "start_phase": 0.75, "end_phase": 1.0},
{"body": "left_foot", "object_part": "floor", "start_phase": 0.30, "end_phase": 1.0},
{"body": "right_foot", "object_part": "floor", "start_phase": 0.30, "end_phase": 1.0}
]
}
]
}
这个格式故意拆开三类信息:
- SAGE-world affordance targets。
- Kimodo-specific constraints。
- ProtoMotions-specific physical rollout artifacts。
这样做的原因是:Kimodo、Isaac Gym、Isaac Sim、ProtoMotions 的坐标系和 skeleton 约定并不完全一致。
4. 仓库内建议实现
4.1 新增 utils/hsi_primitive_factory/
目标:
task_validation.json + scene_context.json + humanoid params
-> primitive_plan.json + primitive_constraints.json
建议文件:
utils/hsi_primitive_factory/
__init__.py
schemas.py
io.py
scene_affordance.py
primitive_planner.py
sit.py
pickup.py
place.py
carry.py
kimodo_export.py
validators.py
cli.py
职责划分:
schemas.py-
定义
PrimitiveSpec、ConstraintTarget、ContactEvent、PrimitiveConstraintBundle、AffordanceObject、SitSlot、GraspSocket、SupportSurface等 dataclass。 -
io.py - 读取
manifest.json、task_validation.json、scene_context.json、humanoid_params.json。 -
在输出 metadata 中保留所有来源文件路径。
-
scene_affordance.py - 把 SAGE
scene_context.entities转成 object-centric affordance graph。 - 消费已有字段:
explicit_interaction_targets_by_modeseat_front_direction_xyseat_front_standing_point_hint_xy- bbox/dims/category/description
-
派生新字段:
sit_slotssupport_surfacesgrasp_socketslocal_occupancy_patch
-
primitive_planner.py - 把 validated steps 转成 primitive sequence。
- 插入缺失的 transition primitive:
align_to_sitalign_to_pickupalign_to_place
-
把长任务拆成短 Kimodo segments。
-
sit.py - 生成
SitSlot和 sitting constraints。 - MVP 阶段用 procedural/canonical targets:
- final pelvis/root 来自
explicit_interaction_targets_by_mode["sit"] - heading 来自
seat_front_direction_xy - pre-sit root 来自
seat_front_standing_point_hint_xy - feet 来自前方地面区域
- final pelvis/root 来自
-
后续接入 learned residual predictor。
-
pickup.py - 生成 hand/wrist target constraints 和 attach event。
-
MVP 阶段使用 proxy grasp:
- 小物体:一个 wrist target 在物体上方/前方。
- box/cushion/pillow:两个 wrist targets 分布在 bbox 两侧。
- SMPL 没有手指,所以以 wrist/socket proximity 作为成功标准。
-
place.py - 生成 hand/object release target。
-
如果有
explicit_interaction_targets_by_mode["place"],优先使用它。 -
carry.py - 生成 object-to-hand/torso attachment schedule。
-
对 SMPL-only 先保持 object motion 为 kinematic,在验证时检查 contact/proximity,而不追求真实灵巧抓取。
-
kimodo_export.py - 把 primitive constraints 转成 Kimodo JSON。
- 复用现有
utils/kimodo.plan_to_constraints的 root path 和 timing。 -
当本地 Kimodo wrapper 支持时,追加 end-effector/full-body constraints。
-
validators.py -
在进入 ProtoMotions 前做 kinematic checks:
- root path collision
- pelvis-seat distance
- foot-floor distance
- hand-object distance
- penetration proxy
- transition velocity/acceleration jumps
-
cli.py - 第一版命令建议:
python -m utils.hsi_primitive_factory.cli \
--plan-dir utils/sage_task_generator/real_vlm_runs/<run_id> \
--out-dir utils/sage_task_generator/real_vlm_runs/<run_id>/hsi_primitives \
--tasks sit,pick,place,carry
4.2 扩展 utils/kimodo/
当前 plan_to_constraints.py 应保持向后兼容。建议新增可选路径,而不是破坏现有用法:
python tools/kimodo/plan_to_constraints.py \
--plan-dir <plan_dir> \
--primitive-constraints-json <plan_dir>/hsi_primitives/primitive_constraints.json \
--segment-mode primitive \
--output-dir <plan_dir>/kimodo_inputs
推荐行为:
- 不传
--primitive-constraints-json -
保持当前
root2d/root3d行为完全不变。 -
传入
--primitive-constraints-json - 复用当前 root timing 和坐标转换。
-
添加从 primitive constraints 派生的 Kimodo constraints:
- 如果支持,则把 pelvis/root keyframe 转成 root/body constraint。
- 对坐下最终阶段添加 foot end-effector targets。
- 对 pickup/place 添加 wrist end-effector targets。
- 可选加入 canonical pose library 中的 soft full-body keyframe。
-
如果本地 Kimodo submodule 暂不支持某类 constraint
primitive_constraints.json仍作为 authoritative artifact 保存。- 只导出 Kimodo 支持的 constraints。
- 在
kimodo_inputs/info.json的unsupported_constraints里显式记录被跳过的约束。
这样可以避免静默失败。
4.3 新增 utils/protomotions_bridge/
目标:
Kimodo output + SAGE scene + primitive constraints
-> ProtoMotions MotionLib + SceneLib + playback report
建议文件:
utils/protomotions_bridge/
__init__.py
schemas.py
convert_motion.py
export_scene.py
export_objects.py
playback.py
rollout.py
cli.py
职责划分:
convert_motion.py- 包装现有 ProtoMotions converters。
- 第一阶段优先支持:
- Kimodo SOMA
.npz->soma23MotionLib,因为本地文档已经证明这条路径。
- Kimodo SOMA
-
用户目标所需 gate:
- Kimodo-SMPLX/AMASS-style output -> ProtoMotions
smpl或smplx。
- Kimodo-SMPLX/AMASS-style output -> ProtoMotions
-
export_scene.py - 把 SAGE static objects 转成 ProtoMotions
SceneObject。 - 起步用
BoxSceneObjectproxies 保证 scale。 -
只对 target objects 和近距离 obstacles 使用
MeshSceneObject或更精细 proxy。 -
export_objects.py - 对 pickup/carry/place 物体写 moving object trajectory:
- grasp 前 static。
- carry 时 attached to wrist/torso。
- release 时落到 target support surface。
-
尽量使用 ProtoMotions motion-controlled object 支持。
-
playback.py - 对一个 sample 或一个 batch 运行
examples/env_kinematic_playback.py。 -
导出
playback_report.json。 -
rollout.py - 用 MotionLib 和 SceneLib 运行 tracker inference/training。
-
收集
physical_trace.jsonl、actions.npz、humanoid_states.npz、object_states.npz。 -
cli.py
python -m utils.protomotions_bridge.cli \
--sample-dir output/hsi_samples/sample_000123 \
--robot-name smpl \
--simulator isaacgym \
--scene-proxy boxes \
--run-playback
4.4 新增 utils/hsi_dataset_writer/
目标:
建议文件:
utils/hsi_dataset_writer/
__init__.py
manifest.py
sample_writer.py
quality_schema.py
trace_export.py
cli.py
职责:
- 标准化 sample folder layout。
- 写入
manifest.json。 - 复制或 symlink source artifacts。
- 保存相对路径。
- 保存质量标签:
kinematic_successplayback_successphysical_successtask_successfilter_reason- 为
utils/task_validator导出 offline trace。
5. primitive 设计
5.1 Navigate
输入:
输出:
实现建议:
- 保留当前 A* path 作为 topological route。
- 在输入 Kimodo 前增加 path smoothing:
- 可用时做 string-pulling/funnel。
- 加入 curvature-limited smoothing。
- 对长距离路径每 1-2 m 采样 sparse waypoints。
- 只有在局部 path 短且平滑时才使用 dense
root2d。
原因:dense A polylines 容易过度约束 Kimodo,导致转向不自然。primitive layer 应该把 A 变成人体可走的 corridor,再暴露 motion-relevant constraints。
5.2 Align
类型:
输入:
输出:
这个 primitive 很关键。很多 HSI 失败不是 sit/pick/place 本身失败,而是进入交互前 heading 错、脚位置不对、root 离物体太近或太远。
5.3 Sit
输入:
seat object entity
explicit_interaction_targets_by_mode["sit"]
seat_front_direction_xy
seat_front_standing_point_hint_xy
humanoid dimensions
floor height
输出:
pre_sit_root
final_root
pelvis_target
left_foot_target
right_foot_target
contact_schedule
optional seated_pose_token
procedural MVP:
- final root/pelvis
- 使用
explicit_interaction_targets_by_mode["sit"]。 -
从可配置 SMPL body 参数中加入 pelvis/root offset。
-
heading
-
使用
seat_front_direction_xy。 -
pre-sit root
- 优先使用
seat_front_standing_point_hint_xy。 -
fallback 为
seat_target_xy - seat_front_direction_xy * pre_sit_distance。 -
feet
- 把脚放在 seat 前方:
foot_center = seat_xy - seat_front_direction_xy * foot_forward_offset
left_foot = foot_center - seat_right_xy * stance_width / 2
right_foot = foot_center + seat_right_xy * stance_width / 2
- validation
- foot targets 必须在可站立地面。
- pelvis target 必须在 seat support bbox 或 mesh-derived seat region 内。
- root yaw error 必须低于阈值。
learned extension:
网络只预测 deltas 和 confidence,不直接预测完整 motion。
5.4 Stand
输入:
输出:
stand 不建议简单反转 sit motion。它应该是单独的 primitive,因为起身通常需要前倾、脚部支撑和 pelvis clearance。
5.5 Pick Up
输入:
输出:
MVP grasp types:
one_hand_top_or_front-
mug、cup、bottle、remote、phone、pen。
-
two_hand_box -
box、pillow、cushion、tray、较大的 book。
-
tabletop_reach -
object 在 support surface 上。
-
floor_bend_or_squat - object 在 floor 上。
SMPL-specific 简化:
SMPL 没有 articulated fingers。先用 wrist 或 hand proxy:
pickup_success = distance(wrist, grasp_socket) < threshold
carry_success = object pose follows hand/torso attach frame
5.6 Carry
输入:
输出:
MVP:
- carry 时 object kinematic attachment。
- 大物体使用 two-hand carry。
- 小物体使用 one-hand carry。
- 检查 object 与 static scene 的碰撞。
5.7 Place
输入:
输出:
MVP:
- 使用
explicit_interaction_targets_by_mode["place"]作为 support center。 - 定义 release height = support surface height + object half-height。
- 验证 object release 后是否稳定。
6. Scene-Conditioned Keyframe Generator
6.1 为什么要 learned constraints,而不是纯手写 primitive
纯 procedural primitive factory 会快速变成大量工程规则。完全端到端的 scene-to-motion generator 也过难,因为它必须同时解决 affordance grounding、motion synthesis、collision、contact 和 physics。
这里的 learned module 不是前置条件,也不是假设我们已经有人工标注的 HSI 数据。正确顺序是:
先用 procedural/retrieval/search 产生候选 constraints
-> 用 Kimodo + kinematic filter + ProtoMotions/Isaac 验证
-> 自动得到 success/failure、constraint quality、repair result
-> 再训练 scene-conditioned proposal/ranking/residual model
也就是说,初期系统完全可以不训练 A_phi。A_phi 的训练数据来自我们自己的生成-验证闭环,而不是来自已有 paired HSI dataset。它学习的是“哪些 object-conditioned constraints 更容易成功”,不是从零学习完整人体 motion。
更可控的目标是:
Kimodo 负责 motion proposal,ProtoMotions 负责 physicalization 和 validation。
6.2 模型输入
建议使用 object-centric input:
target object local frame
local point cloud or SDF/height field
object bbox and category embedding
part tokens: seat/back/arm/tabletop/handle/floor
local occupancy around root/feet/pelvis/hands
current humanoid root and body shape proxy
task token
6.3 模型输出
对 sit:
slot distribution
pre_sit_root residual
final_root residual
pelvis residual
left/right foot residual
timing
constraint hardness
contact schedule confidence
对 pickup/place/carry:
pre_interaction root residual
wrist target residual
carry mode
attach/release frame
object-to-hand transform residual
constraint hardness
6.4 训练策略
训练数据不是预先存在的,而是由 bootstrap loop 生成:
SAGE object/scene affordance hints
-> procedural/retrieval/random/CEM candidate constraints
-> Kimodo generation
-> kinematic filter
-> ProtoMotions playback/tracker
-> physical filter
-> success/failure labels + quality metrics + repaired constraints
-> train A_phi proposal/ranker/residual predictor
-> use A_phi to propose fewer, better candidates
这不是循环依赖。第一批数据由非学习方法产生:
- procedural anchors:来自
scene_context.json里的 sit target、seat front、standing point、place target。 - retrieval:从 canonical pose/motion library 中取坐下、起身、弯腰、拿取、放置模板。
- random/CEM search:围绕 pelvis、feet、wrist、heading、timing 做小范围采样。
- optional optimization:只对少量 hard cases 做 IK/pose fitting,作为 pseudo-label teacher 或 repair。
A_phi 可以有三种训练目标:
- proposal model:直接预测一组 candidate constraints。
- ranker:给多个候选 constraints 打分,选最可能成功的。
- residual predictor:在 canonical/procedural constraint 上预测小修正量。
最稳的起步方式是先训练 ranker 或 residual predictor,而不是直接训练 proposal model。这样即使模型不好,也可以退回 procedural candidates。
这个 learned module 最终最好输出分布:
原因是同一张 sofa 可以有多个合理坐法、多个合理 foot placements。训练它的目的不是解决“没有数据时怎么凭空学”,而是用已验证样本逐步减少 brute-force search、减少手写规则、提高 held-out shape 的成功率。
6.5 optimization 的合理位置
optimization 应该只用于三个位置:
- pseudo-label teacher
-
对少量样本做 local IK/pose fitting,生成干净标签。
-
lightweight repair
-
root warp、foot projection、wrist correction、pelvis-seat snap,只修小误差。
-
失败恢复
- learned/procedural candidate 失败时,运行 local search 或 CEM 找更好 constraint,再加入训练数据。
不建议把 optimization 作为每个 object 的默认 runtime 路径。
7. Kimodo 生成策略
7.1 Segment granularity
不要用一个长 prompt 生成完整 long-horizon task。应该按短 primitive segment 生成:
建议 segment duration:
navigate: 1-6 seconds
align: 0.5-1.5 seconds
sit/stand: 1.5-3 seconds
pickup/place: 1.5-3 seconds
carry: 1-6 seconds
7.2 每类 primitive 的约束
Navigate:
Align:
Sit:
final native fullbody keyframe
或 final native end-effector(Hips, LeftFoot, RightFoot) keyframe
pelvis/feet targets 用于 validation 和 optional repair
root3d 仅作为 legacy ablation/fallback,不作为 sit 主接口
Pick:
Carry:
Place:
7.3 Transition handling
使用三层机制:
- 插入 align primitives。
- 如果 Kimodo 支持,用 overlap context 生成下一段。
- 对 transition 做 post-process:
- root velocity continuity
- joint velocity continuity
- foot contact consistency
- object attachment continuity
8. ProtoMotions 物理化
8.1 第一目标:kinematic playback
在任何 RL/tracker training 之前,每个 generated sample 都应该先通过:
MotionLib 能加载
SceneLib 能加载
humanoid 从预期姿态开始
scene proxy 与 SAGE 坐标转换一致
target object 出现在 primitive constraints 预期位置
没有明显 scale/unit mismatch
第一道 gate 使用 examples/env_kinematic_playback.py。
8.2 tracker 使用方式
推荐阶段:
- Stage A:general SMPL tracker
- 如果已有 ProtoMotions SMPL tracker checkpoint,先用它。
-
用 AMASS 或已有 MotionLib 做 baseline sanity。
-
Stage B:generated HSI tracking
- 在 SAGE scene proxies 里跟踪 Kimodo-generated references。
-
只有 kinematic playback 正确后,才加入 collision/contact/task rewards。
-
Stage C:task-conditioned policy
- 用成功 physical rollouts 训练 primitive-conditioned 或 token-conditioned policy。
8.3 scene proxy 策略
先从简单版本开始:
all static objects -> BoxSceneObject
target object -> MeshSceneObject or tighter primitive compound
floor/walls -> static boxes/planes
carry object -> dynamic or motion-controlled object
再逐步提高 fidelity:
这对 scale 很关键。完整 SAGE-10k mesh scenes 很可能在早期 IsaacGym batch training 中过重。
9. 质量过滤
9.1 Kinematic metrics
通用指标:
root path error
root heading error
joint acceleration spike
root velocity jump at segment boundaries
body-scene penetration proxy
foot skating
Sit:
pelvis-seat xy error < 0.10 m
pelvis height error < 0.08 m
root yaw error < 20 deg
feet floor distance < 0.05 m
feet outside seat/object footprint
post-sit pelvis remains stable for N frames
Pick:
wrist-grasp distance < 0.08 m
object lift height > threshold
attach event occurs after wrist proximity
torso/object penetration below threshold
Carry:
hand-object relative pose error < threshold
object-scene collision below threshold
root path remains collision-free
Place:
object final xy on support surface
object final height matches support + object half-height
object stable after settle
hand 释放时没有明显 object jump
9.2 Physical metrics
复用 utils/metrics:
新增 HSI-specific metrics:
tracking_error_mean
tracking_error_max
pelvis_seat_contact_ratio
feet_floor_contact_ratio
wrist_object_contact_ratio
object_attach_error
object_final_stability
scene_penetration_depth_proxy
9.3 Filter policy
只保留:
保存失败样本:
失败样本对 repair queue 和 constraint predictor training 很有价值。
10. 实验计划
Phase 0:单样本 pipeline smoke test
目标:
1 个 SAGE scene
1 个 chair/sofa sit task
仅 root 约束的 Kimodo generation
ProtoMotions conversion/playback
写出 sample manifest
验收:
所有 source artifacts 都能用相对路径解析
Kimodo constraints 能加载
Kimodo motion file 存在
ProtoMotions MotionLib 能加载
SceneLib 能加载
kinematic playback 显示 scene 和 humanoid 对齐
这个阶段不判断 motion 质量,只证明 artifact chain 能跑通。
Phase 1:Sitting MVP
目标:
数据:
对比项:
当前仅 root2d/root3d 约束的 legacy baseline
本周 sit demo 原始 constraints
本周 sit demo + generated final fullbody keyframe,其它设置完全不变
本周 sit demo + generated final fullbody/end-effector keyframe + no root3d
SAGE procedural object binding + generated final fullbody/end-effector keyframe
指标:
kinematic 层坐下成功率
physical 层坐下成功率
pelvis-seat 误差
foot-floor 误差
penetration proxy
fall rate
tracking error
每个 sample 的 generation time
预期:加入 align primitive 和 feet/pelvis constraints 后,physical 层坐下成功率应显著优于当前仅 root 约束的 sit。
第一轮不要直接扩大到 100 scenes。先在本周 sit demo 上做 isolated validation:
固定:
prompt
frame timeline
root2d path/heading
Kimodo model/config/seed
只替换:
final seated keyframe pose
判断:
motion 是否自然过渡
final keyframe 是否成功控制 Hips/root 坐到椅子
aligned seated keyframe 是否通过 collision proxy check
如果 generated keyframe 在保留 demo 其它 constraints 时失败,先修 keyframe_factory 的 alignment/collision。
如果保留其它 constraints 成功、去掉 root3d 后失败,再加 native mid-sit fullbody/end-effector(Hips) keyframe,而不是把 root3d 作为长期方案。
Phase 2:Pick and place
目标:
数据:
500 scenes
10k-50k primitive clips
small objects + box/cushion/pillow objects
floor pickup 和 tabletop pickup cases
对比项:
指标:
wrist-object 距离
object lift 成功率
carry attach 误差
place final 误差
object 稳定性
human fall rate
collision count
Phase 3:Composition
目标:
数据:
指标:
Phase 4:Learned scene-conditioned constraint generator
目标:
在已有 successful/failed generated samples 后,训练 A_phi 做 candidate ranking 或 residual constraint prediction
训练数据:
成功的 procedural/optimized candidates
带失败原因的 failed candidates
scene/object crops
constraint targets
quality metrics
optional repaired constraints
消融:
仅 procedural
procedural + random/CEM search
仅 optimization teacher
procedural + ranker
仅 learned residual
learned residual + 失败兜底
指标:
Phase 5:SAGE-10k scale
目标:
目标规模:
batch policy:
11. 消融矩阵
必须做的消融:
| 消融项 | 检验问题 |
|---|---|
当前仅 root 约束的 plan_to_constraints.py |
当前仓库基线 |
dense A* root2d vs smoothed sparse waypoints |
A* 是否过度约束 Kimodo |
| one-shot long prompt vs primitive segments | 分段是否改善 transition |
| no align vs align primitive | pre-interaction pose 是否是主要失败点 |
| 仅 root 约束的 sit vs pelvis/feet sit | body anchors 是否改善物理坐下 |
| procedural constraints vs learned residual | scene-conditioned module 是否带来收益 |
| box scene proxy vs mesh target proxy | ProtoMotions 中 fidelity 和性能的权衡 |
| 仅 kinematic filter vs physical tracker filter | physics filtering 是否显著改变数据质量 |
12. 实现里程碑
Milestone 1:Artifact contract
交付:
utils/hsi_primitive_factory/schemas.py
utils/hsi_primitive_factory/io.py
docs sample schema
一个读取现有 plan_dir 并写出 primitive_plan.json 的 CLI
验收:
Milestone 2:Sit primitive
交付:
从 scene_context 抽取 SitSlot
procedural sit constraints
primitive_constraints.json
kinematic sit validator
验收:
带现有 sit hints 的 chair/sofa entities 能生成 constraints
invalid seats 会产生明确 rejection reason
feet/pelvis targets 使用 SAGE coordinates,并且可转换到 Kimodo coordinates
Milestone 3:Kimodo constraint enrichment
交付:
`plan_to_constraints.py` 增加 `--primitive-constraints-json` option
unsupported constraint reporting
Kimodo info.json 包含 primitive mapping
验收:
Milestone 4:ProtoMotions bridge smoke test
交付:
把一个 Kimodo motion 转成 MotionLib
把一个 SAGE scene proxy 导出为 SceneLib
运行 kinematic playback
写出 playback_report.json
验收:
MotionLib 能加载
SceneLib 能加载
playback 中 humanoid 和 target object 对齐误差小于 5 cm
coordinate transform 通过 markers 验证
Milestone 5:Paired dataset writer
交付:
验收:
一个 generated sample 能被 task_validator offline adapter 消费
manifest 能解析所有路径
quality labels 能从 metrics files 复现
Milestone 6:Learned residual predictor
交付:
scene/object crop dataset
constraint residual labels
baseline MLP/PointNet-style predictor
primitive factory 中的 inference hook
验收:
13. 信心闭环和风险清单
用户要求“不断思考直到 100% 自信”。仅靠静态阅读代码不能诚实地证明 100% 正确,因为最难的问题依赖 runtime assets、skeleton conventions、Kimodo model behavior、Isaac/ProtoMotions simulator behavior 和 GPU 环境。正确标准应该是:
13.1 C0:静态 artifact sanity
已知风险:
manifest.json不一定总有scene_context_json。- 不同 real VLM runs 可能使用略不同字段名。
- 部分 validated steps 可能缺少
target_id、standing_xy或path_points。
验证:
验收:
所有 required files 都能解析
所有 validated_steps 要么映射到 primitives,要么产生明确 skip reasons
所有 coordinates 都保留 source frame metadata
修复:
- 增加字段 alias。
- 增加 schema versioning。
- 对 target object 不明确的情况 fail closed,不静默猜测。
13.2 C1:坐标转换
已知风险:
- SAGE 是 Z-up,Kimodo 是 Y-up,ProtoMotions simulator 内部可能有另一套约定。
- spawn-relative Kimodo 坐标在 ProtoMotions 中可能被错误还原。
- heading convention 可能出现 180 度翻转。
验证:
render/debug 三个 marker points:
spawn
target seat center
standing point
compare in SAGE overlay, Kimodo viewer, ProtoMotions playback
验收:
修复:
- 把 transforms 集中到一个模块,例如
utils/hsi_primitive_factory/coordinates.py。 - 增加 known points 的 golden coordinate tests。
- 每个 artifact 都存 source 和 target coordinate frame。
13.3 C2:Kimodo constraint support
已知风险:
- 本地 Kimodo wrapper 可能还没暴露 primitive factory 需要的 end-effector/full-body constraints。
root3d是本地 extension,可能和 native post-processing 有冲突。- dense path + body constraints 可能互相冲突。
验证:
每种 constraint type 生成一个 sample:
root2d
root3d
foot end-effector
wrist end-effector
full-body keyframe
验收:
Kimodo generation 能完成
constraint hit error 低于 primitive-specific threshold
unsupported constraints 会记录到 info.json
修复:
- 保留仅 root 约束的兜底路径。
- 逐类加入 constraints。
- 使用 sparse constraints,避免 hard-pin 太多 joints。
- 只用 post-processing 修小 residual。
13.4 C3:SMPL/SMPLX 兼容性
已知风险:
- 当前本地 Kimodo 文档证明了 SOMA/G1 conversion,但不等价于证明 Kimodo-SMPLX -> ProtoMotions SMPL。
- 用户目标是 SMPL humanoid,不是 G1。
- SMPL-X hands 可能需要丢弃,或映射到 SMPL body-only。
验证:
生成或获取一个 Kimodo-SMPLX output
检查字段:trans、root_orient、pose_body、pose_hand、betas、fps
运行 ProtoMotions AMASS/SMPL conversion path
用 robot-name smpl 加载 MotionLib
可视化一个 clip
验收:
修复:
- 如果 SMPLX path 跑通,就围绕 AMASS converter 实现 bridge。
- 如果只有 SOMA path 稳定,就用 SOMA/soma23 做早期 physics validation,暂缓 SMPL policy training。
- 明确实现 SMPL-X -> SMPL body mapping,并记录 hand target 限制。
13.5 C4:SceneLib proxy fidelity
已知风险:
- 完整 SAGE meshes 对 IsaacGym batch simulation 可能太重。
- bbox proxies 对 sitting/place 可能太粗。
- SAGE 和 ProtoMotions 的 object origins/rotations 可能不一致。
验证:
把一个 scene 导出为 boxes
把 target sofa/chair 导出为 mesh 或 compound boxes
带 markers 运行 kinematic playback
测量 target seat/support surface error
验收:
target interaction surface error < 0.05 m
nearby obstacle occupancy 与 SAGE nav map 足够一致,可用于 collision filtering
playback FPS 可用
修复:
- 使用 hybrid proxies:far objects 用 boxes,target objects 用 mesh/compound target objects。
- 缓存 converted collision proxies。
- 给 seats、supports、doors、carryables 增加 category-specific proxy builders。
13.6 C5:sit keyframe 质量
已知风险:
- bbox 得到的 seat target 对异常 sofa/chair 可能错误。
- foot targets 可能落到家具下面或 clutter 里。
- pelvis/root offset 可能不匹配 SMPL body shape。
验证:
采样 100 个 seat slots
在 topdown 和 side view 渲染 sit targets 与 foot targets
运行 Kimodo generation
运行 kinematic sit metrics
验收:
修复:
- 为 feet 增加 local floor clearance search。
- 对 sofa 增加 multi-candidate slots。
- 收集足够成功样本后再训练 learned residual predictor。
- optimization 只用于 pseudo-labels 和 hard failures。
13.7 C6:ProtoMotions tracker 可靠性
已知风险:
- tracker checkpoint 可能无法很好跟踪 Kimodo-generated motions。
- sitting/contact motions 可能超出 AMASS tracker 分布。
- scene collisions 可能让 humanoid 在 tracking 时不稳定。
验证:
在 50 个 sitting clips 上运行 tracker inference
记录 tracking error、fall rate、contact metrics
对比 flat scene 和 scene proxy
验收:
修复:
- 在 generated sitting clips 上 fine-tune tracker。
- 先用 kinematic seats 或 simplified contacts。
- 逐步增加 collision complexity。
13.8 C7:Long-horizon dataset 质量
已知风险:
- 单个 primitive 成功不代表组合后成功。
- object attach/release 可能引入 discontinuity。
- 过滤后 dataset 可能偏向 easy objects/scenes。
验证:
生成 1k composed tasks
在 offline traces 上运行 task_validator
按 primitive sequence、object category、scene type 分层统计 success
验收:
修复:
- 保存 failures,并对 underrepresented hard cases 重新采样。
- 增加 transition-specific repair。
- 按 scene/object/task category 平衡保留样本。
13.9 静态 review 后的信心状态
基于当前代码阅读,我对以下点信心较高:
SAGE plan artifacts 可以作为 primitive constraints 的来源
当前 Kimodo root-only path 是有效基线
ProtoMotions 具备 MotionLib 和 SceneLib 所需抽象
metrics/task_validator 可以复用做质量报告
对以下点尚不能声称 100%:
Kimodo-SMPLX -> ProtoMotions SMPL bridge
end-effector constraints in the local Kimodo wrapper
full SAGE object -> ProtoMotions SceneLib coordinate/proxy fidelity
physical tracker 在 sit/pick/place/carry interactions 上的成功率
large-scale runtime 和 failure distribution
只有 C0-C7 全部通过后,才能认为实现达到 production-ready。直到那之前,所有不确定假设都应该显式写进 artifact,失败时给出明确 reason,而不是静默产出 noisy paired data。
13.10 Self-review iterations used for this plan
本报告在定稿前经过了以下自检循环:
- Iteration 1:当前 SAGE 输出是否已经足够支撑这个方向?
- 发现:是的。
scene_context.json和task_validation.json已经包含 sit target、seat-front direction、standing point、A* path 等有用 affordance anchors。 -
修正:primitive factory 应消费现有 SAGE artifacts,而不是新建一套 parallel scene parser。
-
Iteration 2:当前 Kimodo wrapper 能否直接解决 HSI?
- 发现:不能。当前 wrapper 主要是 root-level,包含
root2d和本地root3d,还不能表达 pelvis、feet、hands、object contact constraints。 -
修正:保留仅 root 约束作为 baseline,新增
primitive_constraints.json,并且只在支持被验证后才 enrich Kimodo constraints。 -
Iteration 3:ProtoMotions 是否可以认为已经完全解决?
- 发现:只能部分认为。MotionLib 和 SceneLib 在位,但 SMPL/SMPLX Kimodo conversion 以及 SAGE scene proxy fidelity 尚未证明。
-
修正:加入 C3 和 C4 gates,在它们通过前不宣称 SMPL physical rollouts 有效。
-
Iteration 4:primitive factory 是否会变成纯工程规则?
- 发现:如果长期停留在仅 category rules 的方案,会变成工程堆叠。
-
修正:procedural constraints 只作为 bootstrap;真正的研究模块是 scene-conditioned residual constraint generator,训练数据来自成功生成和验证样本。
-
Iteration 5:是否能 scalable 地生成 paired data 且不静默注入噪声?
- 发现:只有在失败样本带 reason 保留、每个 sample 都有 kinematic/playback/physical/task quality labels 时才可控。
- 修正:把 dataset manifest、failed sample queue、quality filters、task-validator offline trace export 作为一等 artifact。
剩余不确定性没有被隐藏,而是被转换成 C0-C7 validation gates,每个 gate 都有验收标准和修复动作。
14. 立即执行顺序
推荐下一步实现顺序:
- 新增
utils/hsi_primitive_factoryschemas 和 dry-run CLI。 - 基于已有 SAGE 字段实现 sit-only procedural constraints。
- 给 Kimodo conversion 加
--primitive-constraints-json,同时不改变当前仅 root 约束行为。 - 实现 one-sample paired dataset writer。
- 实现 ProtoMotions bridge:一个 generated motion + 一个 box-proxy scene。
- 在 100 个 scenes 上跑 sitting MVP,并输出 ablation table。
- sitting 的 kinematic/physical 成功率稳定后,再加入 pickup/place/carry。
- 收集足够成功/失败样本后,再训练 learned residual constraint predictor。
这个顺序能保持第一个里程碑足够小,同时直接朝 scalable paired HSI dataset 目标推进。
15. 外部参考
本方案用到的主要参考:
- Kimodo constraints: https://research.nvidia.com/labs/sil/projects/kimodo/docs/key_concepts/constraints.html
- SAGE project and SAGE-10k dataset: https://nvlabs.github.io/sage/
- ProtoMotions quick start and SMPL tracker notes: https://protomotions.github.io/getting_started/quickstart.html
- 本地 ProtoMotions Kimodo preparation:
submodules/ProtoMotions/docs/source/getting_started/kimodo_preparation.rst - 本地 ProtoMotions AMASS/SMPL preparation:
submodules/ProtoMotions/docs/source/getting_started/amass_preparation.rst