embodik 0.1.1__tar.gz → 0.4.1__tar.gz

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.
Files changed (111) hide show
  1. {embodik-0.1.1 → embodik-0.4.1}/.gitignore +4 -0
  2. embodik-0.4.1/CHANGELOG.md +177 -0
  3. {embodik-0.1.1 → embodik-0.4.1}/CMakeLists.txt +1 -1
  4. embodik-0.4.1/PKG-INFO +646 -0
  5. embodik-0.4.1/README.md +594 -0
  6. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/kinematics_solver.hpp +76 -19
  7. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/robot_model.hpp +20 -0
  8. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/types.hpp +11 -0
  9. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/src/kinematics_solver.cpp +481 -56
  10. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/src/robot_model.cpp +71 -0
  11. {embodik-0.1.1 → embodik-0.4.1}/docs/api/index.md +7 -0
  12. {embodik-0.1.1 → embodik-0.4.1}/docs/api/kinematics_solver.md +10 -0
  13. {embodik-0.1.1 → embodik-0.4.1}/docs/examples/index.md +19 -2
  14. embodik-0.4.1/docs/gpu_solvers.md +83 -0
  15. {embodik-0.1.1 → embodik-0.4.1}/docs/index.md +1 -0
  16. embodik-0.4.1/docs/installation.md +491 -0
  17. {embodik-0.1.1 → embodik-0.4.1}/examples/01_basic_ik_simple.py +5 -7
  18. {embodik-0.1.1 → embodik-0.4.1}/examples/02_collision_aware_IK.py +286 -3
  19. embodik-0.4.1/examples/03_teleop_ik.py +851 -0
  20. embodik-0.4.1/examples/04_gpu_batch_ik.py +241 -0
  21. embodik-0.4.1/examples/05_gpu_collision_batch.py +218 -0
  22. embodik-0.4.1/examples/06_gpu_solver_demo.py +457 -0
  23. embodik-0.4.1/examples/07_parallel_trajectory_tracking.py +850 -0
  24. embodik-0.4.1/fn_velocity_solve.casadi +1 -0
  25. {embodik-0.1.1 → embodik-0.4.1}/mkdocs.yml +1 -0
  26. {embodik-0.1.1 → embodik-0.4.1}/pixi.lock +2632 -1059
  27. {embodik-0.1.1 → embodik-0.4.1}/pixi.toml +49 -2
  28. {embodik-0.1.1 → embodik-0.4.1}/pyproject.toml +21 -2
  29. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/__init__.py +26 -5
  30. embodik-0.4.1/python/embodik/gpu/__init__.py +112 -0
  31. embodik-0.4.1/python/embodik/gpu/casadi_fi_pesns.py +382 -0
  32. embodik-0.4.1/python/embodik/gpu/casadi_pph_sns.py +432 -0
  33. embodik-0.4.1/python/embodik/gpu/export_casadi_velocity_solve.py +177 -0
  34. embodik-0.4.1/python/embodik/gpu/torch_kinematics.py +300 -0
  35. embodik-0.4.1/python/embodik/gpu/warp_collision.py +415 -0
  36. embodik-0.4.1/python/embodik/gpu_solver.py +419 -0
  37. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/utils.py +13 -15
  38. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/viser_helpers.py +2 -3
  39. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/visualization.py +5 -27
  40. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/visualization_pinocchio.py +2 -3
  41. {embodik-0.1.1 → embodik-0.4.1}/python_bindings/src/bindings.cpp +22 -4
  42. {embodik-0.1.1 → embodik-0.4.1}/python_bindings/src/kinematics_solver_bindings.cpp +39 -2
  43. {embodik-0.1.1 → embodik-0.4.1}/python_bindings/src/robot_model_bindings.cpp +175 -0
  44. embodik-0.4.1/scripts/benchmark_fi_pesns.py +488 -0
  45. embodik-0.4.1/scripts/benchmark_gpu_batched.py +322 -0
  46. embodik-0.4.1/scripts/benchmark_pph_sns_batched.py +155 -0
  47. embodik-0.4.1/scripts/benchmark_pph_sns_comparison.py +299 -0
  48. embodik-0.4.1/scripts/export_pph_sns.py +43 -0
  49. embodik-0.4.1/scripts/install_cusadi.sh +33 -0
  50. embodik-0.4.1/scripts/microbench_solve_velocity.py +149 -0
  51. embodik-0.4.1/scripts/test_gpu_accuracy.py +51 -0
  52. embodik-0.4.1/scripts/test_pph_sns_cusadi.py +149 -0
  53. {embodik-0.1.1 → embodik-0.4.1}/scripts/upload_pypi.sh +8 -4
  54. embodik-0.4.1/test/test_fi_pesns.py +413 -0
  55. embodik-0.4.1/test/test_gpu_collision.py +404 -0
  56. embodik-0.4.1/test/test_gpu_solver.py +424 -0
  57. embodik-0.4.1/test/test_joint_limit_recovery.py +189 -0
  58. embodik-0.1.1/CHANGELOG.md +0 -49
  59. embodik-0.1.1/PKG-INFO +0 -309
  60. embodik-0.1.1/README.md +0 -265
  61. embodik-0.1.1/docs/installation.md +0 -264
  62. embodik-0.1.1/python/embodik/_runtime_deps.py +0 -47
  63. {embodik-0.1.1 → embodik-0.4.1}/.gitattributes +0 -0
  64. {embodik-0.1.1 → embodik-0.4.1}/.github/workflows/ci.yml +0 -0
  65. {embodik-0.1.1 → embodik-0.4.1}/.github/workflows/docs.yml +0 -0
  66. {embodik-0.1.1 → embodik-0.4.1}/.github/workflows/release.yml +0 -0
  67. {embodik-0.1.1 → embodik-0.4.1}/CONTRIBUTING.md +0 -0
  68. {embodik-0.1.1 → embodik-0.4.1}/LICENSE +0 -0
  69. {embodik-0.1.1 → embodik-0.4.1}/MANIFEST.in +0 -0
  70. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/constraints.hpp +0 -0
  71. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/ik_baseline.hpp +0 -0
  72. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/include/embodik/tasks.hpp +0 -0
  73. {embodik-0.1.1 → embodik-0.4.1}/cpp_core/src/tasks.cpp +0 -0
  74. {embodik-0.1.1 → embodik-0.4.1}/docs/api/robot_model.md +0 -0
  75. {embodik-0.1.1 → embodik-0.4.1}/docs/api/tasks.md +0 -0
  76. {embodik-0.1.1 → embodik-0.4.1}/docs/api/utils.md +0 -0
  77. {embodik-0.1.1 → embodik-0.4.1}/docs/api/visualization.md +0 -0
  78. {embodik-0.1.1 → embodik-0.4.1}/docs/development.md +0 -0
  79. {embodik-0.1.1 → embodik-0.4.1}/docs/examples/basic_ik.md +0 -0
  80. {embodik-0.1.1 → embodik-0.4.1}/docs/examples/multi_task_ik.md +0 -0
  81. {embodik-0.1.1 → embodik-0.4.1}/docs/quickstart.md +0 -0
  82. {embodik-0.1.1 → embodik-0.4.1}/docs/transforms.md +0 -0
  83. {embodik-0.1.1 → embodik-0.4.1}/examples/example_helpers/__init__.py +0 -0
  84. {embodik-0.1.1 → embodik-0.4.1}/examples/example_helpers/dual_arm_ik_helper.py +0 -0
  85. {embodik-0.1.1 → embodik-0.4.1}/examples/example_helpers/limit_profiles/alpha_extended.yaml +0 -0
  86. {embodik-0.1.1 → embodik-0.4.1}/examples/example_helpers/limit_profiles/alpha_extended_all.yaml +0 -0
  87. {embodik-0.1.1 → embodik-0.4.1}/examples/example_helpers/limit_profiles/beta_uniform_plus21.yaml +0 -0
  88. {embodik-0.1.1 → embodik-0.4.1}/examples/robot_model_example.py +0 -0
  89. {embodik-0.1.1 → embodik-0.4.1}/examples/utils/__init__.py +0 -0
  90. {embodik-0.1.1 → embodik-0.4.1}/examples/utils/robot_models.py +0 -0
  91. {embodik-0.1.1 → embodik-0.4.1}/examples/visualization_example.py +0 -0
  92. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/cli.py +0 -0
  93. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/examples/__init__.py +0 -0
  94. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/examples/basic_ik.py +0 -0
  95. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/examples/robot_model.py +0 -0
  96. {embodik-0.1.1 → embodik-0.4.1}/python/embodik/robot_visualizer.py +0 -0
  97. {embodik-0.1.1 → embodik-0.4.1}/python_bindings/CMakeLists.txt +0 -0
  98. {embodik-0.1.1 → embodik-0.4.1}/python_bindings/src/tasks_bindings.cpp +0 -0
  99. {embodik-0.1.1 → embodik-0.4.1}/scripts/patch_qhull_cmake.py +0 -0
  100. {embodik-0.1.1 → embodik-0.4.1}/scripts/setup_pypirc.sh +0 -0
  101. {embodik-0.1.1 → embodik-0.4.1}/scripts/test_cpp_extension.py +0 -0
  102. {embodik-0.1.1 → embodik-0.4.1}/scripts/test_extension_direct.py +0 -0
  103. {embodik-0.1.1 → embodik-0.4.1}/scripts/test_import.py +0 -0
  104. {embodik-0.1.1 → embodik-0.4.1}/scripts/test_python_utils.py +0 -0
  105. {embodik-0.1.1 → embodik-0.4.1}/scripts/upload_testpypi.sh +0 -0
  106. {embodik-0.1.1 → embodik-0.4.1}/scripts/version.py +0 -0
  107. {embodik-0.1.1 → embodik-0.4.1}/test/CMakeLists.txt +0 -0
  108. {embodik-0.1.1 → embodik-0.4.1}/test/test_embodik.py +0 -0
  109. {embodik-0.1.1 → embodik-0.4.1}/test/test_robot_model.cpp +0 -0
  110. {embodik-0.1.1 → embodik-0.4.1}/test/test_robot_model.py +0 -0
  111. {embodik-0.1.1 → embodik-0.4.1}/test/test_tasks.py +0 -0
@@ -20,6 +20,10 @@ python_bindings/**/py.typed
20
20
  build/**/*.pyi
21
21
  build/**/py.typed
22
22
 
23
+ # Ignore generated type stubs copied into the source tree (nanobind.stubgen)
24
+ *.pyi
25
+ *.typed
26
+
23
27
  # CMake build artifacts (root directory)
24
28
  CMakeCache.txt
25
29
  CMakeFiles/
@@ -0,0 +1,177 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [0.4.0] - 2026-02-05
9
+
10
+ ### Breaking Changes
11
+ - **Removed Python `pin` package from runtime dependencies**: EmbodiK now uses native C++ bindings
12
+ exclusively for all Pinocchio functionality. The `pip pinocchio` (`pin`) package is no longer
13
+ required at runtime, only at build time.
14
+ - This resolves numpy dependency conflicts when using EmbodiK with packages like `hmnd_robot`
15
+ that have different numpy version requirements
16
+ - All rotation utilities (log3, exp3, quaternion conversions) now use native bindings
17
+ - Collision distance computation now uses native `RobotModel.compute_min_collision_distance()`
18
+ - Visualization defaults to direct Viser (no Pinocchio ViserVisualizer dependency)
19
+
20
+ ### Added
21
+ - **Native math utilities via nanobind**: New C++ bindings for rotation/pose math
22
+ - `embodik.log3(R)`: Compute axis-angle from rotation matrix (replaces `pin.log3`)
23
+ - `embodik.exp3(omega)`: Compute rotation matrix from axis-angle (replaces `pin.exp3`)
24
+ - `embodik.matrix_to_quaternion_wxyz(R)`: Convert rotation matrix to (w,x,y,z) quaternion
25
+ - `embodik.quaternion_wxyz_to_matrix(w,x,y,z)`: Convert quaternion to rotation matrix
26
+ - **Native collision distance API**: RobotModel now exposes collision distance methods
27
+ - `RobotModel.compute_min_collision_distance()`: Get minimum distance across all collision pairs
28
+ - `RobotModel.compute_collision_distances()`: Get distances for all collision pairs
29
+ - **Optional Pinocchio visualization**: `pip install embodik[visualization-pinocchio]` for
30
+ Pinocchio's ViserVisualizer (requires `pin>=3.8.0`)
31
+
32
+ ### Changed
33
+ - Visualization now defaults to direct Viser implementation (no `pin` needed)
34
+ - `utils.py` functions (`get_pose_error_vector`, `compute_pose_error`, `Rt`) use native bindings
35
+ - `visualization.py` quaternion functions use native bindings
36
+ - GPU collision fallback uses native `RobotModel.compute_min_collision_distance()`
37
+ - Removed `_runtime_deps.py` (lazy Pinocchio import no longer needed)
38
+
39
+ ### Migration Guide
40
+ If you were using Pinocchio Python bindings directly through EmbodiK:
41
+
42
+ ```python
43
+ # Old (v0.3.x) - required pip pinocchio
44
+ import pinocchio as pin
45
+ R_error = pose_goal.rotation @ pose_current.rotation.T
46
+ error = pin.log3(R_error)
47
+ q = pin.Quaternion(R)
48
+
49
+ # New (v0.4.0) - no pip pinocchio needed
50
+ import embodik as eik
51
+ R_error = pose_goal.rotation @ pose_current.rotation.T
52
+ error = eik.log3(R_error)
53
+ w, x, y, z = eik.matrix_to_quaternion_wxyz(R)
54
+ ```
55
+
56
+ For collision distance computation:
57
+
58
+ ```python
59
+ # Old (v0.3.x) - required pip pinocchio
60
+ import pinocchio as pin
61
+ pin.updateGeometryPlacements(model, data, collision_model, collision_data)
62
+ for i in range(len(collision_model.collisionPairs)):
63
+ pin.computeDistance(collision_model, collision_data, i)
64
+ dist = collision_data.distanceResults[i].min_distance
65
+
66
+ # New (v0.4.0) - native API
67
+ robot_model.update_configuration(q)
68
+ dist = robot_model.compute_min_collision_distance()
69
+ ```
70
+
71
+ ## [0.3.0] - 2026-02-03
72
+
73
+ ### Added
74
+ - **PPH-SNS Solver**: Alternative GPU-optimized solver (Parallel Penalized Hierarchical SNS)
75
+ - Soft top-k violation selection using softmax weights
76
+ - Limited rank-1 projector updates (1–2 violators per iteration)
77
+ - Achieves ~632,000 IK solves/second at batch size 10,000
78
+ - Benchmark comparison scripts: `benchmark-solver-comparison`, `benchmark-solver-batched`
79
+ - **GPU Acceleration**: Batched velocity IK solving with massive parallelism (100-500x speedup)
80
+ - Achieves ~670,000 IK solves/second at batch size 10,000
81
+ - Ideal for RL training (4096+ parallel environments), motion planning, and dataset generation
82
+ - GPU batched solver via CusADi-compiled CUDA kernels
83
+ - **FI-PeSNS Solver**: Fixed-Iteration Penalized eSNS algorithm optimized for GPU
84
+ - Singularity-Robust Inverse (SRINV) for numerical stability
85
+ - Analytical scaling for feasible task scales without iterative saturation
86
+ - Penalty gradient approach for constraint enforcement
87
+ - Fixed iterations for predictable compute time (ideal for real-time RL)
88
+ - **GPU Collision Detection**: GPU-accelerated collision detection via NVIDIA Warp
89
+ - Batched collision queries for parallel processing
90
+ - Experimental support for GPU-accelerated self-collision avoidance
91
+ - **Parallel Trajectory Tracking Demo**: Visualize 100 robot instances simultaneously tracking different trajectories
92
+ - Interactive demo with Viser visualization
93
+ - Demonstrates GPU parallelization capabilities
94
+ - Achieves ~50,000+ IK solves/second with GPU acceleration
95
+ - **Teleoperation IK Example**: Interactive IK control using Seer wireless controller (Xvisio SDK)
96
+ - **GPU Benchmarks and Demos**: Comprehensive benchmarking tools for GPU performance
97
+ - Batch IK performance benchmarks
98
+ - FI-PeSNS vs CPU accuracy benchmarks
99
+ - Collision detection benchmarks
100
+ - GPU solver demonstration panels
101
+ - **CasADi Integration**: Export and compile velocity IK functions to CUDA kernels
102
+ - Symbolic function export for GPU compilation
103
+ - CusADi integration for CUDA kernel generation
104
+ - **GPU Environment Support**: CUDA feature in pixi.toml with GPU-specific tasks
105
+ - `check-cuda`, `check-gpu`, `install-cusadi` tasks
106
+ - GPU demos and benchmarks via pixi tasks
107
+ - CUDA environment configuration
108
+
109
+ ### Changed
110
+ - Enhanced examples with GPU acceleration support
111
+ - Updated dependencies to include xvisio SDK support for teleoperation examples
112
+ - Improved GPU documentation and setup instructions
113
+
114
+ ### Dependencies
115
+ - Added `casadi>=3.6.0` and `torch>=2.0.0` to `[gpu]` optional dependencies
116
+ - Added `warp-lang>=1.0.0` to `[gpu-collision]` optional dependencies
117
+ - Added `xvisio>=0.3.1` to pixi dependencies for teleoperation examples
118
+
119
+ ## [0.2.0] - 2026-01-30
120
+
121
+ ### Added
122
+ - Position IK now supports `excluded_joint_indices` to lock joints during solves
123
+ - Position IK can enforce collision constraints during iterative solves (when configured)
124
+
125
+ ### Changed
126
+ - Velocity solver now groups same-priority tasks to make ordering within a priority level symmetric
127
+ - Collision constraint computation now uses cached allow-masks to skip excluded pairs efficiently
128
+ - Collision recovery near `min_distance` uses deadband + adaptive push to reduce jitter and stalling
129
+ - Collision constraint default `nearest_points_all_pairs` set to true
130
+ - Collision debug evaluation is side-effect free (no solver state mutation)
131
+
132
+ ### Fixed
133
+ - Position IK now applies collision constraints and excluded joint indices consistently with velocity IK
134
+ - Collision constraint pair selection now uses hysteresis across frames for stability
135
+
136
+ ## [0.1.1] - 2025-01-09
137
+
138
+ ### Added
139
+ - **PyPI Publishing**: Full wheel building and publishing workflow for TestPyPI and PyPI
140
+ - **`embodik-sanitize-env` CLI**: Helper to sanitize `LD_LIBRARY_PATH` for clean pip installs
141
+ - **`embodik-examples` CLI**: Tool to list and copy examples for pip-installed users
142
+ - **Built-in robot presets**: `panda` and `iiwa` presets work without `robot_presets.yaml`
143
+ - **sdist build support**: Source distribution builds now auto-detect PyPI `pin` wheel's Pinocchio
144
+
145
+ ### Changed
146
+ - Simplified `_runtime_deps.py` - removed complex preloading logic, now just provides `import_pinocchio()` helper
147
+ - Documentation updated to recommend `venv + pip + unset LD_LIBRARY_PATH` as primary user flow
148
+ - ViserVisualizer now uses empty GeometryModel instead of None when collisions disabled
149
+
150
+ ### Fixed
151
+ - Fixed `KeyError: 'pinocchio/frames/universe'` in ViserVisualizer when `load_collisions=False`
152
+ - Fixed RPATH for `_embodik_impl.so` to correctly find `libembodik_core.so`
153
+ - Fixed sdist builds failing to find Pinocchio by auto-detecting `pin` wheel's CMake config
154
+ - Examples now work correctly for pip-installed users via `embodik-examples --copy`
155
+
156
+ ### Dependencies
157
+ - Added `pin>=3.8.0` to build-system requirements for sdist builds
158
+ - Added `pyyaml`, `robot_descriptions`, `viser`, `yourdfpy` to `[examples]` optional dependencies
159
+
160
+ ## [0.1.0] - 2025-12-12
161
+
162
+ ### Added
163
+ - Initial release of embodiK
164
+ - High-performance inverse kinematics solver with hierarchical task resolution
165
+ - Python bindings using nanobind
166
+ - Support for multiple task types (FrameTask, PostureTask, COMTask, JointTask, MultiJointTask)
167
+ - Position and velocity IK solving
168
+ - Optional visualization tools using Viser
169
+ - Comprehensive test suite
170
+ - Example scripts demonstrating various use cases
171
+
172
+ ### Technical Details
173
+ - C++17 core library built on Pinocchio and Eigen3
174
+ - Python 3.8+ support
175
+ - Linux x86_64 support
176
+ - CMake-based build system
177
+ - scikit-build-core for Python packaging
@@ -1,5 +1,5 @@
1
1
  cmake_minimum_required(VERSION 3.16)
2
- project(embodik VERSION 0.1.1)
2
+ project(embodik VERSION 0.2.0)
3
3
 
4
4
  # Python is used to auto-discover Pinocchio (PyPI `pin`) CMake config during sdist builds.
5
5
  find_package(Python REQUIRED COMPONENTS Interpreter)