Whole-Body Inverse Kinematics with Graph Diffusion
GraphDiff-IK: https://arxiv.org/abs/2606.00086
Introduction
- Structure-aware graph diffusion framework for IK
- Robot = kinematic graph constructed from URDF
- Nodes = actuated joints
- Edges = kinematic dependencies
- IK formulated as conditional graph diffusion that directly generates joint configurations on the robot graph
- Architecture choices:
- "Hierarchical stage-wise message passing"
- Torso-aware conditioning
- Training strategies:
- Noisy FK feedback
- Task-space supervision
- Architecture is generalizable to many robot embodiments (single-arm, dual-arm, robots with torso/waist structures, ...)
- They test on Galaxea R1 Pro, Franka Emika Panda, Unitree G1, UR10, AgileX Piper
Results
Below is a selected subset, see Tables II and III in the paper for full results.
- Evaluation metrics:
- End-effector position (Euclidean distance; mm) + orientation error (angular distance; degrees)
- Reported over 100 randomly sampled target poses
- For dual-arm robotic systems, metrics are reported separately for left and right arms
- Implementation details:
- Inference: 100 denoising timesteps; DDIM scheduler
- Model dimensions:
- Franka Emika Panda: 7-DoF fixed base
- Position error: 3.47 ± 2.47 mm (mean ± std)
- Rotation error: 0.87 ± 0.69 deg
- Unitree G1: 14-DoF dual arm with waist
- Position error: 0.82 ± 0.68 mm
- Rotation error: 0.33 ± 0.24 deg
- Galaxea R1 Pro: 18-DoF dual arm with torso
- Position error: 5.99 ± 4.48 mm
- Rotation error: 0.62 ± 0.40 deg
Next steps
- Decrease inference cost of diffusion (increase inference efficiency)
- Current method does not consider collision avoidance, dynamic constraints, or temporal motion consistency.
Methods
- Data generation: generate IK dataset using FK
- Sample joint configurations uniformly within joint limits defined by URDF → to generate data pairs
- For robots with multiple kinematic branches (e.g. dual-arm systems, humanoids), FK is computed independently for each end-effector: where = number of end-effectors, and represent the position and orientation of the -th end-effector.
- Takes "a few minutes" to generate datasets on the scale of samples
- Diffusion training: learn the distribution using a graph diffusion model
- Forward: noise joint configurations
- Reverse: model learns to denoise
- Architecture: "structure-aware GCN with staged message passing"
- Objectives: diffusion loss + FK-based task-space supervision
- Inference: , diffusion iterative denoising
Graph representation of robot kinematics
where each node = actuated joint & each edge = kinematic dependency between two connected joints.
- 💡 TL;DR:
- Node: what kind of joint am I + what is my current state?
- Edge: how am I physically attached to my neighboring joint?
Actuated joint = a connection point in a mechanical system that is actively driven to move by a power source, such as an electric, hydraulic, or pneumatic motor.
- Edges connect adjacent actuate joints, and stores the rigid transform between them as an edge feature
- Fixed joints in between are collapsed into that transform rather than becoming graph nodes themselves.
- 🔖 Example: for a Franka Panda, the physical chain is approx: So GraphDiff-IK's graph would have each as a graph node and graph edges : with edge features like: where and are the relative translation and rotation locating joint 4 w.r.t. joint 3, and is joint 4's rotation axis.
- For a dual-arm robot, we might expect a graph like:
┌── left_shoulder ── left_elbow ── left_wrist
waist ── torso ─────┤
└── right_shoulder ─ right_elbow ─ right_wrist
Node representation
For each node , the node feature is defined as: where = joint angle, = joint axis, = joint limits, = structural information associated with the joint.
- Joint axis: specifies the direction about which/along which that joint moves
- e.g. for a revolute joint, the axis is a 3D unit vector expressed in the joint's local frame: For example, a hinge that rotates around the vertical direction has joint axis .
- A prismatic joint that translates along -axis has joint axis
- Structural encoding: "structural info associated w/ the joint"
- 💡 Captures metadata - "where does this joint live in the robot's kinematic tree?"
- 3 components:
- Joint depth = how many levels away from the root of the kinematic tree is this joint? (e.g. in Panda has depth 0)
- Kind of like positional encoding in a transformer - token count + where token occurs → joint properties + where joint occurs in robot
- Branch embedding: distinguishes different kinematic branches
- e.g. a left elbow and right elbow might have similar depth, joint limits, and joint axes, but they're not interchangeable → so the network gets something like
- (For multi-branch systems only) Node-type embedding: embeds "left arm" vs. "torso" vs. "right arm"
- Paper doesn't make it too clear how this is different from the branch embedding
- Joint depth = how many levels away from the root of the kinematic tree is this joint? (e.g. in Panda has depth 0)
Edge representation
For each edge connecting a parent joint to a child joint, the edge feature is defined as: where and denote the relative translation and rotation of the child joint w.r.t. the parent joint, and = joint axis of the child joint.
Graph diffusion for IK
At diffusion step , the robot state is represented as a graph: where = noisy node features at step and = fixed graph topology defined by robot kinematic structure (#Edge representation).
- 💡 Noising / denoising is only applied to the node features corresponding to joint states, while the graph connectivity remains unchanged throughout the denoising process.
Forward process
Iteratively noise a clean joint configuration : s.t. .
Reverse process
Denoising model where is the noisy graph at diffusion step , is the diffusion timestep, and denotes conditioning information.
Conditioning information
where and = target EE position and orientation; and = noisy EE observation obtained via applying FK to the noisy joint configuration: For multi-branch systems, the conditioning extends to include branch-specific target poses and noisy FK observations for each EE.
Structure-aware graph convolution
Flat network: GraphDiff-IK uses "structure-aware message passing" instead: each joint updates its hidden representation by receiving messages from neighboring joints.
Paper claim: Modeling robot kinematic structural dependencies as a graph achieves better performance than using a flat vector .
Transformer-based graph convolution
Core idea: Transformer attention, restricted to the robot graph.
- For a normal transformer, token can attend to every token . Here, joint only attends to its graph neighbors and the attention uses the physical relation between the two joints through the edge feature .
- Node update: where is the feature of node at layer , = neighborhood of node , = edge feature between nodes and . Attention coefficients are computed as: where and are learnable projection matrices and denotes feature dimension.
- is the model's internal representation of joint at layer . At layer 0 (i.e. input to the neural network), we have : after the network starts processing that node, it gets transformed into some hidden vector .
- At layer , the goal is to produce a better representation . Conceptually, we have:
- The attention coefficients answer, "who should I listen to?" -- a query from node vs. key from node + edge geometry.
- Query:
- "What kind of information does joint currently need?"
- Key:
- "What does joint contain () in the context of its physical relationship to ()?"
- 💡 If is large (query and key vectors align strongly) -- the information represented by neighbor "looks relevant" to what node needs right now.
- Query:
- 🔑 This allows the model to "adaptively aggregate neighboring information" based on node features and local kinematic relationships (encoded in edge attributes)
Difference between vanilla transformer and this graph-based transformer: A vanilla transformer on might allow directly, i.e. every joint can attend to every joint. Graph TransformerConv instead imposes , s.t. rather than , , etc. It also explicitly injects to tell the attention mechanism the geometry of each connection.
- Vanilla transformer: treats every pair of tokens as equally directly related
- Graph TransformerConv: communicate first along actual physical kinematic connections
Conditional feature modulation
Task-space conditioning via FiLM. This section specifies how conditioning is injected, (#Conditioning mechanism) specifies what the conditioning actually contains, and where each part is used.
Given a conditioning vector , a MLP predicts scaling and bias parameters: and the node features are normalized then modulated aswhere denotes element-wise multiplication.
- 🔑 FiLM enables the graph convolution process to adaptively adjust feature propagation according to the diffusion timestep, target EE pose, and noisy FK observations.
- 🔑 FiLM is how conditioning is generally done in this model: central conditioning pipeline is -
Stage-wise graph convolution
Stage-wise framework to explicitly model hierarchical dependencies in multi-branch robotic systems: instead of doing message passing uniformly over the entire graph, GraphDiff-IK decomposes the robot graph into structure-aware subgraphs: where contains torso-related joints and contains arm-related branches.
- Stage 1: Torso modeling
- Message passing is performed only on the torso subgraph: where denotes the torso node features after graph convolution (i.e. the collection of updated hidden features for all torso joints).
- The torso feature are then aggregated into a shared latent representation: where denotes a learnable projection function.
- 💡 Conceptually is a compact learned summary of the shared torso context (e.g. might encode things like: current noisy torso configuration, which way the torso is oriented, information about the targets that have been injected into the torso features, ...)
- Stage 2: Branch-aware arm reasoning
- Message passing is performed on arm-related subgraphs, conditioned on the shared torso latent representation
- Each EE arm is processed independently: e.g. for dual-arm setup, the left-arm and right-arm branches have branch-specific conditioning functions: where and denote branch-specific conditioning information.
- Branch-specific conditioning information: timestep, this EE's target pose, noisy FK feedback
- ❓ Why not let the left arm directly reason about the entire right arm?
- GraphDiff-IK's inductive bias - most detailed reasoning is local.
- So they compress shared information through the torso latent instead: This embeds the architectural hint that - the arms are distinct branches, but they coordinate through a shared upstream body.
- Stage 3: Global refinement
- Perform message passing over the full graph: This lets information flow across the complete robot so that final representations can reconcile cross-branch interactions.
- 🔑 Core idea: local specialization first, global reconciliation last
- ❓ Why isn't Stage 3 alone sufficient - i.e. running over the entire robot every layer?
- This paper's central argument is that inductive bias improves model performance on the IK task:
- Uniform graph message passing says - all edges are graph edges; learn whatever structure matters.
- GraphDiff-IK's staged architecture says - we already know that torso joints are shared upstream variables; arms are downstream branches → let's force computation to respect that hierarchy.
- This paper's central argument is that inductive bias improves model performance on the IK task:
- ❓ Why isn't Stage 3 alone sufficient - i.e. running over the entire robot every layer?
TL;DR: First reason about the shared body, then let each limb solve its own task given that body, then check everything together.
Conditioning mechanism
Hierarchical conditioning mechanism that incorporates both task-level objectives & state-dependent geometric feedback.
Conditioning consists of 3 components:
- Diffusion timestep encoding - "where am I in the diffusion process?"
- Target end-effector pose encoding - "where should the hand end up?"
- Noisy FK feedback - "where would the current noisy joints put the hand right now?"
These conditioning signals are encoded into latent representations and injected into the graph diffusion network through the FiLM-based feature modulation mechanism described in (#Conditional feature modulation).
Timestep encoding
Sinusoidal positional embedding: Provides the network with global information regarding the current diffusion stage.
Target pose encoding
For multi-branch robots, branch-specific target pose conditions are constructed independently for each EE.
Noisy FK feedback
Intuition: telling the network "move the hand to " merely informs it of the goal → but if we don't tell the network where the hand currently is, it doesn't know which way to move.
- Target gives
- Current noisy config gives
- Run FK on : = current noisy EE position and EE orientation
- Encode:
This is what the paper means by "state-dependent geometric feedback" - the condition depends on the current state , not merely the task.
Multi-arm case
If there are two end effectors and , construct branch-specific conditions: i.e.,
- left arm condition = current diffusion stage + left hand's desired pose + left hand's current noisy pose
- right arm condition = current diffusion stage + right hand's desired pose + right hand's current noisy pose
Hierarchical conditioning formulation
- Global latent representation extracted from the torso subgraph:
- Augment each local condition (global + local - hence "hierarchical")
Stage-wise conditioning usage
Conditioning mechanism is injected hierarchically throughout the structure-aware graph reasoning process - i.e. global and local conditioning enter at different stages in (#Stage-wise graph convolution).
- Stage 1: global conditioning
- Stage 2: branch-specific conditioning vectors
- Stage 3: global conditioning + local info → jointly integrated in full-graph refinement
Training objective
Losses used (summed at optimization):
- Diffusion loss: noise prediction loss
- FK loss: use predicted noise to reconstruct to apply FK task-space supervision:
Multi-end-effector version: compute this independently for each branch; branch losses are summed during optimization.
Late-step FK supervision
FK loss is only active during the later stages of the denoising process, because joint configurations are too noisy s.t. FK observations are not geometrically meaningful at large . So, they gate FK supervision by an indicator function of : where denotes the FK supervision threshold.
Combined training objective
Inference
Iterative denoising, DDIM 100 steps