dhb-xr 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- dhb_xr/__init__.py +61 -0
- dhb_xr/cli.py +206 -0
- dhb_xr/core/__init__.py +28 -0
- dhb_xr/core/geometry.py +167 -0
- dhb_xr/core/geometry_torch.py +77 -0
- dhb_xr/core/types.py +113 -0
- dhb_xr/database/__init__.py +10 -0
- dhb_xr/database/motion_db.py +79 -0
- dhb_xr/database/retrieval.py +6 -0
- dhb_xr/database/similarity.py +71 -0
- dhb_xr/decoder/__init__.py +13 -0
- dhb_xr/decoder/decoder_torch.py +52 -0
- dhb_xr/decoder/dhb_dr.py +261 -0
- dhb_xr/decoder/dhb_qr.py +89 -0
- dhb_xr/encoder/__init__.py +27 -0
- dhb_xr/encoder/dhb_dr.py +418 -0
- dhb_xr/encoder/dhb_qr.py +129 -0
- dhb_xr/encoder/dhb_ti.py +204 -0
- dhb_xr/encoder/encoder_torch.py +54 -0
- dhb_xr/encoder/padding.py +82 -0
- dhb_xr/generative/__init__.py +78 -0
- dhb_xr/generative/flow_matching.py +705 -0
- dhb_xr/generative/latent_encoder.py +536 -0
- dhb_xr/generative/sampling.py +203 -0
- dhb_xr/generative/training.py +475 -0
- dhb_xr/generative/vfm_tokenizer.py +485 -0
- dhb_xr/integration/__init__.py +13 -0
- dhb_xr/integration/vla/__init__.py +11 -0
- dhb_xr/integration/vla/libero.py +132 -0
- dhb_xr/integration/vla/pipeline.py +85 -0
- dhb_xr/integration/vla/robocasa.py +85 -0
- dhb_xr/losses/__init__.py +16 -0
- dhb_xr/losses/geodesic_loss.py +91 -0
- dhb_xr/losses/hybrid_loss.py +36 -0
- dhb_xr/losses/invariant_loss.py +73 -0
- dhb_xr/optimization/__init__.py +72 -0
- dhb_xr/optimization/casadi_solver.py +342 -0
- dhb_xr/optimization/constraints.py +32 -0
- dhb_xr/optimization/cusadi_solver.py +311 -0
- dhb_xr/optimization/export_casadi_decode.py +111 -0
- dhb_xr/optimization/fatrop_solver.py +477 -0
- dhb_xr/optimization/torch_solver.py +85 -0
- dhb_xr/preprocessing/__init__.py +42 -0
- dhb_xr/preprocessing/diagnostics.py +330 -0
- dhb_xr/preprocessing/trajectory_cleaner.py +485 -0
- dhb_xr/tokenization/__init__.py +56 -0
- dhb_xr/tokenization/causal_encoder.py +54 -0
- dhb_xr/tokenization/compression.py +749 -0
- dhb_xr/tokenization/hierarchical.py +359 -0
- dhb_xr/tokenization/rvq.py +178 -0
- dhb_xr/tokenization/vqvae.py +155 -0
- dhb_xr/utils/__init__.py +24 -0
- dhb_xr/utils/io.py +59 -0
- dhb_xr/utils/resampling.py +66 -0
- dhb_xr/utils/xdof_loader.py +89 -0
- dhb_xr/visualization/__init__.py +5 -0
- dhb_xr/visualization/plot.py +242 -0
- dhb_xr-0.2.1.dist-info/METADATA +784 -0
- dhb_xr-0.2.1.dist-info/RECORD +82 -0
- dhb_xr-0.2.1.dist-info/WHEEL +5 -0
- dhb_xr-0.2.1.dist-info/entry_points.txt +2 -0
- dhb_xr-0.2.1.dist-info/top_level.txt +3 -0
- examples/__init__.py +54 -0
- examples/basic_encoding.py +82 -0
- examples/benchmark_backends.py +37 -0
- examples/dhb_qr_comparison.py +79 -0
- examples/dhb_ti_time_invariant.py +72 -0
- examples/gpu_batch_optimization.py +102 -0
- examples/imitation_learning.py +53 -0
- examples/integration/__init__.py +19 -0
- examples/integration/libero_full_demo.py +692 -0
- examples/integration/libero_pro_dhb_demo.py +1063 -0
- examples/integration/libero_simulation_demo.py +286 -0
- examples/integration/libero_swap_demo.py +534 -0
- examples/integration/robocasa_libero_dhb_pipeline.py +56 -0
- examples/integration/test_libero_adapter.py +47 -0
- examples/integration/test_libero_encoding.py +75 -0
- examples/integration/test_libero_retrieval.py +105 -0
- examples/motion_database.py +88 -0
- examples/trajectory_adaptation.py +85 -0
- examples/vla_tokenization.py +107 -0
- notebooks/__init__.py +24 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
dhb_xr/__init__.py,sha256=OGQACX9IP1hbUMgUDIOEGBlEbRFXNd2nncxJL5qOhwk,1381
|
|
2
|
+
dhb_xr/cli.py,sha256=BijyoMJN6K1VtbTAuDnMQa8_2x60zfRrJRmz-lYj6RY,7021
|
|
3
|
+
dhb_xr/core/__init__.py,sha256=hJYdZzd9gz7O8K1FuE_qE981sr_-2q_gLDTRz9COv7E,593
|
|
4
|
+
dhb_xr/core/geometry.py,sha256=UMkoS_zkKnPeT4KFJJwyNCxCESIXsFVFcmIF2Q_c2go,5090
|
|
5
|
+
dhb_xr/core/geometry_torch.py,sha256=0dUt_00r6v1bPugd3943mEPNJyRh1oF4QhhUewwhpV0,2832
|
|
6
|
+
dhb_xr/core/types.py,sha256=YdU6UpieQD0YjUKJox3cDLHxa7fHpBljO88c6fYd8rc,3671
|
|
7
|
+
dhb_xr/database/__init__.py,sha256=32HgJVcHcoLVevq1RioM0BJUl-wNRLu9QCln0RHFh4k,315
|
|
8
|
+
dhb_xr/database/motion_db.py,sha256=pnTrcXuswITtapUGKb2EWIaGfsd7c30mtlEEcVj2zv0,3099
|
|
9
|
+
dhb_xr/database/retrieval.py,sha256=e4_pewBFtQGAhPeiOAZfoQjQWlrjoD13qzlw2Dt3pVg,279
|
|
10
|
+
dhb_xr/database/similarity.py,sha256=rNtZEJJCAUuiX3rE_u-zEpW1gmDIa_Fwl68NoWMF9RM,2531
|
|
11
|
+
dhb_xr/decoder/__init__.py,sha256=I9h9Nzzu6ZTrZlFHVzBb-okNEJueSk3R3SLAipCGTlw,262
|
|
12
|
+
dhb_xr/decoder/decoder_torch.py,sha256=KVXgG3n9fDQeIsAqy_6R2V5lB6wrgG8OxLzeSo2C2lY,2133
|
|
13
|
+
dhb_xr/decoder/dhb_dr.py,sha256=dmkxLzUM1YmbKFtoOZ7hsLG0YW_nFxAlF4XsyA7BwMQ,9375
|
|
14
|
+
dhb_xr/decoder/dhb_qr.py,sha256=U-5YBFTGtUqpl3nVCf6pQIkQRf46sREknJ1mWZhb1WI,2969
|
|
15
|
+
dhb_xr/encoder/__init__.py,sha256=j69h5aslEbpBoEiYv0oqKMhMox_2KoBpbMEIqr3Be9E,691
|
|
16
|
+
dhb_xr/encoder/dhb_dr.py,sha256=ogLzF1Kx9-eFTtKSGoXgB65GQhMWRSpP4ql5KtANtRg,15448
|
|
17
|
+
dhb_xr/encoder/dhb_qr.py,sha256=LnBczpW9nRyM5GgGUHfvcWYuB6h46o95tNXzXMK8yQI,4580
|
|
18
|
+
dhb_xr/encoder/dhb_ti.py,sha256=P2QiZy2_7JWYEYDNpbGAzArnCZxDi_2iz2-8DtiWjrs,6611
|
|
19
|
+
dhb_xr/encoder/encoder_torch.py,sha256=LM-B6gTAkxcyxZWThJ5EXamvuithnVd_mbKnqGxAIPo,1986
|
|
20
|
+
dhb_xr/encoder/padding.py,sha256=vq9XtHBOayq94sTnc9BU4AR6wB0fGGivcRlPgu-g5iA,2741
|
|
21
|
+
dhb_xr/generative/__init__.py,sha256=acS5iNWRcWmJ-AlWKu7P8qpoER5QXi3f4D6FLePtdic,2269
|
|
22
|
+
dhb_xr/generative/flow_matching.py,sha256=tSryjgekkCGjTUgMHNd8Xw7oQIpHN6cypZ7OaR5VmAU,21442
|
|
23
|
+
dhb_xr/generative/latent_encoder.py,sha256=oREET0kAyE4z38s0lkMRzlrVJKCi2g6B--peWPmr6BU,16123
|
|
24
|
+
dhb_xr/generative/sampling.py,sha256=uIkOywq9_6m_YrKjhAQXv1SlvDzqHG5I3XdLs-dHlyw,5653
|
|
25
|
+
dhb_xr/generative/training.py,sha256=bVT9DhQxEJ2cL0pkKtve3J3vmeBfaf1ZLv7U4Vjv6Eg,14559
|
|
26
|
+
dhb_xr/generative/vfm_tokenizer.py,sha256=agH_0ok0EwR9b79Eo9651gtq4CKI6qzaF-VfsLGt3aU,15807
|
|
27
|
+
dhb_xr/integration/__init__.py,sha256=1nscdikjCAKmO0NHKQ0heFGYHVDRE9pRRLDsM0khFxU,234
|
|
28
|
+
dhb_xr/integration/vla/__init__.py,sha256=iw4SRn1Dbxjw5O5GgN71kRgMNbZnAh2-9SFJyjCqB48,291
|
|
29
|
+
dhb_xr/integration/vla/libero.py,sha256=dYjl9GB4_0HneZXxW4NpvrvefUwQmFOXUh1jcT047-8,4398
|
|
30
|
+
dhb_xr/integration/vla/pipeline.py,sha256=econak0wm-y8rrZvbRnwc9Ky7UFHYFIFho85EKdMx-E,2969
|
|
31
|
+
dhb_xr/integration/vla/robocasa.py,sha256=TfN_G4PWR1rME67gvaPfvE6QnOnbe0RHmUkYkvUza9U,2561
|
|
32
|
+
dhb_xr/losses/__init__.py,sha256=k0h45G3izn-mnLYG2gQaXnjULd3fBQasPP5pe3vdM4I,468
|
|
33
|
+
dhb_xr/losses/geodesic_loss.py,sha256=vlSnXDWqC1QLFzCQjMEDapKXlTTkDq5N83qaYXBEaRA,3030
|
|
34
|
+
dhb_xr/losses/hybrid_loss.py,sha256=sfMfSOEBUjWXRykD9XrJpLBf5wmf_VNwy_YZ06nST8w,1328
|
|
35
|
+
dhb_xr/losses/invariant_loss.py,sha256=FHLzlDWPjqHAa92XEv0_DPJWx0VM3zXvTgkFGCWhx3w,2627
|
|
36
|
+
dhb_xr/optimization/__init__.py,sha256=Ff5i4CpxtmaDl9TGdoByuBA4uWVfeIafOAYCfCqx4A4,2532
|
|
37
|
+
dhb_xr/optimization/casadi_solver.py,sha256=BQtKG8bu2lVUQc7S9-8rwsNbZVF8cWg7OSRZKZyTm4Q,12966
|
|
38
|
+
dhb_xr/optimization/constraints.py,sha256=MVrHJGHDT0D2aRfR1PmvCaEKxcvJxJZu8A_l1mr7ZwA,1046
|
|
39
|
+
dhb_xr/optimization/cusadi_solver.py,sha256=MYwNhC91mT2r23jk8jJcdljz_UOLVyuEHyxuRF-tovM,11297
|
|
40
|
+
dhb_xr/optimization/export_casadi_decode.py,sha256=sV3SjhRKaulIyCyqGCYeOGFYkrjKIPkNscZnmCxiZL4,3586
|
|
41
|
+
dhb_xr/optimization/fatrop_solver.py,sha256=49LlbsXjVPUx4B6WPCb33rFxry3VQW7NioI-eK9cU5k,16861
|
|
42
|
+
dhb_xr/optimization/torch_solver.py,sha256=YPnv3NR6zyC5eFim6-FUexHMR-1p3sFS0G1OCQRirbc,3536
|
|
43
|
+
dhb_xr/preprocessing/__init__.py,sha256=nJars3sC7erIn4vbbQkZKm9OGOteyerbHzDnoA6Tb2Q,1263
|
|
44
|
+
dhb_xr/preprocessing/diagnostics.py,sha256=ZNYdJjlcXHM1Gtm9MNoD922D5iEsUdHuAnKLaOO670Q,10986
|
|
45
|
+
dhb_xr/preprocessing/trajectory_cleaner.py,sha256=CZASDH35e9WrLS8uaaRg3ZRwEXke-6nvUck13mj3iW4,17036
|
|
46
|
+
dhb_xr/tokenization/__init__.py,sha256=YTr5Kg7mkkWbEBhVFXQErfKw-yGFv5A8Tb3tLpz9v54,1459
|
|
47
|
+
dhb_xr/tokenization/causal_encoder.py,sha256=rWm4vryH9NpNks3omr7aRBPk9ByhumHABpoTf1pkIPM,1681
|
|
48
|
+
dhb_xr/tokenization/compression.py,sha256=I-2QnB1bZpnvNucz6gWkFtuYhHS9uLudAOsbgoiZ_G0,25117
|
|
49
|
+
dhb_xr/tokenization/hierarchical.py,sha256=B8I0dZFZApPvH1ouAlUXYRBclcUTaygQQJ_r0fffL5k,13323
|
|
50
|
+
dhb_xr/tokenization/rvq.py,sha256=QMNqtjnKOF1oA10fD28rfODrOHoz_x9AUUPViuW7b8Q,5900
|
|
51
|
+
dhb_xr/tokenization/vqvae.py,sha256=duxkeqtznH6At2i6Cly_0eH6Tezc9YGe9PzWThrJfrA,5021
|
|
52
|
+
dhb_xr/utils/__init__.py,sha256=7y-Dqrb4yxxLsv2pUFKrayLtCdwpRVUCXi1oRE6SMuI,559
|
|
53
|
+
dhb_xr/utils/io.py,sha256=MbEQEqnqdl6_DHA31Ey98Uc-2ZCeyUfO-oQqRVdhR8U,2195
|
|
54
|
+
dhb_xr/utils/resampling.py,sha256=wlMt4rhqeeAH51uBxRYllpIZIE1xE0xSgFLB4OczyOU,2615
|
|
55
|
+
dhb_xr/utils/xdof_loader.py,sha256=uSbW_-l9PofC6KKqELY5JlKwgTqqkN4jE5_0HkgEgIk,2887
|
|
56
|
+
dhb_xr/visualization/__init__.py,sha256=ZnevC1zP2XqeTUXvH8zbbZdNs9YFQkCmlh3MjCao388,189
|
|
57
|
+
dhb_xr/visualization/plot.py,sha256=kqg-rNSqHvrP5-jCFkAWxvshBsE1py3MDGgZKSkZXYg,8083
|
|
58
|
+
examples/__init__.py,sha256=Lg0Tu6f20oyoCxWyl7MFDmgT6KYJL6Jd7zGG7SnRyJc,2077
|
|
59
|
+
examples/basic_encoding.py,sha256=XHytFrSEBcznmDSQbW_U_70qp7zet2mIjUjd_-eOcKw,2591
|
|
60
|
+
examples/benchmark_backends.py,sha256=6mvc0douictQ7zhaiQ5zHj9GvbhhSoDf4x0lgXELdcs,1233
|
|
61
|
+
examples/dhb_qr_comparison.py,sha256=xPLfA0ysAoytJHqdxLZELYk2QlEEGpVOodRUDCJYawo,2697
|
|
62
|
+
examples/dhb_ti_time_invariant.py,sha256=i0vz-pQTnddiQ-s0DpjpR8yT0i9Ic0aGRDmV8S2TrOc,2822
|
|
63
|
+
examples/gpu_batch_optimization.py,sha256=jv-Am9p5q4StK8FOpCiAVBpOMxWGLsu7mT7mLkJI2RI,3119
|
|
64
|
+
examples/imitation_learning.py,sha256=yWgZD0qIFJK2QMzMV_UWWnHi-S3EIaiNbvp1Qym3zkE,1879
|
|
65
|
+
examples/motion_database.py,sha256=Wvtc2bowMkdrNJJrVt-ORYGBY03OdKgD54RDvYmQlco,2891
|
|
66
|
+
examples/trajectory_adaptation.py,sha256=B6RRHHuc-JcOTQLZjv5U8UVwL4wVd6ZaZcga_P2rsec,2615
|
|
67
|
+
examples/vla_tokenization.py,sha256=TWejgxv5c9X8IJwNK3GR_5fmiVyBqPI7qaeqaquAk74,3239
|
|
68
|
+
examples/integration/__init__.py,sha256=SFF025lM9aV02z9QwKm4rrk6aUD0wy-9RjwRgQ8Gf0o,674
|
|
69
|
+
examples/integration/libero_full_demo.py,sha256=tgmtXjbdR4U3GI4trBI62ar8HlGeWOxHBMIBCDdRuC4,24601
|
|
70
|
+
examples/integration/libero_pro_dhb_demo.py,sha256=QT03UvkInuoPCtWM-9x7iF7R13JstiX1wfDQccBdi7U,44642
|
|
71
|
+
examples/integration/libero_simulation_demo.py,sha256=mIQVU1EnwMcgVhR318gcNN306miBt_yBdaCg6tjBQwQ,8869
|
|
72
|
+
examples/integration/libero_swap_demo.py,sha256=JqgnxGYLJ6LdQKb_1EQLvjQLf8-Wnpv6R-5MvDnechA,23422
|
|
73
|
+
examples/integration/robocasa_libero_dhb_pipeline.py,sha256=WXR8LcPwMg_rrGxjLG0kjfpivH9RFiKCp7k1xZGKCf4,2103
|
|
74
|
+
examples/integration/test_libero_adapter.py,sha256=JtY1__4cXNSiXf0e52J3_SAecBU2qGQvUiyrZ_GGVVk,1837
|
|
75
|
+
examples/integration/test_libero_encoding.py,sha256=Zc7O5UGkTKyJSjzM-hrgGkt7Y8JQScwtqU1pg-Ak-4E,2654
|
|
76
|
+
examples/integration/test_libero_retrieval.py,sha256=xYPpq6iLGTbO4VT6gWuV-q5eCG4tjaUtWtI4QFbMC-o,3264
|
|
77
|
+
notebooks/__init__.py,sha256=1wsz8H_tTQauGz70WLbu0sabmVXSczWgIz48lZH97Sw,678
|
|
78
|
+
dhb_xr-0.2.1.dist-info/METADATA,sha256=AJoBsoNzwCnnJ20SajWHqqnTzKj84b3zf_DgQTL7yz8,27562
|
|
79
|
+
dhb_xr-0.2.1.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
|
|
80
|
+
dhb_xr-0.2.1.dist-info/entry_points.txt,sha256=o5_lMpoEN0MDfU478Wi7eJc3oDa9OedgalKQ438KLJM,60
|
|
81
|
+
dhb_xr-0.2.1.dist-info/top_level.txt,sha256=dmAG5ym8zm7WzB1r3Gy9Sp9Tvux3k41TUEy-2P-VRXY,26
|
|
82
|
+
dhb_xr-0.2.1.dist-info/RECORD,,
|
examples/__init__.py
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DHB-XR Examples Package
|
|
3
|
+
|
|
4
|
+
This package contains comprehensive examples demonstrating DHB-XR usage across
|
|
5
|
+
various robotics and VLA applications, including both Python scripts and Jupyter notebooks.
|
|
6
|
+
|
|
7
|
+
Quick Start Examples:
|
|
8
|
+
- basic_encoding: Core DHB-DR/DHB-QR encoding and decoding
|
|
9
|
+
- trajectory_adaptation: Retargeting trajectories to new poses
|
|
10
|
+
- dhb_qr_comparison: Comparing DHB-DR vs DHB-QR representations
|
|
11
|
+
- gpu_batch_optimization: Large-scale trajectory optimization
|
|
12
|
+
- vla_tokenization: DHB-Token for discrete action sequences
|
|
13
|
+
- motion_database: Similarity search and trajectory retrieval
|
|
14
|
+
- imitation_learning: Invariant-based imitation learning losses
|
|
15
|
+
- dhb_ti_time_invariant: Time-invariant reparameterization
|
|
16
|
+
|
|
17
|
+
VLA Integration Examples:
|
|
18
|
+
- libero_full_demo: Complete LIBERO simulation with DHB adaptation
|
|
19
|
+
- libero_pro_dhb_demo: LIBERO-PRO perturbation robustness testing
|
|
20
|
+
- libero_swap_demo: Spatial swap demonstration with naive vs DHB comparison
|
|
21
|
+
- robocasa_libero_dhb_pipeline: RoboCASA and LIBERO data processing pipeline
|
|
22
|
+
|
|
23
|
+
Tutorial Notebooks:
|
|
24
|
+
- tutorial_dhb_basics.ipynb: Basic encoding/decoding concepts
|
|
25
|
+
- tutorial_invariance_demo.ipynb: SE(3) invariance demonstration
|
|
26
|
+
- tutorial_umi_xdof_motion_analysis.ipynb: Real-world UMI dataset analysis
|
|
27
|
+
- demo_dhb_features_and_use_cases.ipynb: Comprehensive feature overview
|
|
28
|
+
- tutorial_vla_integration.ipynb: VLA integration with LIBERO/RoboCASA
|
|
29
|
+
|
|
30
|
+
Usage:
|
|
31
|
+
from dhb_xr_examples import *
|
|
32
|
+
# or import specific examples:
|
|
33
|
+
from dhb_xr_examples.basic_encoding import run_example
|
|
34
|
+
|
|
35
|
+
# Run notebooks with:
|
|
36
|
+
# jupyter notebook
|
|
37
|
+
# pixi run notebook
|
|
38
|
+
"""
|
|
39
|
+
|
|
40
|
+
__version__ = "0.2.0"
|
|
41
|
+
|
|
42
|
+
# Convenience imports for common examples
|
|
43
|
+
from .basic_encoding import run_example as run_basic_encoding
|
|
44
|
+
from .trajectory_adaptation import run_example as run_trajectory_adaptation
|
|
45
|
+
from .dhb_qr_comparison import run_example as run_dhb_comparison
|
|
46
|
+
|
|
47
|
+
def __dir__():
|
|
48
|
+
"""List all available examples."""
|
|
49
|
+
return [
|
|
50
|
+
'run_basic_encoding',
|
|
51
|
+
'run_trajectory_adaptation',
|
|
52
|
+
'run_dhb_comparison',
|
|
53
|
+
# Add more as needed
|
|
54
|
+
]
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Basic DHB Encoding and Decoding Example
|
|
3
|
+
|
|
4
|
+
This example demonstrates the core DHB-XR functionality: encoding SE(3) trajectories
|
|
5
|
+
to invariant representations and decoding them back to poses.
|
|
6
|
+
|
|
7
|
+
The example:
|
|
8
|
+
1. Creates a synthetic trajectory (50 poses with random walk positions)
|
|
9
|
+
2. Encodes to DHB-DR invariants using double-reflection method
|
|
10
|
+
3. Decodes back to reconstruct the original trajectory
|
|
11
|
+
4. Shows the shape preservation of the roundtrip encoding/decoding
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
import numpy as np
|
|
15
|
+
from dhb_xr import encode_dhb_dr, decode_dhb_dr
|
|
16
|
+
from dhb_xr.core.types import DHBMethod, EncodingMethod
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def run_example():
|
|
20
|
+
"""Run the basic encoding/decoding example."""
|
|
21
|
+
print("DHB-XR Basic Encoding Example")
|
|
22
|
+
print("=" * 40)
|
|
23
|
+
|
|
24
|
+
# Create synthetic trajectory
|
|
25
|
+
np.random.seed(42)
|
|
26
|
+
n = 50
|
|
27
|
+
positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
|
|
28
|
+
quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
29
|
+
|
|
30
|
+
print(f"Original trajectory: {n} poses")
|
|
31
|
+
print(f"Positions shape: {positions.shape}")
|
|
32
|
+
print(f"Quaternions shape: {quaternions.shape}")
|
|
33
|
+
|
|
34
|
+
# Encode to DHB invariants
|
|
35
|
+
print("\nEncoding to DHB-DR invariants...")
|
|
36
|
+
out = encode_dhb_dr(
|
|
37
|
+
positions,
|
|
38
|
+
quaternions,
|
|
39
|
+
method=EncodingMethod.POSITION,
|
|
40
|
+
use_default_initial_frames=True,
|
|
41
|
+
dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
42
|
+
)
|
|
43
|
+
print(f"Linear invariants shape: {out['linear_motion_invariants'].shape}")
|
|
44
|
+
print(f"Angular invariants shape: {out['angular_motion_invariants'].shape}")
|
|
45
|
+
|
|
46
|
+
# Decode back to poses
|
|
47
|
+
print("\nDecoding back to poses...")
|
|
48
|
+
decoded = decode_dhb_dr(
|
|
49
|
+
out["linear_motion_invariants"],
|
|
50
|
+
out["angular_motion_invariants"],
|
|
51
|
+
out["initial_pose"],
|
|
52
|
+
method=EncodingMethod.POSITION,
|
|
53
|
+
dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
54
|
+
drop_padded=True,
|
|
55
|
+
)
|
|
56
|
+
print(f"Decoded positions shape: {decoded['positions'].shape}")
|
|
57
|
+
print(f"Decoded quaternions shape: {decoded['quaternions'].shape}")
|
|
58
|
+
|
|
59
|
+
# Check reconstruction quality
|
|
60
|
+
pos_error = np.mean(np.abs(positions - decoded["positions"]))
|
|
61
|
+
quat_error = np.mean(np.abs(quaternions - decoded["quaternions"]))
|
|
62
|
+
|
|
63
|
+
print("
|
|
64
|
+
Reconstruction errors:")
|
|
65
|
+
print(".2e")
|
|
66
|
+
print(".2e")
|
|
67
|
+
|
|
68
|
+
if pos_error < 1e-10 and quat_error < 1e-10:
|
|
69
|
+
print("✅ Perfect reconstruction (errors within numerical precision)")
|
|
70
|
+
else:
|
|
71
|
+
print("⚠️ Reconstruction has some error - check parameters")
|
|
72
|
+
|
|
73
|
+
return out, decoded
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def main():
|
|
77
|
+
"""Main function for command-line execution."""
|
|
78
|
+
run_example()
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
if __name__ == "__main__":
|
|
82
|
+
main()
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"""Benchmark encode/decode backends (numpy, optional torch/cpp)."""
|
|
2
|
+
|
|
3
|
+
import time
|
|
4
|
+
import numpy as np
|
|
5
|
+
from dhb_xr import encode_dhb_dr, decode_dhb_dr
|
|
6
|
+
from dhb_xr.core.types import DHBMethod, EncodingMethod
|
|
7
|
+
|
|
8
|
+
def main():
|
|
9
|
+
n = 100
|
|
10
|
+
np.random.seed(0)
|
|
11
|
+
positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
|
|
12
|
+
quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
13
|
+
|
|
14
|
+
# Encode
|
|
15
|
+
start = time.perf_counter()
|
|
16
|
+
for _ in range(50):
|
|
17
|
+
out = encode_dhb_dr(
|
|
18
|
+
positions, quaternions,
|
|
19
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
20
|
+
)
|
|
21
|
+
elapsed = (time.perf_counter() - start) / 50
|
|
22
|
+
print(f"Encode (n={n}): {elapsed*1000:.2f} ms per call")
|
|
23
|
+
|
|
24
|
+
# Decode
|
|
25
|
+
start = time.perf_counter()
|
|
26
|
+
for _ in range(50):
|
|
27
|
+
decoded = decode_dhb_dr(
|
|
28
|
+
out["linear_motion_invariants"],
|
|
29
|
+
out["angular_motion_invariants"],
|
|
30
|
+
out["initial_pose"],
|
|
31
|
+
method=EncodingMethod.POSITION, dhb_method=DHBMethod.DOUBLE_REFLECTION, drop_padded=True,
|
|
32
|
+
)
|
|
33
|
+
elapsed = (time.perf_counter() - start) / 50
|
|
34
|
+
print(f"Decode: {elapsed*1000:.2f} ms per call")
|
|
35
|
+
|
|
36
|
+
if __name__ == "__main__":
|
|
37
|
+
main()
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DHB-DR vs DHB-QR Comparison Example
|
|
3
|
+
|
|
4
|
+
This example compares the two DHB invariant representations:
|
|
5
|
+
|
|
6
|
+
DHB-DR (Double-Reflection with Euler angles):
|
|
7
|
+
- 4 values per component: magnitude + 3 Euler angles
|
|
8
|
+
- Compact representation, may have gimbal lock issues
|
|
9
|
+
- Good for most applications
|
|
10
|
+
|
|
11
|
+
DHB-QR (Double-Reflection with Quaternions):
|
|
12
|
+
- 5 values per component: magnitude + unit quaternion (4 values)
|
|
13
|
+
- More robust to singularities, smoother interpolation
|
|
14
|
+
- Better for applications requiring quaternion-based losses
|
|
15
|
+
|
|
16
|
+
Both provide SE(3)-invariant representations, but DHB-QR is preferred
|
|
17
|
+
for applications involving quaternion operations or optimization.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import numpy as np
|
|
21
|
+
from dhb_xr.encoder.dhb_dr import encode_dhb_dr
|
|
22
|
+
from dhb_xr.encoder.dhb_qr import encode_dhb_qr
|
|
23
|
+
from dhb_xr.core.types import DHBMethod, EncodingMethod
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def run_example():
|
|
27
|
+
"""Run the DHB-DR vs DHB-QR comparison example."""
|
|
28
|
+
print("DHB-DR vs DHB-QR Comparison")
|
|
29
|
+
print("=" * 40)
|
|
30
|
+
|
|
31
|
+
# Create synthetic trajectory
|
|
32
|
+
n = 40
|
|
33
|
+
np.random.seed(1)
|
|
34
|
+
positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
|
|
35
|
+
quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
36
|
+
|
|
37
|
+
print(f"Trajectory: {n} poses")
|
|
38
|
+
print(f"Positions shape: {positions.shape}")
|
|
39
|
+
print(f"Quaternions shape: {quaternions.shape}")
|
|
40
|
+
|
|
41
|
+
# Encode with DHB-DR (Euler angles)
|
|
42
|
+
print("\nEncoding with DHB-DR (Euler angles)...")
|
|
43
|
+
out_dr = encode_dhb_dr(
|
|
44
|
+
positions,
|
|
45
|
+
quaternions,
|
|
46
|
+
method=EncodingMethod.POSITION,
|
|
47
|
+
use_default_initial_frames=True,
|
|
48
|
+
dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
49
|
+
)
|
|
50
|
+
print(f"DHB-DR linear invariants shape: {out_dr['linear_motion_invariants'].shape}")
|
|
51
|
+
print(f"DHB-DR angular invariants shape: {out_dr['angular_motion_invariants'].shape}")
|
|
52
|
+
|
|
53
|
+
# Encode with DHB-QR (Quaternions)
|
|
54
|
+
print("\nEncoding with DHB-QR (Quaternions)...")
|
|
55
|
+
out_qr = encode_dhb_qr(
|
|
56
|
+
positions,
|
|
57
|
+
quaternions,
|
|
58
|
+
method=EncodingMethod.POSITION,
|
|
59
|
+
use_default_initial_frames=True,
|
|
60
|
+
)
|
|
61
|
+
print(f"DHB-QR linear invariants shape: {out_qr['linear_motion_invariants'].shape}")
|
|
62
|
+
print(f"DHB-QR angular invariants shape: {out_qr['angular_motion_invariants'].shape}")
|
|
63
|
+
|
|
64
|
+
# Compare dimensions
|
|
65
|
+
print("\nDimension comparison:")
|
|
66
|
+
print(f"DHB-DR: {out_dr['linear_motion_invariants'].shape[1]} values per linear component")
|
|
67
|
+
print(f"DHB-QR: {out_qr['linear_motion_invariants'].shape[1]} values per linear component")
|
|
68
|
+
print("\nDHB-DR uses Euler angles (3 values), DHB-QR uses quaternions (4 values)")
|
|
69
|
+
|
|
70
|
+
return out_dr, out_qr
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def main():
|
|
74
|
+
"""Main function for command-line execution."""
|
|
75
|
+
run_example()
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
if __name__ == "__main__":
|
|
79
|
+
main()
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"""
|
|
2
|
+
DHB-TI: Time-invariant reparameterization.
|
|
3
|
+
|
|
4
|
+
Reparameterize by geometric progress (translational arc-length, angular, or hybrid)
|
|
5
|
+
and resample at uniform progress knots so invariants are approximately independent
|
|
6
|
+
of execution speed and sampling rate. Then encode with DHB-DR or DHB-QR.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
import numpy as np
|
|
10
|
+
from dhb_xr.encoder.dhb_ti import (
|
|
11
|
+
compute_progress,
|
|
12
|
+
resample_by_progress,
|
|
13
|
+
encode_dhb_dr_ti,
|
|
14
|
+
encode_dhb_qr_ti,
|
|
15
|
+
)
|
|
16
|
+
from dhb_xr.encoder.dhb_dr import encode_dhb_dr
|
|
17
|
+
from dhb_xr.core.types import DHBMethod, EncodingMethod
|
|
18
|
+
|
|
19
|
+
def main():
|
|
20
|
+
np.random.seed(42)
|
|
21
|
+
n = 50
|
|
22
|
+
positions = np.cumsum(np.random.randn(n, 3) * 0.01, axis=0)
|
|
23
|
+
quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
24
|
+
|
|
25
|
+
# Progress variables
|
|
26
|
+
progress_trans = compute_progress(positions, quaternions, kind="translation")
|
|
27
|
+
progress_angular = compute_progress(positions, quaternions, kind="angular")
|
|
28
|
+
progress_hybrid = compute_progress(positions, quaternions, kind="hybrid", alpha=0.5)
|
|
29
|
+
print("Progress (translation) total:", progress_trans[-1])
|
|
30
|
+
print("Progress (angular) total:", progress_angular[-1])
|
|
31
|
+
print("Progress (hybrid, α=0.5) total:", progress_hybrid[-1])
|
|
32
|
+
|
|
33
|
+
# Resample to M poses at uniform progress
|
|
34
|
+
M = 30
|
|
35
|
+
pos_m, quat_m = resample_by_progress(
|
|
36
|
+
positions, quaternions, M,
|
|
37
|
+
progress_kind="hybrid", alpha=0.5,
|
|
38
|
+
)
|
|
39
|
+
print("Resampled by progress: positions", pos_m.shape, "quaternions", quat_m.shape)
|
|
40
|
+
|
|
41
|
+
# Time-invariant encode (DHB-DR): same motion at different "speeds" gives similar invariants
|
|
42
|
+
out_ti = encode_dhb_dr_ti(
|
|
43
|
+
positions, quaternions, M,
|
|
44
|
+
progress_kind="hybrid", alpha=0.5,
|
|
45
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True,
|
|
46
|
+
dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
47
|
+
)
|
|
48
|
+
print("DHB-TI (DR) linear invariants shape:", out_ti["linear_motion_invariants"].shape)
|
|
49
|
+
|
|
50
|
+
# Compare: raw encode vs TI encode (raw depends on sampling density)
|
|
51
|
+
out_raw = encode_dhb_dr(
|
|
52
|
+
positions, quaternions,
|
|
53
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True,
|
|
54
|
+
dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
55
|
+
)
|
|
56
|
+
print("DHB-DR (raw) linear invariants shape:", out_raw["linear_motion_invariants"].shape)
|
|
57
|
+
|
|
58
|
+
# DHB-TI with DHB-QR
|
|
59
|
+
try:
|
|
60
|
+
out_ti_qr = encode_dhb_qr_ti(
|
|
61
|
+
positions, quaternions, M,
|
|
62
|
+
progress_kind="hybrid", alpha=0.5,
|
|
63
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True,
|
|
64
|
+
)
|
|
65
|
+
print("DHB-TI (QR) linear invariants shape:", out_ti_qr["linear_motion_invariants"].shape)
|
|
66
|
+
except ImportError:
|
|
67
|
+
print("DHB-QR not available; skip DHB-TI (QR).")
|
|
68
|
+
|
|
69
|
+
print("Done. Use progress_kind='translation'|'angular'|'hybrid' and alpha for rotation-dominant motions.")
|
|
70
|
+
|
|
71
|
+
if __name__ == "__main__":
|
|
72
|
+
main()
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"""
|
|
2
|
+
GPU Batched Trajectory Optimization Example
|
|
3
|
+
|
|
4
|
+
This example demonstrates batched trajectory optimization for processing multiple
|
|
5
|
+
trajectories simultaneously. Useful for:
|
|
6
|
+
|
|
7
|
+
- Large-scale trajectory adaptation datasets
|
|
8
|
+
- Real-time multi-trajectory optimization
|
|
9
|
+
- GPU-accelerated batch processing
|
|
10
|
+
|
|
11
|
+
The example:
|
|
12
|
+
1. Creates a demo trajectory (30 poses)
|
|
13
|
+
2. Defines two different start/goal pose pairs
|
|
14
|
+
3. Uses BatchedTrajectoryOptimizer to adapt the trajectory for both pairs
|
|
15
|
+
4. Shows the optimized results for both trajectories
|
|
16
|
+
|
|
17
|
+
For GPU acceleration, set device="cuda" (requires PyTorch CUDA).
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
import numpy as np
|
|
21
|
+
from dhb_xr.optimization.torch_solver import BatchedTrajectoryOptimizer
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def run_example():
|
|
25
|
+
"""Run the GPU batched trajectory optimization example."""
|
|
26
|
+
print("DHB-XR GPU Batched Trajectory Optimization")
|
|
27
|
+
print("=" * 45)
|
|
28
|
+
|
|
29
|
+
# Create demo trajectory
|
|
30
|
+
np.random.seed(1)
|
|
31
|
+
n = 30
|
|
32
|
+
demo_positions = np.cumsum(np.random.randn(n, 3) * 0.02, axis=0)
|
|
33
|
+
demo_quaternions = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
34
|
+
|
|
35
|
+
print(f"Demo trajectory: {n} poses")
|
|
36
|
+
print(f"Original start: {demo_positions[0]}")
|
|
37
|
+
print(f"Original goal: {demo_positions[-1]}")
|
|
38
|
+
|
|
39
|
+
# Define two different start/goal pairs for batch optimization
|
|
40
|
+
init_poses = [
|
|
41
|
+
{
|
|
42
|
+
"position": demo_positions[0].copy(),
|
|
43
|
+
"quaternion": demo_quaternions[0].copy()
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"position": demo_positions[0].copy() + np.array([0.05, 0, 0]),
|
|
47
|
+
"quaternion": demo_quaternions[0].copy()
|
|
48
|
+
},
|
|
49
|
+
]
|
|
50
|
+
goal_poses = [
|
|
51
|
+
{
|
|
52
|
+
"position": demo_positions[-1].copy(),
|
|
53
|
+
"quaternion": demo_quaternions[-1].copy()
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"position": demo_positions[-1].copy() + np.array([0.1, 0.05, 0]),
|
|
57
|
+
"quaternion": demo_quaternions[-1].copy()
|
|
58
|
+
},
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
print("
|
|
62
|
+
Batch optimization setup:")
|
|
63
|
+
print(f"Trajectory 0: {init_poses[0]['position']} → {goal_poses[0]['position']}")
|
|
64
|
+
print(f"Trajectory 1: {init_poses[1]['position']} → {goal_poses[1]['position']}")
|
|
65
|
+
|
|
66
|
+
# Run batched optimization
|
|
67
|
+
print("\nRunning batched optimization...")
|
|
68
|
+
optimizer = BatchedTrajectoryOptimizer(device="cpu", dhb_method="double_reflection")
|
|
69
|
+
adapted_pos, adapted_quat = optimizer.optimize(
|
|
70
|
+
demo_positions, demo_quaternions,
|
|
71
|
+
init_poses, goal_poses,
|
|
72
|
+
num_steps=20,
|
|
73
|
+
lr=1e-2,
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
print(f"✅ Optimization complete")
|
|
77
|
+
print(f"Adapted positions shape: {adapted_pos.shape}")
|
|
78
|
+
print(f"Adapted quaternions shape: {adapted_quat.shape}")
|
|
79
|
+
|
|
80
|
+
print("
|
|
81
|
+
Results:")
|
|
82
|
+
for i in range(len(init_poses)):
|
|
83
|
+
start_pos = adapted_pos[i, 0]
|
|
84
|
+
goal_pos = adapted_pos[i, -1]
|
|
85
|
+
target_goal = goal_poses[i]['position']
|
|
86
|
+
|
|
87
|
+
goal_error = np.linalg.norm(goal_pos - target_goal)
|
|
88
|
+
print(f"Trajectory {i}:")
|
|
89
|
+
print(f" Start: {start_pos}")
|
|
90
|
+
print(f" Goal: {goal_pos}")
|
|
91
|
+
print(".2e")
|
|
92
|
+
|
|
93
|
+
return adapted_pos, adapted_quat
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def main():
|
|
97
|
+
"""Main function for command-line execution."""
|
|
98
|
+
run_example()
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
if __name__ == "__main__":
|
|
102
|
+
main()
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""Imitation learning: invariant-space and geodesic losses."""
|
|
2
|
+
|
|
3
|
+
import numpy as np
|
|
4
|
+
from dhb_xr.encoder.dhb_dr import encode_dhb_dr
|
|
5
|
+
from dhb_xr.core.types import DHBMethod, EncodingMethod
|
|
6
|
+
from dhb_xr.losses.invariant_loss import invariant_matching_loss
|
|
7
|
+
from dhb_xr.losses.geodesic_loss import se3_geodesic_loss_np
|
|
8
|
+
from dhb_xr.losses.hybrid_loss import hybrid_invariant_pose_loss
|
|
9
|
+
|
|
10
|
+
def main():
|
|
11
|
+
np.random.seed(4)
|
|
12
|
+
n = 25
|
|
13
|
+
demo_pos = np.cumsum(np.random.randn(n, 3) * 0.02, axis=0)
|
|
14
|
+
demo_quat = np.tile(np.array([1.0, 0.0, 0.0, 0.0]), (n, 1))
|
|
15
|
+
pred_pos = demo_pos + np.random.randn(n, 3) * 0.005
|
|
16
|
+
pred_quat = demo_quat.copy()
|
|
17
|
+
|
|
18
|
+
out_demo = encode_dhb_dr(
|
|
19
|
+
demo_pos, demo_quat,
|
|
20
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
21
|
+
)
|
|
22
|
+
out_pred = encode_dhb_dr(
|
|
23
|
+
pred_pos, pred_quat,
|
|
24
|
+
method=EncodingMethod.POSITION, use_default_initial_frames=True, dhb_method=DHBMethod.DOUBLE_REFLECTION,
|
|
25
|
+
)
|
|
26
|
+
U_demo = np.concatenate([
|
|
27
|
+
out_demo["linear_motion_invariants"],
|
|
28
|
+
out_demo["angular_motion_invariants"],
|
|
29
|
+
], axis=1)
|
|
30
|
+
U_pred = np.concatenate([
|
|
31
|
+
out_pred["linear_motion_invariants"],
|
|
32
|
+
out_pred["angular_motion_invariants"],
|
|
33
|
+
], axis=1)
|
|
34
|
+
|
|
35
|
+
loss_inv = invariant_matching_loss(U_pred, U_demo, method="dhb_dr")
|
|
36
|
+
print("Invariant matching loss (L2):", loss_inv)
|
|
37
|
+
|
|
38
|
+
loss_pose = se3_geodesic_loss_np(
|
|
39
|
+
pred_pos[-1], pred_quat[-1],
|
|
40
|
+
demo_pos[-1], demo_quat[-1],
|
|
41
|
+
beta=1.0,
|
|
42
|
+
)
|
|
43
|
+
print("SE(3) geodesic loss (final pose):", loss_pose)
|
|
44
|
+
|
|
45
|
+
loss_hybrid = hybrid_invariant_pose_loss(
|
|
46
|
+
pred_pos, pred_quat, demo_pos, demo_quat,
|
|
47
|
+
pred_invariants=U_pred, demo_invariants=U_demo,
|
|
48
|
+
alpha=0.5, beta=1.0,
|
|
49
|
+
)
|
|
50
|
+
print("Hybrid (invariant + pose) loss:", loss_hybrid)
|
|
51
|
+
|
|
52
|
+
if __name__ == "__main__":
|
|
53
|
+
main()
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""
|
|
2
|
+
VLA Integration Examples
|
|
3
|
+
|
|
4
|
+
Examples demonstrating DHB-XR integration with popular VLA benchmarks:
|
|
5
|
+
|
|
6
|
+
LIBERO & LIBERO-PRO:
|
|
7
|
+
- libero_full_demo: Complete simulation pipeline with trajectory adaptation
|
|
8
|
+
- libero_pro_dhb_demo: Perturbation robustness analysis and simulation
|
|
9
|
+
- libero_swap_demo: Spatial swap demonstration (naive vs DHB comparison)
|
|
10
|
+
- libero_simulation_demo: Basic LIBERO integration
|
|
11
|
+
|
|
12
|
+
Data Processing:
|
|
13
|
+
- robocasa_libero_dhb_pipeline: End-to-end VLA data processing
|
|
14
|
+
- test_libero_adapter: LIBERO HDF5 dataset loading
|
|
15
|
+
- test_libero_encoding: DHB encoding on LIBERO trajectories
|
|
16
|
+
- test_libero_retrieval: Motion retrieval across LIBERO tasks
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
__version__ = "0.2.0"
|