You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Implement `FrameTransformer` and `FrameTransformerData` for the OVPhysX backend, satisfying the `BaseFrameTransformer` and `BaseFrameTransformerData` contracts. Computes relative transforms between a source frame and multiple target frames attached to rigid bodies.
How to read transforms for arbitrary bodies (not just root) from ovphysx? The Articulation's `ARTICULATION_BODY_POSE` binding returns all link poses — FrameTransformer needs to index into specific links. @marcodiiga to clarify.
Implement FrameTransformer and FrameTransformerData for the OVPhysX backend, satisfying the BaseFrameTransformer and BaseFrameTransformerData contracts. Computes relative transforms between a source frame and multiple target frames attached to rigid bodies. Only requires body transforms (no velocities or accelerations).
Validation environment:Isaac-Lift-Cube-Franka-v0 (manager-based) — uses FrameTransformer to track end-effector pose relative to robot base. Also validates #5322 (manipulation support).
Store 6 outputs (source and target poses in world + relative)
OVPhysX API Requirements
API
Purpose
Notes
Body transforms
Rigid body poses for all tracked frames
Available via existing bindings
No new ovphysx APIs needed — only body transforms are required, which are already available through existing Articulation and (future) RigidObject bindings.
The key implementation question is how to create a single batched view spanning multiple distinct body paths. In PhysX, RigidBodyView accepts a glob expression. For ovphysx, the approach depends on whether TensorBindings can be queried by body index within an articulation, or whether a separate mechanism is needed.
Question for @marcodiiga: How to read transforms for arbitrary bodies (not just the root) from ovphysx? The Articulation's ARTICULATION_BODY_POSE binding returns all link poses — FrameTransformer needs to index into specific links by name.
Summary
Implement `FrameTransformer` and `FrameTransformerData` for the OVPhysX backend, satisfying the `BaseFrameTransformer` and `BaseFrameTransformerData` contracts. Computes relative transforms between a source frame and multiple target frames attached to rigid bodies.
Validation environment: `Isaac-Lift-Cube-Franka-v0` — tracks Franka end-effector pose relative to robot base.
Scope
OVPhysX API Question
How to read transforms for arbitrary bodies (not just root) from ovphysx? The Articulation's `ARTICULATION_BODY_POSE` binding returns all link poses — FrameTransformer needs to index into specific links. @marcodiiga to clarify.
Dependencies
Spec
Full design spec: `docs/superpowers/specs/2026-04-20-ovphysx-frame-transformer-design.md`
Parent issue: #5315
📋 Full Design Spec (click to expand)
OVPhysX FrameTransformer Sensor — Design Spec
Issue: #5320 — [OVPHYSX] FrameTransformer sensor
Date: 2026-04-20
Status: Draft
Summary
Implement
FrameTransformerandFrameTransformerDatafor the OVPhysX backend, satisfying theBaseFrameTransformerandBaseFrameTransformerDatacontracts. Computes relative transforms between a source frame and multiple target frames attached to rigid bodies. Only requires body transforms (no velocities or accelerations).Validation environment:
Isaac-Lift-Cube-Franka-v0(manager-based) — uses FrameTransformer to track end-effector pose relative to robot base. Also validates #5322 (manipulation support).Contract to Satisfy
BaseFrameTransformer
Inherits
SensorBase. Additional abstract:dataBaseFrameTransformerDatanum_bodiesintbody_nameslist[str]_initialize_impl()_update_buffers_impl(env_mask)BaseFrameTransformerData
target_frame_nameslist[str]target_pose_source(N, M)wp.transformftarget_pos_source(N, M)wp.vec3ftarget_quat_source(N, M)wp.quatftarget_pose_w(N, M)wp.transformftarget_pos_w(N, M)wp.vec3ftarget_quat_w(N, M)wp.quatfsource_pose_w(N,)wp.transformfsource_pos_w(N,)wp.vec3fsource_quat_w(N,)wp.quatfWhere N=num_envs, M=num_target_frames.
Architecture
File Layout
Implementation Pattern
frame_transformer.py:
_initialize_impl()(most complex part):_source_raw_indices: maps env → position in raw transform array_target_raw_indices: maps (env, frame) → position in raw transform array_update_buffers_impl(env_mask):frame_transformer_update_kernelwith 2D grid(num_envs, num_target_frames):target_relative = source_inverse * target_offsetOVPhysX API Requirements
No new ovphysx APIs needed — only body transforms are required, which are already available through existing Articulation and (future) RigidObject bindings.
The key implementation question is how to create a single batched view spanning multiple distinct body paths. In PhysX,
RigidBodyViewaccepts a glob expression. For ovphysx, the approach depends on whether TensorBindings can be queried by body index within an articulation, or whether a separate mechanism is needed.Question for @marcodiiga: How to read transforms for arbitrary bodies (not just the root) from ovphysx? The Articulation's
ARTICULATION_BODY_POSEbinding returns all link poses — FrameTransformer needs to index into specific links by name.Warp Kernels
frame_transformer_update_kernelTests
Source:
source/isaaclab_physx/test/sensors/test_frame_transformer.pyTarget:
source/isaaclab_ovphysx/test/sensors/test_frame_transformer.pyValidation
Isaac-Lift-Cube-Franka-v0:Dependencies
Estimated Scope
frame_transformer.py: ~500 lines (initialization is complex, update is simple)frame_transformer_data.py: ~150 lineskernels.py: ~100 lines