InterpolatePy 3.2.0__tar.gz → 3.2.2__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.
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/docs.yml +16 -1
- interpolatepy-3.2.2/.github/workflows/test.yml +87 -0
- interpolatepy-3.2.2/ALGORITHMS.md +155 -0
- interpolatepy-3.2.2/InterpolatePy.egg-info/PKG-INFO +172 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/SOURCES.txt +4 -0
- interpolatepy-3.2.2/PKG-INFO +172 -0
- interpolatepy-3.2.2/README.md +131 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/CMakeLists.txt +5 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_example.cpp +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_smoothing_example.cpp +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_acc1_example.cpp +3 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/trapezoidal_example.cpp +3 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_quaternion_spline.cpp +48 -0
- interpolatepy-3.2.2/docs/algorithms.md +194 -0
- interpolatepy-3.2.2/docs/api-reference.md +214 -0
- interpolatepy-3.2.2/docs/architecture.md +134 -0
- interpolatepy-3.2.2/docs/changelog.md +119 -0
- interpolatepy-3.2.2/docs/contributing.md +207 -0
- interpolatepy-3.2.2/docs/examples.md +127 -0
- interpolatepy-3.2.2/docs/index.md +90 -0
- interpolatepy-3.2.2/docs/installation.md +176 -0
- interpolatepy-3.2.2/docs/quickstart.md +143 -0
- interpolatepy-3.2.2/docs/troubleshooting.md +249 -0
- interpolatepy-3.2.2/docs/tutorials/motion-profiles.md +223 -0
- interpolatepy-3.2.2/docs/tutorials/path-planning.md +180 -0
- interpolatepy-3.2.2/docs/tutorials/quaternion-interpolation.md +216 -0
- interpolatepy-3.2.2/docs/tutorials/spline-interpolation.md +256 -0
- interpolatepy-3.2.2/docs/user-guide.md +179 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_approx_ex.py +2 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_cubic_ex.py +2 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_ex.py +6 -9
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_interpolate_ex.py +8 -12
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/b_spline_smooth_ex.py +3 -4
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_smoot_search_ex.py +4 -4
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_smoothing_ex.py +6 -6
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_with_acc1_ex.py +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/c_s_with_acc2_ex.py +2 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/cubic_spline_ex.py +2 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/double_s_ex.py +3 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/frenet_frame_ex.py +4 -4
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/lin_poly_parabolic_ex.py +1 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/linear_ex.py +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/log_quat_new_ex.py +4 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/lqi_spiral_frenet_ex.py +4 -4
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/main.py +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/mlqi_spiral_frenet_ex.py +3 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/polynomials_ex.py +4 -4
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/quat_visualization_ex.py +2 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/simple_paths_ex.py +5 -5
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/squad_c2_ex.py +3 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/trapezoidal_ex.py +2 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/__init__.py +4 -4
- interpolatepy-3.2.2/interpolatepy/_adapters/_bspline.py +228 -0
- interpolatepy-3.2.2/interpolatepy/_adapters/_direct.py +43 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_motion.py +73 -0
- interpolatepy-3.2.2/interpolatepy/_adapters/_quaternion.py +315 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_spline.py +34 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline.py +1 -7
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_approx.py +7 -8
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_cubic.py +14 -16
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_interpolate.py +6 -10
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/b_spline_smooth.py +10 -13
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_smoothing.py +8 -16
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_with_acc1.py +12 -17
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_with_acc2.py +2 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/cubic_spline.py +10 -15
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/double_s.py +40 -30
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/frenet_frame.py +1 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/lin_poly_parabolic.py +1 -5
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/log_quat.py +3 -3
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/protocols.py +3 -2
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/squad_c2.py +7 -8
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/trapezoidal.py +5 -5
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/version.py +1 -1
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/pyproject.toml +1 -1
- interpolatepy-3.2.2/scripts/__init__.py +1 -0
- interpolatepy-3.2.2/scripts/check_doc_snippets.py +75 -0
- interpolatepy-3.2.2/scripts/check_python_examples.py +100 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_b_spline_variants.py +23 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_log_quat.py +4 -4
- interpolatepy-3.2.2/tests/test_native_adapter_api.py +127 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/uv.lock +1 -1
- interpolatepy-3.2.0/.github/workflows/test.yml +0 -36
- interpolatepy-3.2.0/ALGORITHMS.md +0 -1092
- interpolatepy-3.2.0/InterpolatePy.egg-info/PKG-INFO +0 -377
- interpolatepy-3.2.0/PKG-INFO +0 -377
- interpolatepy-3.2.0/README.md +0 -336
- interpolatepy-3.2.0/docs/algorithms.md +0 -819
- interpolatepy-3.2.0/docs/api-reference.md +0 -802
- interpolatepy-3.2.0/docs/architecture.md +0 -122
- interpolatepy-3.2.0/docs/changelog.md +0 -247
- interpolatepy-3.2.0/docs/contributing.md +0 -704
- interpolatepy-3.2.0/docs/examples.md +0 -1436
- interpolatepy-3.2.0/docs/index.md +0 -198
- interpolatepy-3.2.0/docs/installation.md +0 -433
- interpolatepy-3.2.0/docs/quickstart.md +0 -376
- interpolatepy-3.2.0/docs/troubleshooting.md +0 -452
- interpolatepy-3.2.0/docs/tutorials/motion-profiles.md +0 -906
- interpolatepy-3.2.0/docs/tutorials/path-planning.md +0 -248
- interpolatepy-3.2.0/docs/tutorials/quaternion-interpolation.md +0 -212
- interpolatepy-3.2.0/docs/tutorials/spline-interpolation.md +0 -941
- interpolatepy-3.2.0/docs/user-guide.md +0 -680
- interpolatepy-3.2.0/interpolatepy/_adapters/_bspline.py +0 -77
- interpolatepy-3.2.0/interpolatepy/_adapters/_direct.py +0 -23
- interpolatepy-3.2.0/interpolatepy/_adapters/_quaternion.py +0 -177
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.editorconfig +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.gitattributes +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/FUNDING.yml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/pre-commit.yml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.github/workflows/publish.yml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.gitignore +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.pre-commit-config.yaml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/.python-version +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/dependency_links.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/requires.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/InterpolatePy.egg-info/top_level.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/LICENSE +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/codecov.yml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/CMakeLists.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/CMakeLists.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_acc_splines.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_bspline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_cubic_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_motion.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_paths.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_quaternion.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_smoothing_search.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/bind_tridiagonal.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/bindings/module.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/cmake/InterpolateCppConfig.cmake.in +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/cmake/version.hpp.in +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_approx_smooth_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_cubic_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/bspline_interpolator_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/concepts_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_acc2_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/cubic_spline_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/double_s_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/parabolic_linear_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/paths_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/polynomial_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/quaternion_example.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/examples/shared/example_utils.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/approximation_bspline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline_interpolator.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/bspline_parameters.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/cubic_bspline_interpolation.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/bspline/smoothing_cubic_bspline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/concepts.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/config.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/double_s_trajectory.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/motion_types.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/parabolic_blend_trajectory.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/polynomial_trajectory.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/motion/trapezoidal_trajectory.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/circular_path.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/frenet_frame.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/linear_path.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/path/linear_traj.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/log_quaternion_interpolation.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/modified_log_quaternion_interpolation.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/quaternion.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/quaternion_spline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/quat/squad_c2.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_smoothing_spline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc1.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc2.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/smoothing_search.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/spline/spline_parameters.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/include/interpolatecpp/tridiagonal.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/approximation_bspline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/bspline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/bspline_interpolator.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/circular_path.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_bspline_interpolation.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline_with_acc1.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/cubic_spline_with_acc2.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/double_s_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/frenet_frame.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/linear_path.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/linear_traj.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/log_quaternion_interpolation.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/modified_log_quaternion_interpolation.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/parabolic_blend_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/polynomial_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/quaternion.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/quaternion_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/smoothing_cubic_bspline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/smoothing_search.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/squad_c2.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/src/trapezoidal_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/CMakeLists.txt +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/shared/test_data.hpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_bspline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_bspline_variants.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_concepts.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline_with_acc1.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_cubic_spline_with_acc2.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_double_s_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_parabolic_blend_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_paths.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_polynomial_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_quaternion.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_smoothing_search.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_trapezoidal_trajectory.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/cpp/tests/test_tridiagonal.cpp +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/docs/assets/extra.css +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/docs/assets/extra.js +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/examples/protocols_ex.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/__init__.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_adapters/_paths.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_api.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/_backend.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/c_s_smoot_search.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/linear.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/polynomials.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_core.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_spline.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/quat_visualization.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/simple_paths.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/interpolatepy/tridiagonal_inv.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/mkdocs.yml +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/setup.cfg +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/__init__.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/inv_test.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_b_spline.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_backend.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_cubic_spline.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_lin_poly_parabolic.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_linear.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_motion_profiles.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_path_planning.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_polynomials.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_protocols.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_quat_interp.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_quat_visualization.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_smoothing.py +0 -0
- {interpolatepy-3.2.0 → interpolatepy-3.2.2}/tests/test_squad_c2.py +0 -0
|
@@ -4,16 +4,26 @@ on:
|
|
|
4
4
|
push:
|
|
5
5
|
branches: [ main, dev ]
|
|
6
6
|
paths:
|
|
7
|
+
- 'README.md'
|
|
8
|
+
- 'ALGORITHMS.md'
|
|
7
9
|
- 'docs/**'
|
|
8
10
|
- 'mkdocs.yml'
|
|
9
11
|
- 'interpolatepy/**/*.py' # Only Python files for API docs
|
|
12
|
+
- 'scripts/check_doc_snippets.py'
|
|
13
|
+
- 'pyproject.toml'
|
|
14
|
+
- 'uv.lock'
|
|
10
15
|
- '.github/workflows/docs.yml'
|
|
11
16
|
pull_request:
|
|
12
17
|
branches: [ main ]
|
|
13
18
|
paths:
|
|
19
|
+
- 'README.md'
|
|
20
|
+
- 'ALGORITHMS.md'
|
|
14
21
|
- 'docs/**'
|
|
15
22
|
- 'mkdocs.yml'
|
|
16
23
|
- 'interpolatepy/**/*.py'
|
|
24
|
+
- 'scripts/check_doc_snippets.py'
|
|
25
|
+
- 'pyproject.toml'
|
|
26
|
+
- 'uv.lock'
|
|
17
27
|
workflow_dispatch: # Allow manual triggering
|
|
18
28
|
|
|
19
29
|
permissions:
|
|
@@ -44,6 +54,12 @@ jobs:
|
|
|
44
54
|
- name: Sync dependencies
|
|
45
55
|
run: uv sync --locked --no-default-groups --group docs
|
|
46
56
|
|
|
57
|
+
- name: Check documentation snippets
|
|
58
|
+
env:
|
|
59
|
+
INTERPOLATEPY_NO_CPP: '1'
|
|
60
|
+
MPLBACKEND: Agg
|
|
61
|
+
run: uv run python -m scripts.check_doc_snippets
|
|
62
|
+
|
|
47
63
|
- name: Build documentation
|
|
48
64
|
run: uv run mkdocs build --clean --strict
|
|
49
65
|
|
|
@@ -69,4 +85,3 @@ jobs:
|
|
|
69
85
|
- name: Deploy to GitHub Pages
|
|
70
86
|
id: deployment
|
|
71
87
|
uses: actions/deploy-pages@v5
|
|
72
|
-
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
name: ci-test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: [ main, master ]
|
|
6
|
+
pull_request:
|
|
7
|
+
branches: [ main, master ]
|
|
8
|
+
|
|
9
|
+
jobs:
|
|
10
|
+
test:
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
matrix:
|
|
14
|
+
os: [ubuntu-latest, macos-latest]
|
|
15
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
16
|
+
env:
|
|
17
|
+
UV_PYTHON: ${{ matrix.python-version }}
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v6
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
22
|
+
with:
|
|
23
|
+
enable-cache: true
|
|
24
|
+
cache-dependency-glob: uv.lock
|
|
25
|
+
- name: Sync dependencies
|
|
26
|
+
run: uv sync --locked --no-default-groups --group test
|
|
27
|
+
- name: Testing with coverage
|
|
28
|
+
run: uv run pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
|
|
29
|
+
- name: Upload coverage to Codecov
|
|
30
|
+
uses: codecov/codecov-action@v6
|
|
31
|
+
with:
|
|
32
|
+
token: ${{ secrets.CODECOV_TOKEN }}
|
|
33
|
+
files: ./coverage.xml
|
|
34
|
+
flags: unittests
|
|
35
|
+
name: codecov-umbrella
|
|
36
|
+
fail_ci_if_error: false
|
|
37
|
+
|
|
38
|
+
python-examples:
|
|
39
|
+
runs-on: ubuntu-latest
|
|
40
|
+
env:
|
|
41
|
+
UV_PYTHON: '3.12'
|
|
42
|
+
steps:
|
|
43
|
+
- uses: actions/checkout@v6
|
|
44
|
+
- name: Install uv
|
|
45
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
46
|
+
with:
|
|
47
|
+
enable-cache: true
|
|
48
|
+
cache-dependency-glob: uv.lock
|
|
49
|
+
- name: Sync dependencies
|
|
50
|
+
run: uv sync --locked --no-default-groups --group test
|
|
51
|
+
- name: Run Python examples with the fallback backend
|
|
52
|
+
run: uv run python -m scripts.check_python_examples --backend python
|
|
53
|
+
|
|
54
|
+
native:
|
|
55
|
+
runs-on: ubuntu-latest
|
|
56
|
+
env:
|
|
57
|
+
UV_PYTHON: '3.12'
|
|
58
|
+
steps:
|
|
59
|
+
- uses: actions/checkout@v6
|
|
60
|
+
- name: Install uv
|
|
61
|
+
uses: astral-sh/setup-uv@v8.1.0
|
|
62
|
+
with:
|
|
63
|
+
enable-cache: true
|
|
64
|
+
cache-dependency-glob: uv.lock
|
|
65
|
+
- name: Sync dependencies
|
|
66
|
+
run: uv sync --locked --no-default-groups --group test
|
|
67
|
+
- name: Configure C++ tests, examples, and Python bindings
|
|
68
|
+
run: |
|
|
69
|
+
cmake -S cpp -B build/cpp \
|
|
70
|
+
-DINTERPOLATECPP_BUILD_TESTS=ON \
|
|
71
|
+
-DINTERPOLATECPP_BUILD_EXAMPLES=ON \
|
|
72
|
+
-DINTERPOLATECPP_BUILD_BINDINGS=ON \
|
|
73
|
+
-DPython_EXECUTABLE=$(uv run python -c 'import sys; print(sys.executable)')
|
|
74
|
+
- name: Build native targets
|
|
75
|
+
run: cmake --build build/cpp --parallel 4
|
|
76
|
+
- name: Run C++ tests and examples
|
|
77
|
+
run: ctest --test-dir build/cpp --output-on-failure
|
|
78
|
+
- name: Activate the native Python backend
|
|
79
|
+
run: cp build/cpp/bindings/interpolatecpp_py*.so interpolatepy/
|
|
80
|
+
- name: Run native adapter regressions
|
|
81
|
+
run: uv run pytest tests/test_backend.py tests/test_native_adapter_api.py
|
|
82
|
+
- name: Run documentation snippets with the native backend
|
|
83
|
+
env:
|
|
84
|
+
MPLBACKEND: Agg
|
|
85
|
+
run: uv run python -m scripts.check_doc_snippets
|
|
86
|
+
- name: Run Python examples with the native backend
|
|
87
|
+
run: uv run python -m scripts.check_python_examples --backend native
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# InterpolatePy algorithm guide
|
|
2
|
+
|
|
3
|
+
This page is a compact map of the algorithms exposed by InterpolatePy 3.2.1.
|
|
4
|
+
For constructor signatures and complete method documentation, use the
|
|
5
|
+
[API reference](docs/api-reference.md). For worked code, use the
|
|
6
|
+
[tutorials](docs/user-guide.md) and [`examples/`](examples/).
|
|
7
|
+
|
|
8
|
+
## Choose by problem
|
|
9
|
+
|
|
10
|
+
| Problem | Start with | Why |
|
|
11
|
+
| --- | --- | --- |
|
|
12
|
+
| Interpolate scalar waypoints with specified endpoint velocities | `CubicSpline` | Piecewise cubic, C2 across interior knots, inexpensive evaluation |
|
|
13
|
+
| Fit noisy scalar samples | `CubicSmoothingSpline` | Trades waypoint error against curvature through `mu` and weights |
|
|
14
|
+
| Also constrain endpoint accelerations | `CubicSplineWithAcceleration1` or `CubicSplineWithAcceleration2` | Adds endpoint acceleration conditions with two different constructions |
|
|
15
|
+
| Evaluate a curve from known B-spline control points | `BSpline` | Direct control over degree, knots, and control points |
|
|
16
|
+
| Pass a B-spline through parametric samples | `BSplineInterpolator` | Degrees 3, 4, and 5; optional velocity/acceleration/cyclic constraints |
|
|
17
|
+
| Approximate many points with fewer controls | `ApproximationBSpline` | Weighted least-squares curve reduction |
|
|
18
|
+
| Smooth a vector-valued curve | `SmoothingCubicBSpline` | Cubic B-spline fit with a smoothness/fidelity trade-off |
|
|
19
|
+
| Limit velocity, acceleration, and jerk | `DoubleSTrajectory` | Seven-phase jerk-limited Double-S profile |
|
|
20
|
+
| Limit velocity and acceleration | `TrapezoidalTrajectory` | Trapezoidal or triangular velocity profile |
|
|
21
|
+
| Match endpoint derivatives exactly | `PolynomialTrajectory` | Cubic, quintic, or seventh-order polynomial boundary interpolation |
|
|
22
|
+
| Blend a scalar via-point sequence | `ParabolicBlendTrajectory` | Linear segments joined by parabolic blends |
|
|
23
|
+
| Interpolate two orientations | `Quaternion.slerp()` | Shortest-path spherical interpolation |
|
|
24
|
+
| Interpolate orientation keyframes | `QuaternionSpline` | Piecewise SLERP/SQUAD selected explicitly or automatically |
|
|
25
|
+
| Require a smooth SQUAD-style orientation trajectory | `SquadC2` | Virtual endpoints and smooth angular derivative evaluation |
|
|
26
|
+
| Interpolate rotations in logarithmic coordinates | `LogQuaternionInterpolation` | B-spline interpolation of continuous rotation vectors |
|
|
27
|
+
| Decouple rotation angle and axis | `ModifiedLogQuaternionInterpolation` | Separate angle and unit-axis spline state |
|
|
28
|
+
| Describe a 3D line or circle geometrically | `LinearPath` or `CircularPath` | Arc-length parameterized position and geometric derivatives |
|
|
29
|
+
| Attach a moving frame to a parametric curve | `compute_trajectory_frames()` | Frenet tangent, normal, and binormal, with optional tool rotation |
|
|
30
|
+
|
|
31
|
+
## Scalar cubic splines
|
|
32
|
+
|
|
33
|
+
For times `t_i`, positions `q_i`, and segment duration `h_i`, each
|
|
34
|
+
`CubicSpline` segment is a cubic polynomial. Coefficients are chosen so that it
|
|
35
|
+
passes through both segment endpoints, matches waypoint velocities, and has
|
|
36
|
+
continuous acceleration at interior waypoints. `v0` and `vn` are clamped
|
|
37
|
+
endpoint velocities; the defaults are zero velocity, not natural (zero
|
|
38
|
+
curvature) boundary conditions.
|
|
39
|
+
|
|
40
|
+
`CubicSmoothingSpline` minimizes a combination of weighted data error and curve
|
|
41
|
+
roughness. Its parameter follows these conventions:
|
|
42
|
+
|
|
43
|
+
- `mu=1` gives exact interpolation.
|
|
44
|
+
- Smaller positive `mu` values emphasize smoothness.
|
|
45
|
+
- An infinite point weight pins that sample exactly.
|
|
46
|
+
- `mu` must be in `(0, 1]`.
|
|
47
|
+
|
|
48
|
+
Use `smoothing_spline_with_tolerance()` when the input requirement is a maximum
|
|
49
|
+
waypoint error rather than a preselected `mu`. It returns the spline, selected
|
|
50
|
+
`mu`, achieved maximum error, and iteration count.
|
|
51
|
+
|
|
52
|
+
The acceleration variants have different APIs:
|
|
53
|
+
|
|
54
|
+
- `CubicSplineWithAcceleration1(..., v0, vn, a0, an)` adds virtual endpoint
|
|
55
|
+
waypoints.
|
|
56
|
+
- `CubicSplineWithAcceleration2(..., params=SplineParameters(...))` replaces
|
|
57
|
+
the first and last cubic pieces with quintic segments when acceleration
|
|
58
|
+
constraints are supplied.
|
|
59
|
+
|
|
60
|
+
## B-spline curves
|
|
61
|
+
|
|
62
|
+
A degree-`p` B-spline is
|
|
63
|
+
|
|
64
|
+
\[
|
|
65
|
+
C(u)=\sum_i N_{i,p}(u)P_i,
|
|
66
|
+
\]
|
|
67
|
+
|
|
68
|
+
where `P_i` are control points and `N_{i,p}` are basis functions induced by the
|
|
69
|
+
knot vector. The valid domain of a `BSpline` instance is
|
|
70
|
+
`[spline.u_min, spline.u_max]`. Use `evaluate_derivative(u, order)` for curve
|
|
71
|
+
derivatives and `generate_curve_points()` for sampled parameters and points.
|
|
72
|
+
|
|
73
|
+
`BSplineInterpolator` accepts scalar or vector-valued samples and optional
|
|
74
|
+
times. Degrees 3, 4, and 5 are supported. Since version 3.2.0, all three degrees
|
|
75
|
+
work with two or more samples; missing endpoint constraints are completed with
|
|
76
|
+
generated natural higher-derivative rows. Explicit velocity and acceleration
|
|
77
|
+
constraints take precedence.
|
|
78
|
+
|
|
79
|
+
`CubicBSplineInterpolation` is a cubic curve interpolator with chord-length,
|
|
80
|
+
centripetal, or equally-spaced parameterization. `ApproximationBSpline` uses a
|
|
81
|
+
chosen number of control points, while `SmoothingCubicBSpline` uses
|
|
82
|
+
`BSplineParams` to configure smoothing, weighting, endpoint enforcement, and
|
|
83
|
+
parameterization.
|
|
84
|
+
|
|
85
|
+
## Scalar motion profiles
|
|
86
|
+
|
|
87
|
+
`DoubleSTrajectory` constructs a jerk-limited point-to-point motion from
|
|
88
|
+
`StateParams` and `TrajectoryBounds`. The useful sampling distinction is:
|
|
89
|
+
|
|
90
|
+
```python
|
|
91
|
+
position = trajectory.evaluate(t)
|
|
92
|
+
velocity = trajectory.evaluate_velocity(t)
|
|
93
|
+
acceleration = trajectory.evaluate_acceleration(t)
|
|
94
|
+
jerk = trajectory.evaluate_jerk(t)
|
|
95
|
+
position, velocity, acceleration, jerk = trajectory.evaluate_full(t)
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Scalar and NumPy-array times are supported. Times are clipped to the planned
|
|
99
|
+
duration. Inspect `get_duration()` and `get_phase_durations()` for timing.
|
|
100
|
+
|
|
101
|
+
`TrapezoidalTrajectory.generate_trajectory()` returns a callable and duration.
|
|
102
|
+
Its `TrajectoryParams` lives in `interpolatepy.trapezoidal`; the top-level
|
|
103
|
+
`interpolatepy.TrajectoryParams` is the distinct multipoint polynomial
|
|
104
|
+
configuration class.
|
|
105
|
+
|
|
106
|
+
`PolynomialTrajectory` returns callables whose outputs are `(position,
|
|
107
|
+
velocity, acceleration, jerk)`. Cubic order matches position and velocity;
|
|
108
|
+
quintic also matches acceleration; seventh order also matches jerk.
|
|
109
|
+
|
|
110
|
+
`ParabolicBlendTrajectory.generate()` returns a `(position, velocity,
|
|
111
|
+
acceleration)` callable and total duration for a via-point path.
|
|
112
|
+
|
|
113
|
+
## Quaternion interpolation
|
|
114
|
+
|
|
115
|
+
Quaternions `q` and `-q` represent the same orientation. The interpolation
|
|
116
|
+
classes account for this double cover when constructing their paths. Compare
|
|
117
|
+
orientations using the absolute quaternion dot product rather than component
|
|
118
|
+
equality when sign is irrelevant.
|
|
119
|
+
|
|
120
|
+
`QuaternionSpline` supports `"slerp"`, `"squad"`, and `"auto"`. Its
|
|
121
|
+
`evaluate()`, `evaluate_velocity()`, and `evaluate_acceleration()` methods match
|
|
122
|
+
the quaternion trajectory protocol. `SquadC2` adds virtual endpoints and
|
|
123
|
+
derivative-aware interpolation.
|
|
124
|
+
|
|
125
|
+
The logarithmic interpolators support B-spline degrees 3, 4, and 5 and, since
|
|
126
|
+
3.2.0, accept as few as two quaternion waypoints. `evaluate_velocity()` and
|
|
127
|
+
`evaluate_acceleration()` return derivatives of the interpolated internal
|
|
128
|
+
coordinates. Use `get_physical_kinematics()` when physical angular velocity and
|
|
129
|
+
angular acceleration are required.
|
|
130
|
+
|
|
131
|
+
## Paths and Frenet frames
|
|
132
|
+
|
|
133
|
+
`LinearPath` is parameterized by arc length from zero to `path.length`.
|
|
134
|
+
`CircularPath` takes an axis `r`, a point `d` on that axis, and a point `pi` on
|
|
135
|
+
the circle; one turn spans `2*pi*path.radius`. Their `velocity()` and
|
|
136
|
+
`acceleration()` methods are derivatives with respect to path length, not time.
|
|
137
|
+
|
|
138
|
+
`compute_trajectory_frames()` accepts a callable returning `(position,
|
|
139
|
+
first_derivative, second_derivative)` for each parameter. Each returned
|
|
140
|
+
`frames[i]` is a 3-by-3 rotation matrix whose columns are tangent, normal, and
|
|
141
|
+
binormal. A scalar `tool_orientation` rotates about the local binormal; a
|
|
142
|
+
three-tuple applies roll, pitch, and yaw.
|
|
143
|
+
|
|
144
|
+
## Backend and numerical notes
|
|
145
|
+
|
|
146
|
+
- Import supported APIs from `interpolatepy`, not implementation modules, to
|
|
147
|
+
allow backend selection.
|
|
148
|
+
- The Python implementation is always available. `interpolatepy.HAS_CPP`
|
|
149
|
+
reports whether the optional native extension was loaded.
|
|
150
|
+
- Vectorized time evaluation is supported by scalar cubic splines and
|
|
151
|
+
Double-S trajectories. General B-spline and quaternion evaluators take one
|
|
152
|
+
parameter at a time; sample them in a comprehension.
|
|
153
|
+
- Validate strictly increasing time arrays and keep units consistent across
|
|
154
|
+
positions, derivatives, and bounds.
|
|
155
|
+
- Do not extrapolate B-splines beyond `u_min` and `u_max`.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: InterpolatePy
|
|
3
|
+
Version: 3.2.2
|
|
4
|
+
Summary: A comprehensive Python library for generating smooth trajectories and curves with precise control over position, velocity, acceleration, and jerk profiles
|
|
5
|
+
Author-email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
6
|
+
Maintainer-email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
|
|
10
|
+
Keywords: interpolation,trajectory planning,motion profiles,robotics,b-splines,cubic splines,frenet frames,path generation,motion control
|
|
11
|
+
Platform: unix
|
|
12
|
+
Platform: linux
|
|
13
|
+
Platform: osx
|
|
14
|
+
Platform: cygwin
|
|
15
|
+
Platform: win32
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: Intended Audience :: Education
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
24
|
+
Classifier: Operating System :: POSIX
|
|
25
|
+
Classifier: Operating System :: Unix
|
|
26
|
+
Classifier: Operating System :: MacOS
|
|
27
|
+
Classifier: Topic :: Scientific/Engineering
|
|
28
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
29
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
30
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
31
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
32
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
33
|
+
Classifier: Programming Language :: C++
|
|
34
|
+
Requires-Python: >=3.11
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
License-File: LICENSE
|
|
37
|
+
Requires-Dist: numpy>=1.26
|
|
38
|
+
Requires-Dist: matplotlib>=3.6
|
|
39
|
+
Requires-Dist: scipy>=1.11
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# InterpolatePy
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
[](https://pepy.tech/projects/interpolatepy)
|
|
46
|
+
[](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml)
|
|
47
|
+
[](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml)
|
|
48
|
+
[](LICENSE)
|
|
49
|
+
|
|
50
|
+
InterpolatePy is a trajectory-planning and interpolation library for robotics,
|
|
51
|
+
animation, and scientific computing. It includes scalar splines, B-spline curve
|
|
52
|
+
tools, bounded motion profiles, quaternion interpolation, and 3D path utilities.
|
|
53
|
+
|
|
54
|
+
The package has a NumPy/SciPy implementation and an optional C++20 backend. Use
|
|
55
|
+
the public names exported by `interpolatepy`; they select the available backend
|
|
56
|
+
at import time.
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python -m pip install InterpolatePy
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
InterpolatePy 3.2.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
|
|
65
|
+
SciPy 1.11 or newer, and Matplotlib 3.6 or newer.
|
|
66
|
+
|
|
67
|
+
## Quick start
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
import numpy as np
|
|
71
|
+
|
|
72
|
+
from interpolatepy import CubicSpline
|
|
73
|
+
from interpolatepy import DoubleSTrajectory
|
|
74
|
+
from interpolatepy import StateParams
|
|
75
|
+
from interpolatepy import TrajectoryBounds
|
|
76
|
+
|
|
77
|
+
# A clamped cubic spline: v0 and vn are endpoint velocities.
|
|
78
|
+
spline = CubicSpline(
|
|
79
|
+
[0.0, 1.0, 2.0, 3.0],
|
|
80
|
+
[0.0, 1.5, -0.5, 2.0],
|
|
81
|
+
v0=0.0,
|
|
82
|
+
vn=0.0,
|
|
83
|
+
)
|
|
84
|
+
times = np.linspace(0.0, 3.0, 100)
|
|
85
|
+
positions = spline.evaluate(times)
|
|
86
|
+
velocities = spline.evaluate_velocity(times)
|
|
87
|
+
|
|
88
|
+
# A jerk-limited Double-S motion profile.
|
|
89
|
+
state = StateParams(q_0=0.0, q_1=10.0, v_0=0.0, v_1=0.0)
|
|
90
|
+
bounds = TrajectoryBounds(v_bound=5.0, a_bound=10.0, j_bound=30.0)
|
|
91
|
+
motion = DoubleSTrajectory(state, bounds)
|
|
92
|
+
sample_times = np.linspace(0.0, motion.get_duration(), 100)
|
|
93
|
+
q, qd, qdd, qddd = motion.evaluate_full(sample_times)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`DoubleSTrajectory.evaluate()` returns position only. Use
|
|
97
|
+
`evaluate_velocity()`, `evaluate_acceleration()`, and `evaluate_jerk()` for one
|
|
98
|
+
component, or `evaluate_full()` for all four.
|
|
99
|
+
|
|
100
|
+
## What is included
|
|
101
|
+
|
|
102
|
+
| Area | Public APIs | Typical use |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
|
|
105
|
+
| B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
|
|
106
|
+
| Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
|
|
107
|
+
| Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
|
|
108
|
+
| Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
|
|
109
|
+
|
|
110
|
+
Degrees 3, 4, and 5 of `BSplineInterpolator`,
|
|
111
|
+
`LogQuaternionInterpolation`, and `ModifiedLogQuaternionInterpolation` support
|
|
112
|
+
as few as two waypoints in version 3.2.0.
|
|
113
|
+
|
|
114
|
+
See the [algorithm selection guide](ALGORITHMS.md), the
|
|
115
|
+
[full documentation](https://giorgiomedico.github.io/InterpolatePy/), and the
|
|
116
|
+
[runnable examples](examples/).
|
|
117
|
+
|
|
118
|
+
## Optional C++ backend
|
|
119
|
+
|
|
120
|
+
The package falls back to Python automatically when the extension is absent:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
import interpolatepy
|
|
124
|
+
|
|
125
|
+
print(interpolatepy.HAS_CPP)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
|
|
129
|
+
implementation. The standard Python package does not need a compiler. Building
|
|
130
|
+
the native library or Python extension from a source checkout requires CMake
|
|
131
|
+
3.21+, a C++20 compiler, and network access for CMake's fetched dependencies;
|
|
132
|
+
see the [installation guide](docs/installation.md#optional-c-backend).
|
|
133
|
+
|
|
134
|
+
## Development
|
|
135
|
+
|
|
136
|
+
This project uses [uv](https://docs.astral.sh/uv/):
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
git clone https://github.com/GiorgioMedico/InterpolatePy.git
|
|
140
|
+
cd InterpolatePy
|
|
141
|
+
uv sync
|
|
142
|
+
uv run pytest
|
|
143
|
+
uv run pre-commit run --all-files
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Documentation dependencies are in a separate group:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
uv sync --group docs
|
|
150
|
+
uv run mkdocs serve
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Every Python program in `examples/` can also be run directly, for example:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
uv run python examples/double_s_ex.py
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
For the complete workflow, see [Contributing](docs/contributing.md).
|
|
160
|
+
|
|
161
|
+
## License and citation
|
|
162
|
+
|
|
163
|
+
InterpolatePy is distributed under the [MIT License](LICENSE).
|
|
164
|
+
|
|
165
|
+
```bibtex
|
|
166
|
+
@misc{InterpolatePy,
|
|
167
|
+
author = {Giorgio Medico},
|
|
168
|
+
title = {InterpolatePy: Trajectory Planning and Interpolation for Python},
|
|
169
|
+
year = {2026},
|
|
170
|
+
url = {https://github.com/GiorgioMedico/InterpolatePy}
|
|
171
|
+
}
|
|
172
|
+
```
|
|
@@ -197,6 +197,9 @@ interpolatepy/_adapters/_motion.py
|
|
|
197
197
|
interpolatepy/_adapters/_paths.py
|
|
198
198
|
interpolatepy/_adapters/_quaternion.py
|
|
199
199
|
interpolatepy/_adapters/_spline.py
|
|
200
|
+
scripts/__init__.py
|
|
201
|
+
scripts/check_doc_snippets.py
|
|
202
|
+
scripts/check_python_examples.py
|
|
200
203
|
tests/__init__.py
|
|
201
204
|
tests/inv_test.py
|
|
202
205
|
tests/test_b_spline.py
|
|
@@ -207,6 +210,7 @@ tests/test_lin_poly_parabolic.py
|
|
|
207
210
|
tests/test_linear.py
|
|
208
211
|
tests/test_log_quat.py
|
|
209
212
|
tests/test_motion_profiles.py
|
|
213
|
+
tests/test_native_adapter_api.py
|
|
210
214
|
tests/test_path_planning.py
|
|
211
215
|
tests/test_polynomials.py
|
|
212
216
|
tests/test_protocols.py
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: InterpolatePy
|
|
3
|
+
Version: 3.2.2
|
|
4
|
+
Summary: A comprehensive Python library for generating smooth trajectories and curves with precise control over position, velocity, acceleration, and jerk profiles
|
|
5
|
+
Author-email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
6
|
+
Maintainer-email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
7
|
+
License-Expression: MIT
|
|
8
|
+
Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
|
|
9
|
+
Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
|
|
10
|
+
Keywords: interpolation,trajectory planning,motion profiles,robotics,b-splines,cubic splines,frenet frames,path generation,motion control
|
|
11
|
+
Platform: unix
|
|
12
|
+
Platform: linux
|
|
13
|
+
Platform: osx
|
|
14
|
+
Platform: cygwin
|
|
15
|
+
Platform: win32
|
|
16
|
+
Classifier: Intended Audience :: Science/Research
|
|
17
|
+
Classifier: Intended Audience :: Developers
|
|
18
|
+
Classifier: Intended Audience :: Education
|
|
19
|
+
Classifier: Programming Language :: Python :: 3
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
21
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
22
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
23
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
24
|
+
Classifier: Operating System :: POSIX
|
|
25
|
+
Classifier: Operating System :: Unix
|
|
26
|
+
Classifier: Operating System :: MacOS
|
|
27
|
+
Classifier: Topic :: Scientific/Engineering
|
|
28
|
+
Classifier: Topic :: Scientific/Engineering :: Mathematics
|
|
29
|
+
Classifier: Topic :: Scientific/Engineering :: Physics
|
|
30
|
+
Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
31
|
+
Classifier: Topic :: Software Development :: Libraries
|
|
32
|
+
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
33
|
+
Classifier: Programming Language :: C++
|
|
34
|
+
Requires-Python: >=3.11
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
36
|
+
License-File: LICENSE
|
|
37
|
+
Requires-Dist: numpy>=1.26
|
|
38
|
+
Requires-Dist: matplotlib>=3.6
|
|
39
|
+
Requires-Dist: scipy>=1.11
|
|
40
|
+
Dynamic: license-file
|
|
41
|
+
|
|
42
|
+
# InterpolatePy
|
|
43
|
+
|
|
44
|
+

|
|
45
|
+
[](https://pepy.tech/projects/interpolatepy)
|
|
46
|
+
[](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/pre-commit.yml)
|
|
47
|
+
[](https://github.com/GiorgioMedico/InterpolatePy/actions/workflows/test.yml)
|
|
48
|
+
[](LICENSE)
|
|
49
|
+
|
|
50
|
+
InterpolatePy is a trajectory-planning and interpolation library for robotics,
|
|
51
|
+
animation, and scientific computing. It includes scalar splines, B-spline curve
|
|
52
|
+
tools, bounded motion profiles, quaternion interpolation, and 3D path utilities.
|
|
53
|
+
|
|
54
|
+
The package has a NumPy/SciPy implementation and an optional C++20 backend. Use
|
|
55
|
+
the public names exported by `interpolatepy`; they select the available backend
|
|
56
|
+
at import time.
|
|
57
|
+
|
|
58
|
+
## Installation
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
python -m pip install InterpolatePy
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
InterpolatePy 3.2.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
|
|
65
|
+
SciPy 1.11 or newer, and Matplotlib 3.6 or newer.
|
|
66
|
+
|
|
67
|
+
## Quick start
|
|
68
|
+
|
|
69
|
+
```python
|
|
70
|
+
import numpy as np
|
|
71
|
+
|
|
72
|
+
from interpolatepy import CubicSpline
|
|
73
|
+
from interpolatepy import DoubleSTrajectory
|
|
74
|
+
from interpolatepy import StateParams
|
|
75
|
+
from interpolatepy import TrajectoryBounds
|
|
76
|
+
|
|
77
|
+
# A clamped cubic spline: v0 and vn are endpoint velocities.
|
|
78
|
+
spline = CubicSpline(
|
|
79
|
+
[0.0, 1.0, 2.0, 3.0],
|
|
80
|
+
[0.0, 1.5, -0.5, 2.0],
|
|
81
|
+
v0=0.0,
|
|
82
|
+
vn=0.0,
|
|
83
|
+
)
|
|
84
|
+
times = np.linspace(0.0, 3.0, 100)
|
|
85
|
+
positions = spline.evaluate(times)
|
|
86
|
+
velocities = spline.evaluate_velocity(times)
|
|
87
|
+
|
|
88
|
+
# A jerk-limited Double-S motion profile.
|
|
89
|
+
state = StateParams(q_0=0.0, q_1=10.0, v_0=0.0, v_1=0.0)
|
|
90
|
+
bounds = TrajectoryBounds(v_bound=5.0, a_bound=10.0, j_bound=30.0)
|
|
91
|
+
motion = DoubleSTrajectory(state, bounds)
|
|
92
|
+
sample_times = np.linspace(0.0, motion.get_duration(), 100)
|
|
93
|
+
q, qd, qdd, qddd = motion.evaluate_full(sample_times)
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
`DoubleSTrajectory.evaluate()` returns position only. Use
|
|
97
|
+
`evaluate_velocity()`, `evaluate_acceleration()`, and `evaluate_jerk()` for one
|
|
98
|
+
component, or `evaluate_full()` for all four.
|
|
99
|
+
|
|
100
|
+
## What is included
|
|
101
|
+
|
|
102
|
+
| Area | Public APIs | Typical use |
|
|
103
|
+
| --- | --- | --- |
|
|
104
|
+
| Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
|
|
105
|
+
| B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
|
|
106
|
+
| Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
|
|
107
|
+
| Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
|
|
108
|
+
| Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
|
|
109
|
+
|
|
110
|
+
Degrees 3, 4, and 5 of `BSplineInterpolator`,
|
|
111
|
+
`LogQuaternionInterpolation`, and `ModifiedLogQuaternionInterpolation` support
|
|
112
|
+
as few as two waypoints in version 3.2.0.
|
|
113
|
+
|
|
114
|
+
See the [algorithm selection guide](ALGORITHMS.md), the
|
|
115
|
+
[full documentation](https://giorgiomedico.github.io/InterpolatePy/), and the
|
|
116
|
+
[runnable examples](examples/).
|
|
117
|
+
|
|
118
|
+
## Optional C++ backend
|
|
119
|
+
|
|
120
|
+
The package falls back to Python automatically when the extension is absent:
|
|
121
|
+
|
|
122
|
+
```python
|
|
123
|
+
import interpolatepy
|
|
124
|
+
|
|
125
|
+
print(interpolatepy.HAS_CPP)
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
|
|
129
|
+
implementation. The standard Python package does not need a compiler. Building
|
|
130
|
+
the native library or Python extension from a source checkout requires CMake
|
|
131
|
+
3.21+, a C++20 compiler, and network access for CMake's fetched dependencies;
|
|
132
|
+
see the [installation guide](docs/installation.md#optional-c-backend).
|
|
133
|
+
|
|
134
|
+
## Development
|
|
135
|
+
|
|
136
|
+
This project uses [uv](https://docs.astral.sh/uv/):
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
git clone https://github.com/GiorgioMedico/InterpolatePy.git
|
|
140
|
+
cd InterpolatePy
|
|
141
|
+
uv sync
|
|
142
|
+
uv run pytest
|
|
143
|
+
uv run pre-commit run --all-files
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Documentation dependencies are in a separate group:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
uv sync --group docs
|
|
150
|
+
uv run mkdocs serve
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Every Python program in `examples/` can also be run directly, for example:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
uv run python examples/double_s_ex.py
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
For the complete workflow, see [Contributing](docs/contributing.md).
|
|
160
|
+
|
|
161
|
+
## License and citation
|
|
162
|
+
|
|
163
|
+
InterpolatePy is distributed under the [MIT License](LICENSE).
|
|
164
|
+
|
|
165
|
+
```bibtex
|
|
166
|
+
@misc{InterpolatePy,
|
|
167
|
+
author = {Giorgio Medico},
|
|
168
|
+
title = {InterpolatePy: Trajectory Planning and Interpolation for Python},
|
|
169
|
+
year = {2026},
|
|
170
|
+
url = {https://github.com/GiorgioMedico/InterpolatePy}
|
|
171
|
+
}
|
|
172
|
+
```
|