URDF-conditioned Graph IK
Learned inverse kinematics that reads a robot's URDF as a kinematic graph and solves IK for arms it was not
trained on, with no previous joint state required. Each folder experiments/<name>/ holds model.pt,
config.json, metrics.json, tables/ (CSV / Markdown / LaTeX) and videos/.
Experiments: main_s0
Main results
| set |
stage |
pos_mm_med |
pos_mm_p95 |
rot_deg_med |
succ_strict |
succ_std |
succ_loose |
| seen robots |
net |
0.6957 |
3.719 |
0.02577 |
0.6772 |
0.9648 |
0.9805 |
| seen robots |
full |
1.666e-05 |
0.0001229 |
9.224e-07 |
0.9912 |
0.9944 |
0.9954 |
| seen-robot variants |
net |
0.7449 |
4.171 |
0.02641 |
0.6406 |
0.9568 |
0.9756 |
| seen-robot variants |
full |
1.863e-05 |
0.0001333 |
9.224e-07 |
0.9897 |
0.9917 |
0.9932 |
| unseen robots |
net |
3.996 |
21.59 |
1.167 |
0.2122 |
0.4849 |
0.761 |
| unseen robots |
full |
2.98e-05 |
0.0001647 |
1.05e-06 |
0.9683 |
0.9756 |
0.9792 |
| unseen-robot variants |
net |
4.226 |
23.35 |
1.37 |
0.1899 |
0.4797 |
0.7573 |
| unseen-robot variants |
full |
2.98e-05 |
0.0001686 |
1.05e-06 |
0.969 |
0.9756 |
0.9785 |
Baselines
| set |
method |
succ_std |
pos_mm_med |
ms_per_query |
| seen robots |
ours_full |
0.9925 |
1.49e-05 |
0.9091 |
| seen robots |
ours_net_only |
0.965 |
0.6872 |
0.6511 |
| seen robots |
ours_proposals_only |
0.095 |
12.4 |
0.1345 |
| seen robots |
ours_refiner_only |
0.705 |
1.656 |
0.26 |
| seen robots |
dls_multistart_9 |
0.9625 |
2.985e-05 |
0.2568 |
| seen robots |
copy_seed(ฯ=0.05) |
0 |
63.67 |
0.1285 |
| seen robots |
pybullet_ik |
0.975 |
0.0001686 |
23.47 |
| seen robots |
ikpy |
0.86 |
8.429e-05 |
38.38 |
| seen-robot variants |
ours_full |
0.9825 |
1.49e-05 |
0.9078 |
| seen-robot variants |
ours_net_only |
0.9375 |
0.7847 |
0.6525 |
| seen-robot variants |
ours_proposals_only |
0.0525 |
19.4 |
0.1319 |
| seen-robot variants |
ours_refiner_only |
0.6225 |
2.364 |
0.259 |
| seen-robot variants |
dls_multistart_9 |
0.96 |
3.725e-05 |
0.2567 |
| seen-robot variants |
copy_seed(ฯ=0.05) |
0 |
74.74 |
0.1284 |
| seen-robot variants |
pybullet_ik |
0.975 |
0.000192 |
24.23 |
| seen-robot variants |
ikpy |
0.875 |
9.483e-05 |
40.03 |
| unseen robots |
ours_full |
0.975 |
2.98e-05 |
0.9095 |
| unseen robots |
ours_net_only |
0.48 |
4.2 |
0.78 |
| unseen robots |
ours_proposals_only |
0 |
132.6 |
0.1314 |
| unseen robots |
ours_refiner_only |
0.335 |
14.45 |
0.2601 |
| unseen robots |
dls_multistart_9 |
0.9575 |
4.47e-05 |
0.2566 |
| unseen robots |
copy_seed(ฯ=0.05) |
0 |
59.05 |
0.1288 |
| unseen robots |
pybullet_ik |
0.98 |
0.0001788 |
25.52 |
| unseen robots |
ikpy |
0.8925 |
8.677e-05 |
41.73 |
| unseen-robot variants |
ours_full |
0.965 |
2.98e-05 |
0.9108 |
| unseen-robot variants |
ours_net_only |
0.4775 |
4.365 |
0.7826 |
| unseen-robot variants |
ours_proposals_only |
0 |
146.8 |
0.1323 |
| unseen-robot variants |
ours_refiner_only |
0.3425 |
14.8 |
0.2599 |
| unseen-robot variants |
dls_multistart_9 |
0.9475 |
4.215e-05 |
0.3872 |
| unseen-robot variants |
copy_seed(ฯ=0.05) |
0 |
58.68 |
0.1287 |
| unseen-robot variants |
pybullet_ik |
0.9775 |
0.0002046 |
28.58 |
| unseen-robot variants |
ikpy |
0.865 |
8.429e-05 |
51.01 |
Ablations
| base |
n_seeds |
seen-robot variants none net succ_std |
seen-robot variants none net pos_mm_med |
unseen robots none net succ_std |
unseen robots none net pos_mm_med |
unseen robots none full succ_std |
unseen robots uniform net succ_std |
| main |
1 |
0.9568 |
0.7449 |
0.4849 |
3.996 |
0.9756 |
0.4482 |
Leave-one-robot-out
not run
Compute
| base |
n_seeds |
compute cuda b1 ms |
compute cuda b1024 ms |
compute cpu b1 ms |
compute cpu b256 ms |
train_min |
train_it_s |
train_gpu_GB |
| main |
1 |
170.8 |
671.2 |
114.6 |
4365 |
155.1 |
4.298 |
1.296 |
Load a model
from huggingface_hub import hf_hub_download
import torch
ck = torch.load(hf_hub_download("iFaz/urdf-graph-ik-journal-main", "experiments/main_s0/model.pt"), weights_only=False)