InterpolatePy 3.2.2__tar.gz → 3.3.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.
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/docs.yml +9 -5
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/pre-commit.yml +4 -2
- interpolatepy-3.3.1/.github/workflows/publish.yml +54 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/workflows/test.yml +14 -10
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.gitignore +9 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/ALGORITHMS.md +34 -2
- {interpolatepy-3.2.2/InterpolatePy.egg-info → interpolatepy-3.3.1}/PKG-INFO +22 -22
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/README.md +12 -7
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/CMakeLists.txt +47 -18
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/CMakeLists.txt +2 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_quaternion.cpp +78 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/CMakeLists.txt +1 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_approx_smooth_example.cpp +4 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/concepts_example.cpp +4 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/paths_example.cpp +5 -4
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/quaternion_example.cpp +5 -4
- interpolatepy-3.3.1/cpp/examples/spring_quaternion_example.cpp +81 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/concepts.hpp +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/config.hpp +3 -1
- interpolatepy-3.3.1/cpp/include/interpolatecpp/quat/shooting_quaternion_interpolation.hpp +61 -0
- interpolatepy-3.3.1/cpp/include/interpolatecpp/quat/spring_quaternion_interpolation.hpp +146 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_bspline_interpolation.cpp +8 -9
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/double_s_trajectory.cpp +5 -4
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/log_quaternion_interpolation.cpp +7 -6
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/modified_log_quaternion_interpolation.cpp +39 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/quaternion.cpp +2 -1
- interpolatepy-3.3.1/cpp/src/shooting_quaternion_interpolation.cpp +117 -0
- interpolatepy-3.3.1/cpp/src/shooting_solver.cpp +282 -0
- interpolatepy-3.3.1/cpp/src/shooting_solver.hpp +22 -0
- interpolatepy-3.3.1/cpp/src/spring_energy.hpp +80 -0
- interpolatepy-3.3.1/cpp/src/spring_gauss_newton.cpp +194 -0
- interpolatepy-3.3.1/cpp/src/spring_quaternion_interpolation.cpp +281 -0
- interpolatepy-3.3.1/cpp/src/spring_solver.cpp +320 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/CMakeLists.txt +2 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_bspline_variants.cpp +4 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_concepts.cpp +6 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline.cpp +5 -4
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_paths.cpp +6 -5
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_quaternion.cpp +9 -8
- interpolatepy-3.3.1/cpp/tests/test_shooting_quaternion.cpp +154 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_smoothing_search.cpp +2 -1
- interpolatepy-3.3.1/cpp/tests/test_spring_quaternion.cpp +316 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/algorithms.md +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/api-reference.md +31 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/architecture.md +29 -13
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/changelog.md +39 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/contributing.md +12 -5
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/examples.md +3 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/index.md +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/installation.md +10 -7
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/troubleshooting.md +4 -4
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/motion-profiles.md +2 -2
- interpolatepy-3.3.1/docs/tutorials/quaternion-interpolation.md +444 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/user-guide.md +2 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_smoot_search_ex.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/double_s_ex.py +30 -10
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/log_quat_new_ex.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/lqi_spiral_frenet_ex.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/mlqi_spiral_frenet_ex.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/polynomials_ex.py +3 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/quat_visualization_ex.py +1 -1
- interpolatepy-3.3.1/examples/shooting_quaternion_benchmark.py +74 -0
- interpolatepy-3.3.1/examples/spring_quaternion_ex.py +377 -0
- interpolatepy-3.3.1/examples/spring_solver_benchmark.py +84 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/squad_c2_ex.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/trapezoidal_ex.py +1 -1
- interpolatepy-3.3.1/graphify-out/GRAPH_REPORT.md +1080 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/mkdocs.yml +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/pyproject.toml +88 -15
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/check_python_examples.py +6 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/__init__.py +18 -6
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/__init__.py +8 -6
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_bspline.py +3 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_direct.py +7 -7
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_double_s.py +96 -0
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_parabolic.py +98 -0
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_polynomial.py +224 -0
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_motion_trapezoidal.py +91 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_quaternion.py +5 -5
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_quaternion_shooting.py +59 -0
- interpolatepy-3.3.1/src/interpolatepy/_adapters/_quaternion_spring.py +132 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_spline.py +3 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_api.py +38 -32
- interpolatepy-3.3.1/src/interpolatepy/bsplines/__init__.py +37 -0
- interpolatepy-3.3.1/src/interpolatepy/bsplines/_approximation_system.py +157 -0
- interpolatepy-3.3.1/src/interpolatepy/bsplines/_interpolation_system.py +215 -0
- interpolatepy-3.3.1/src/interpolatepy/bsplines/_parameterization.py +36 -0
- interpolatepy-3.2.2/interpolatepy/b_spline_approx.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/approximation.py +20 -261
- interpolatepy-3.2.2/interpolatepy/b_spline.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/core.py +17 -140
- interpolatepy-3.2.2/interpolatepy/b_spline_cubic.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/cubic.py +5 -99
- interpolatepy-3.2.2/interpolatepy/b_spline_interpolate.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/interpolation.py +8 -244
- interpolatepy-3.2.2/interpolatepy/b_spline_smooth.py → interpolatepy-3.3.1/src/interpolatepy/bsplines/smoothing.py +4 -78
- interpolatepy-3.3.1/src/interpolatepy/motion/__init__.py +69 -0
- interpolatepy-3.3.1/src/interpolatepy/motion/_double_s_planner.py +243 -0
- {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/motion}/double_s.py +4 -235
- interpolatepy-3.2.2/interpolatepy/lin_poly_parabolic.py → interpolatepy-3.3.1/src/interpolatepy/motion/parabolic.py +2 -1
- interpolatepy-3.3.1/src/interpolatepy/paths/__init__.py +52 -0
- interpolatepy-3.2.2/interpolatepy/frenet_frame.py → interpolatepy-3.3.1/src/interpolatepy/paths/frenet.py +8 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/protocols.py +9 -4
- interpolatepy-3.3.1/src/interpolatepy/quaternion/__init__.py +63 -0
- interpolatepy-3.3.1/src/interpolatepy/quaternion/_shooting_solver.py +245 -0
- interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_energy.py +62 -0
- interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_gauss_newton.py +85 -0
- interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_slerp.py +40 -0
- interpolatepy-3.3.1/src/interpolatepy/quaternion/_spring_solver.py +199 -0
- interpolatepy-3.2.2/interpolatepy/log_quat.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/logarithmic.py +2 -2
- interpolatepy-3.3.1/src/interpolatepy/quaternion/shooting.py +199 -0
- interpolatepy-3.2.2/interpolatepy/quat_spline.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/spline.py +1 -1
- interpolatepy-3.3.1/src/interpolatepy/quaternion/spring.py +399 -0
- interpolatepy-3.2.2/interpolatepy/squad_c2.py → interpolatepy-3.3.1/src/interpolatepy/quaternion/squad.py +21 -7
- interpolatepy-3.3.1/src/interpolatepy/splines/__init__.py +39 -0
- interpolatepy-3.2.2/interpolatepy/c_s_with_acc1.py → interpolatepy-3.3.1/src/interpolatepy/splines/acceleration1.py +3 -2
- interpolatepy-3.2.2/interpolatepy/c_s_with_acc2.py → interpolatepy-3.3.1/src/interpolatepy/splines/acceleration2.py +1 -1
- interpolatepy-3.2.2/interpolatepy/cubic_spline.py → interpolatepy-3.3.1/src/interpolatepy/splines/cubic.py +3 -2
- interpolatepy-3.2.2/interpolatepy/c_s_smoot_search.py → interpolatepy-3.3.1/src/interpolatepy/splines/search.py +6 -12
- interpolatepy-3.2.2/interpolatepy/c_s_smoothing.py → interpolatepy-3.3.1/src/interpolatepy/splines/smoothing.py +2 -1
- interpolatepy-3.3.1/src/interpolatepy/version.py +9 -0
- interpolatepy-3.3.1/src/interpolatepy/visualization/__init__.py +13 -0
- interpolatepy-3.3.1/src/interpolatepy/visualization/bspline.py +122 -0
- interpolatepy-3.2.2/interpolatepy/quat_visualization.py → interpolatepy-3.3.1/src/interpolatepy/visualization/quaternion.py +20 -75
- interpolatepy-3.3.1/src/interpolatepy/visualization/quaternion_math.py +80 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/inv_test.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_b_spline.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_b_spline_variants.py +6 -11
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_backend.py +5 -6
- interpolatepy-3.3.1/tests/test_cpp_parity.py +143 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_cubic_spline.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_lin_poly_parabolic.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_linear.py +1 -1
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_log_quat.py +2 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_motion_profiles.py +30 -11
- interpolatepy-3.3.1/tests/test_native_adapter_api.py +234 -0
- interpolatepy-3.3.1/tests/test_package_structure.py +79 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_path_planning.py +3 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_polynomials.py +7 -7
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_quat_interp.py +2 -2
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_quat_visualization.py +7 -7
- interpolatepy-3.3.1/tests/test_shooting_quaternion.py +307 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_smoothing.py +9 -10
- interpolatepy-3.3.1/tests/test_spring_gauss_newton.py +151 -0
- interpolatepy-3.3.1/tests/test_spring_performance.py +192 -0
- interpolatepy-3.3.1/tests/test_spring_quaternion.py +390 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_squad_c2.py +44 -3
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/uv.lock +19 -3
- interpolatepy-3.2.2/.github/workflows/publish.yml +0 -28
- interpolatepy-3.2.2/InterpolatePy.egg-info/SOURCES.txt +0 -220
- interpolatepy-3.2.2/InterpolatePy.egg-info/requires.txt +0 -3
- interpolatepy-3.2.2/InterpolatePy.egg-info/top_level.txt +0 -1
- interpolatepy-3.2.2/PKG-INFO +0 -172
- interpolatepy-3.2.2/docs/tutorials/quaternion-interpolation.md +0 -216
- interpolatepy-3.2.2/interpolatepy/_adapters/_motion.py +0 -534
- interpolatepy-3.2.2/interpolatepy/version.py +0 -5
- interpolatepy-3.2.2/setup.cfg +0 -4
- interpolatepy-3.2.2/tests/test_native_adapter_api.py +0 -127
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.editorconfig +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.gitattributes +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.github/FUNDING.yml +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.pre-commit-config.yaml +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/.python-version +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/LICENSE +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/codecov.yml +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_acc_splines.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_bspline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_cubic_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_motion.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_paths.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_smoothing_search.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/bind_tridiagonal.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/bindings/module.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/cmake/InterpolateCppConfig.cmake.in +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/cmake/version.hpp.in +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_cubic_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/bspline_interpolator_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_smoothing_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_acc1_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_acc2_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/cubic_spline_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/double_s_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/parabolic_linear_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/polynomial_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/shared/example_utils.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/examples/trapezoidal_example.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/approximation_bspline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline_interpolator.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/bspline_parameters.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/cubic_bspline_interpolation.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/bspline/smoothing_cubic_bspline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/double_s_trajectory.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/motion_types.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/parabolic_blend_trajectory.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/polynomial_trajectory.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/motion/trapezoidal_trajectory.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/circular_path.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/frenet_frame.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/linear_path.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/path/linear_traj.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/log_quaternion_interpolation.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/modified_log_quaternion_interpolation.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/quaternion.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/quaternion_spline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/quat/squad_c2.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_smoothing_spline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc1.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/cubic_spline_with_acc2.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/smoothing_search.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/spline/spline_parameters.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/include/interpolatecpp/tridiagonal.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/approximation_bspline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/bspline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/bspline_interpolator.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/circular_path.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline_with_acc1.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/cubic_spline_with_acc2.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/frenet_frame.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/linear_path.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/linear_traj.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/parabolic_blend_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/polynomial_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/quaternion_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/smoothing_cubic_bspline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/smoothing_search.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/squad_c2.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/src/trapezoidal_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/shared/test_data.hpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_bspline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_smoothing_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline_with_acc1.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_cubic_spline_with_acc2.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_double_s_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_parabolic_blend_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_polynomial_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_quaternion_spline.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_trapezoidal_trajectory.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/cpp/tests/test_tridiagonal.cpp +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/assets/extra.css +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/assets/extra.js +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/quickstart.md +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/path-planning.md +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/docs/tutorials/spline-interpolation.md +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_approx_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_cubic_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_interpolate_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/b_spline_smooth_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_smoothing_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_with_acc1_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/c_s_with_acc2_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/cubic_spline_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/frenet_frame_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/lin_poly_parabolic_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/linear_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/main.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/protocols_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/examples/simple_paths_ex.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/__init__.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/scripts/check_doc_snippets.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_adapters/_paths.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1/src}/interpolatepy/_backend.py +0 -0
- /interpolatepy-3.2.2/interpolatepy/tridiagonal_inv.py → /interpolatepy-3.3.1/src/interpolatepy/linalg.py +0 -0
- /interpolatepy-3.2.2/interpolatepy/polynomials.py → /interpolatepy-3.3.1/src/interpolatepy/motion/polynomial.py +0 -0
- {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/motion}/trapezoidal.py +0 -0
- /interpolatepy-3.2.2/interpolatepy/simple_paths.py → /interpolatepy-3.3.1/src/interpolatepy/paths/geometric.py +0 -0
- {interpolatepy-3.2.2/interpolatepy → interpolatepy-3.3.1/src/interpolatepy/paths}/linear.py +0 -0
- /interpolatepy-3.2.2/InterpolatePy.egg-info/dependency_links.txt → /interpolatepy-3.3.1/src/interpolatepy/py.typed +0 -0
- /interpolatepy-3.2.2/interpolatepy/quat_core.py → /interpolatepy-3.3.1/src/interpolatepy/quaternion/core.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/__init__.py +0 -0
- {interpolatepy-3.2.2 → interpolatepy-3.3.1}/tests/test_protocols.py +0 -0
|
@@ -8,7 +8,7 @@ on:
|
|
|
8
8
|
- 'ALGORITHMS.md'
|
|
9
9
|
- 'docs/**'
|
|
10
10
|
- 'mkdocs.yml'
|
|
11
|
-
- 'interpolatepy/**/*.py' # Only Python files for API docs
|
|
11
|
+
- 'src/interpolatepy/**/*.py' # Only Python files for API docs
|
|
12
12
|
- 'scripts/check_doc_snippets.py'
|
|
13
13
|
- 'pyproject.toml'
|
|
14
14
|
- 'uv.lock'
|
|
@@ -20,7 +20,7 @@ on:
|
|
|
20
20
|
- 'ALGORITHMS.md'
|
|
21
21
|
- 'docs/**'
|
|
22
22
|
- 'mkdocs.yml'
|
|
23
|
-
- 'interpolatepy/**/*.py'
|
|
23
|
+
- 'src/interpolatepy/**/*.py'
|
|
24
24
|
- 'scripts/check_doc_snippets.py'
|
|
25
25
|
- 'pyproject.toml'
|
|
26
26
|
- 'uv.lock'
|
|
@@ -52,16 +52,20 @@ jobs:
|
|
|
52
52
|
cache-dependency-glob: uv.lock
|
|
53
53
|
|
|
54
54
|
- name: Sync dependencies
|
|
55
|
-
run: uv sync --locked --no-default-groups --group docs
|
|
55
|
+
run: uv sync --locked --no-default-groups --group docs --no-install-project
|
|
56
56
|
|
|
57
57
|
- name: Check documentation snippets
|
|
58
58
|
env:
|
|
59
59
|
INTERPOLATEPY_NO_CPP: '1'
|
|
60
60
|
MPLBACKEND: Agg
|
|
61
|
-
|
|
61
|
+
PYTHONPATH: src
|
|
62
|
+
run: uv run --no-sync python -m scripts.check_doc_snippets
|
|
62
63
|
|
|
63
64
|
- name: Build documentation
|
|
64
|
-
|
|
65
|
+
env:
|
|
66
|
+
INTERPOLATEPY_NO_CPP: '1'
|
|
67
|
+
PYTHONPATH: src
|
|
68
|
+
run: uv run --no-sync mkdocs build --clean --strict
|
|
65
69
|
|
|
66
70
|
- name: Setup Pages
|
|
67
71
|
if: github.ref == 'refs/heads/main' && github.event_name == 'push'
|
|
@@ -16,7 +16,7 @@ jobs:
|
|
|
16
16
|
enable-cache: true
|
|
17
17
|
cache-dependency-glob: uv.lock
|
|
18
18
|
- name: Sync dependencies
|
|
19
|
-
run: uv sync --locked --no-default-groups --group dev
|
|
19
|
+
run: uv sync --locked --no-default-groups --group dev --no-install-project
|
|
20
20
|
- name: Cache pre-commit hook environments
|
|
21
21
|
uses: actions/cache@v5
|
|
22
22
|
with:
|
|
@@ -25,4 +25,6 @@ jobs:
|
|
|
25
25
|
restore-keys: |
|
|
26
26
|
pre-commit-${{ runner.os }}-
|
|
27
27
|
- name: Run pre-commit
|
|
28
|
-
run: uv run pre-commit run --all-files --show-diff-on-failure
|
|
28
|
+
run: uv run --no-sync pre-commit run --all-files --show-diff-on-failure
|
|
29
|
+
- name: Run Pyright
|
|
30
|
+
run: uv run --no-sync pyright src/interpolatepy
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
name: Publish
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
release:
|
|
5
|
+
types: [published]
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
build-sdist:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v6
|
|
12
|
+
with:
|
|
13
|
+
fetch-depth: 0
|
|
14
|
+
- uses: astral-sh/setup-uv@v8.1.0
|
|
15
|
+
- name: Build source distribution
|
|
16
|
+
run: uv build --sdist
|
|
17
|
+
- uses: actions/upload-artifact@v6
|
|
18
|
+
with:
|
|
19
|
+
name: dist-sdist
|
|
20
|
+
path: dist/*.tar.gz
|
|
21
|
+
|
|
22
|
+
build-wheels:
|
|
23
|
+
name: Build wheels on ${{ matrix.os }}
|
|
24
|
+
runs-on: ${{ matrix.os }}
|
|
25
|
+
strategy:
|
|
26
|
+
fail-fast: false
|
|
27
|
+
matrix:
|
|
28
|
+
os: [ubuntu-latest, macos-15-intel, macos-latest]
|
|
29
|
+
steps:
|
|
30
|
+
- uses: actions/checkout@v6
|
|
31
|
+
- uses: actions/setup-python@v6
|
|
32
|
+
- name: Install cibuildwheel
|
|
33
|
+
run: python -m pip install cibuildwheel==4.2.0
|
|
34
|
+
- name: Build and test wheels
|
|
35
|
+
run: python -m cibuildwheel --output-dir wheelhouse
|
|
36
|
+
- uses: actions/upload-artifact@v6
|
|
37
|
+
with:
|
|
38
|
+
name: dist-wheel-${{ matrix.os }}
|
|
39
|
+
path: wheelhouse/*.whl
|
|
40
|
+
|
|
41
|
+
publish:
|
|
42
|
+
needs: [build-sdist, build-wheels]
|
|
43
|
+
runs-on: ubuntu-latest
|
|
44
|
+
permissions:
|
|
45
|
+
id-token: write
|
|
46
|
+
contents: read
|
|
47
|
+
environment: pypi
|
|
48
|
+
steps:
|
|
49
|
+
- uses: actions/download-artifact@v5
|
|
50
|
+
with:
|
|
51
|
+
pattern: dist-*
|
|
52
|
+
path: dist
|
|
53
|
+
merge-multiple: true
|
|
54
|
+
- uses: pypa/gh-action-pypi-publish@release/v1
|
|
@@ -14,6 +14,8 @@ jobs:
|
|
|
14
14
|
os: [ubuntu-latest, macos-latest]
|
|
15
15
|
python-version: ['3.11', '3.12', '3.13']
|
|
16
16
|
env:
|
|
17
|
+
INTERPOLATEPY_NO_CPP: '1'
|
|
18
|
+
PYTHONPATH: src
|
|
17
19
|
UV_PYTHON: ${{ matrix.python-version }}
|
|
18
20
|
steps:
|
|
19
21
|
- uses: actions/checkout@v6
|
|
@@ -23,9 +25,9 @@ jobs:
|
|
|
23
25
|
enable-cache: true
|
|
24
26
|
cache-dependency-glob: uv.lock
|
|
25
27
|
- name: Sync dependencies
|
|
26
|
-
run: uv sync --locked --no-default-groups --group test
|
|
28
|
+
run: uv sync --locked --no-default-groups --group test --no-install-project
|
|
27
29
|
- name: Testing with coverage
|
|
28
|
-
run: uv run pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
|
|
30
|
+
run: uv run --no-sync pytest tests --cov=interpolatepy --cov-report=xml --cov-report=term-missing
|
|
29
31
|
- name: Upload coverage to Codecov
|
|
30
32
|
uses: codecov/codecov-action@v6
|
|
31
33
|
with:
|
|
@@ -38,6 +40,7 @@ jobs:
|
|
|
38
40
|
python-examples:
|
|
39
41
|
runs-on: ubuntu-latest
|
|
40
42
|
env:
|
|
43
|
+
PYTHONPATH: src
|
|
41
44
|
UV_PYTHON: '3.12'
|
|
42
45
|
steps:
|
|
43
46
|
- uses: actions/checkout@v6
|
|
@@ -47,13 +50,14 @@ jobs:
|
|
|
47
50
|
enable-cache: true
|
|
48
51
|
cache-dependency-glob: uv.lock
|
|
49
52
|
- name: Sync dependencies
|
|
50
|
-
run: uv sync --locked --no-default-groups --group test
|
|
53
|
+
run: uv sync --locked --no-default-groups --group test --no-install-project
|
|
51
54
|
- name: Run Python examples with the fallback backend
|
|
52
|
-
run: uv run python -m scripts.check_python_examples --backend python
|
|
55
|
+
run: uv run --no-sync python -m scripts.check_python_examples --backend python
|
|
53
56
|
|
|
54
57
|
native:
|
|
55
58
|
runs-on: ubuntu-latest
|
|
56
59
|
env:
|
|
60
|
+
PYTHONPATH: src
|
|
57
61
|
UV_PYTHON: '3.12'
|
|
58
62
|
steps:
|
|
59
63
|
- uses: actions/checkout@v6
|
|
@@ -63,25 +67,25 @@ jobs:
|
|
|
63
67
|
enable-cache: true
|
|
64
68
|
cache-dependency-glob: uv.lock
|
|
65
69
|
- name: Sync dependencies
|
|
66
|
-
run: uv sync --locked --no-default-groups --group test
|
|
70
|
+
run: uv sync --locked --no-default-groups --group test --no-install-project
|
|
67
71
|
- name: Configure C++ tests, examples, and Python bindings
|
|
68
72
|
run: |
|
|
69
73
|
cmake -S cpp -B build/cpp \
|
|
70
74
|
-DINTERPOLATECPP_BUILD_TESTS=ON \
|
|
71
75
|
-DINTERPOLATECPP_BUILD_EXAMPLES=ON \
|
|
72
76
|
-DINTERPOLATECPP_BUILD_BINDINGS=ON \
|
|
73
|
-
-DPython_EXECUTABLE=$(uv run python -c 'import sys; print(sys.executable)')
|
|
77
|
+
-DPython_EXECUTABLE=$(uv run --no-sync python -c 'import sys; print(sys.executable)')
|
|
74
78
|
- name: Build native targets
|
|
75
79
|
run: cmake --build build/cpp --parallel 4
|
|
76
80
|
- name: Run C++ tests and examples
|
|
77
81
|
run: ctest --test-dir build/cpp --output-on-failure
|
|
78
82
|
- name: Activate the native Python backend
|
|
79
|
-
run: cp build/cpp/bindings/interpolatecpp_py*.so interpolatepy/
|
|
83
|
+
run: cp build/cpp/bindings/interpolatecpp_py*.so src/interpolatepy/
|
|
80
84
|
- name: Run native adapter regressions
|
|
81
|
-
run: uv run pytest tests/test_backend.py tests/test_native_adapter_api.py
|
|
85
|
+
run: uv run --no-sync pytest tests/test_backend.py tests/test_native_adapter_api.py
|
|
82
86
|
- name: Run documentation snippets with the native backend
|
|
83
87
|
env:
|
|
84
88
|
MPLBACKEND: Agg
|
|
85
|
-
run: uv run python -m scripts.check_doc_snippets
|
|
89
|
+
run: uv run --no-sync python -m scripts.check_doc_snippets
|
|
86
90
|
- name: Run Python examples with the native backend
|
|
87
|
-
run: uv run python -m scripts.check_python_examples --backend native
|
|
91
|
+
run: uv run --no-sync python -m scripts.check_python_examples --backend native
|
|
@@ -148,3 +148,12 @@ cpp/build/
|
|
|
148
148
|
*.so
|
|
149
149
|
*.dylib
|
|
150
150
|
compile_commands.json
|
|
151
|
+
|
|
152
|
+
################################
|
|
153
|
+
########### GRAPHIFY ###########
|
|
154
|
+
################################
|
|
155
|
+
# Generated graph: keep the human-readable report (and wiki, if built), drop the
|
|
156
|
+
# 9 MB of graph.json/graph.html plus caches that churn on every `graphify update`.
|
|
157
|
+
graphify-out/*
|
|
158
|
+
!graphify-out/GRAPH_REPORT.md
|
|
159
|
+
!graphify-out/wiki/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# InterpolatePy algorithm guide
|
|
2
2
|
|
|
3
|
-
This page is a compact map of the algorithms exposed by InterpolatePy 3.
|
|
3
|
+
This page is a compact map of the algorithms exposed by InterpolatePy 3.3.1.
|
|
4
4
|
For constructor signatures and complete method documentation, use the
|
|
5
5
|
[API reference](docs/api-reference.md). For worked code, use the
|
|
6
6
|
[tutorials](docs/user-guide.md) and [`examples/`](examples/).
|
|
@@ -23,6 +23,8 @@ For constructor signatures and complete method documentation, use the
|
|
|
23
23
|
| Interpolate two orientations | `Quaternion.slerp()` | Shortest-path spherical interpolation |
|
|
24
24
|
| Interpolate orientation keyframes | `QuaternionSpline` | Piecewise SLERP/SQUAD selected explicitly or automatically |
|
|
25
25
|
| Require a smooth SQUAD-style orientation trajectory | `SquadC2` | Virtual endpoints and smooth angular derivative evaluation |
|
|
26
|
+
| Reduce curvature globally across orientation keyframes | `SpringQuaternionInterpolation` | Numerical SPRING relaxation with fixed keyframes |
|
|
27
|
+
| Solve continuous natural Riemannian cubics | `ShootingQuaternionInterpolation` | Sparse multiple shooting with nine unknowns per keyframe interval |
|
|
26
28
|
| Interpolate rotations in logarithmic coordinates | `LogQuaternionInterpolation` | B-spline interpolation of continuous rotation vectors |
|
|
27
29
|
| Decouple rotation angle and axis | `ModifiedLogQuaternionInterpolation` | Separate angle and unit-axis spline state |
|
|
28
30
|
| Describe a 3D line or circle geometrically | `LinearPath` or `CircularPath` | Arc-length parameterized position and geometric derivatives |
|
|
@@ -99,7 +101,7 @@ Scalar and NumPy-array times are supported. Times are clipped to the planned
|
|
|
99
101
|
duration. Inspect `get_duration()` and `get_phase_durations()` for timing.
|
|
100
102
|
|
|
101
103
|
`TrapezoidalTrajectory.generate_trajectory()` returns a callable and duration.
|
|
102
|
-
Its `TrajectoryParams` lives in `interpolatepy.trapezoidal`; the top-level
|
|
104
|
+
Its `TrajectoryParams` lives in `interpolatepy.motion.trapezoidal`; the top-level
|
|
103
105
|
`interpolatepy.TrajectoryParams` is the distinct multipoint polynomial
|
|
104
106
|
configuration class.
|
|
105
107
|
|
|
@@ -122,6 +124,36 @@ equality when sign is irrelevant.
|
|
|
122
124
|
the quaternion trajectory protocol. `SquadC2` adds virtual endpoints and
|
|
123
125
|
derivative-aware interpolation.
|
|
124
126
|
|
|
127
|
+
`SpringQuaternionInterpolation` globally relaxes a sampled piecewise-SLERP
|
|
128
|
+
curve to reduce tangential curvature while keeping keyframes fixed. It has a
|
|
129
|
+
higher one-time construction cost than the closed-form methods, so compare
|
|
130
|
+
setup and repeated evaluation separately. The runnable
|
|
131
|
+
[`spring_quaternion_ex.py`](examples/spring_quaternion_ex.py) example plots
|
|
132
|
+
SPRING beside multiple shooting, LQI, mLQI, piecewise SLERP, SQUAD, and
|
|
133
|
+
SQUAD-C2 and measures both costs on the active backend. A second figure repeats
|
|
134
|
+
the acceleration-energy comparison for the smoothest methods alone, which the
|
|
135
|
+
shared scale of the overview figure flattens.
|
|
136
|
+
|
|
137
|
+
For the same discrete SPRING problem, `SpringConfig(solver="gauss_newton")`
|
|
138
|
+
replaces only the final-grid optimizer with a banded Gauss-Newton solve.
|
|
139
|
+
Coarse solves remain identical to the default `"gradient_descent"`. Check `converged` and `stage_gradient_norms` rather than
|
|
140
|
+
assuming a finite iteration budget reached a solution. `final_iterations`
|
|
141
|
+
can increase just the final-grid budget without changing coarse inputs.
|
|
142
|
+
[`spring_solver_benchmark.py`](examples/spring_solver_benchmark.py) compares
|
|
143
|
+
both solvers at a common tolerance and reports the angular difference.
|
|
144
|
+
|
|
145
|
+
`ShootingQuaternionInterpolation` solves the natural Riemannian cubic equations
|
|
146
|
+
using independent integrations between keyframes, analytic sensitivities, and
|
|
147
|
+
sparse damped Newton steps. Orientation, body angular velocity, and angular
|
|
148
|
+
acceleration match at knots; endpoint acceleration is zero. Its `9*(K-1)`
|
|
149
|
+
unknowns depend on keyframe count, not output resolution. This is a local
|
|
150
|
+
stationary solution of continuous squared covariant acceleration, not a
|
|
151
|
+
replacement for SPRING's discrete chord-parameterized objective or a guarantee
|
|
152
|
+
of global minimality. The C++ implementation is selected automatically when
|
|
153
|
+
available; the NumPy/SciPy reference remains available. Run
|
|
154
|
+
[`shooting_quaternion_benchmark.py`](examples/shooting_quaternion_benchmark.py)
|
|
155
|
+
to compare construction and sampling costs against different SPRING grids.
|
|
156
|
+
|
|
125
157
|
The logarithmic interpolators support B-spline degrees 3, 4, and 5 and, since
|
|
126
158
|
3.2.0, accept as few as two quaternion waypoints. `evaluate_velocity()` and
|
|
127
159
|
`evaluate_acceleration()` return derivatives of the interpolated internal
|
|
@@ -1,18 +1,12 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: InterpolatePy
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.3.1
|
|
4
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
5
|
Keywords: interpolation,trajectory planning,motion profiles,robotics,b-splines,cubic splines,frenet frames,path generation,motion control
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
Platform: win32
|
|
6
|
+
Author-Email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
7
|
+
Maintainer-Email: Giorgio Medico <giorgio.medico11@gmail.com>
|
|
8
|
+
License-Expression: MIT
|
|
9
|
+
License-File: LICENSE
|
|
16
10
|
Classifier: Intended Audience :: Science/Research
|
|
17
11
|
Classifier: Intended Audience :: Developers
|
|
18
12
|
Classifier: Intended Audience :: Education
|
|
@@ -31,13 +25,14 @@ Classifier: Topic :: Scientific/Engineering :: Visualization
|
|
|
31
25
|
Classifier: Topic :: Software Development :: Libraries
|
|
32
26
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
33
27
|
Classifier: Programming Language :: C++
|
|
28
|
+
Project-URL: Homepage, https://github.com/GiorgioMedico/InterpolatePy
|
|
29
|
+
Project-URL: Bug Tracker, https://github.com/GiorgioMedico/InterpolatePy/issues
|
|
34
30
|
Requires-Python: >=3.11
|
|
35
|
-
Description-Content-Type: text/markdown
|
|
36
|
-
License-File: LICENSE
|
|
37
31
|
Requires-Dist: numpy>=1.26
|
|
38
|
-
Requires-Dist: matplotlib>=3.6
|
|
39
32
|
Requires-Dist: scipy>=1.11
|
|
40
|
-
|
|
33
|
+
Provides-Extra: plot
|
|
34
|
+
Requires-Dist: matplotlib>=3.6; extra == "plot"
|
|
35
|
+
Description-Content-Type: text/markdown
|
|
41
36
|
|
|
42
37
|
# InterpolatePy
|
|
43
38
|
|
|
@@ -61,8 +56,12 @@ at import time.
|
|
|
61
56
|
python -m pip install InterpolatePy
|
|
62
57
|
```
|
|
63
58
|
|
|
64
|
-
InterpolatePy 3.
|
|
65
|
-
SciPy 1.11 or newer
|
|
59
|
+
InterpolatePy 3.3.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
|
|
60
|
+
and SciPy 1.11 or newer. Install plotting support when needed:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
python -m pip install "InterpolatePy[plot]"
|
|
64
|
+
```
|
|
66
65
|
|
|
67
66
|
## Quick start
|
|
68
67
|
|
|
@@ -104,7 +103,7 @@ component, or `evaluate_full()` for all four.
|
|
|
104
103
|
| Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
|
|
105
104
|
| B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
|
|
106
105
|
| 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 |
|
|
106
|
+
| Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `SpringQuaternionInterpolation`, `ShootingQuaternionInterpolation`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
|
|
108
107
|
| Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
|
|
109
108
|
|
|
110
109
|
Degrees 3, 4, and 5 of `BSplineInterpolator`,
|
|
@@ -117,7 +116,8 @@ See the [algorithm selection guide](ALGORITHMS.md), the
|
|
|
117
116
|
|
|
118
117
|
## Optional C++ backend
|
|
119
118
|
|
|
120
|
-
The package falls back to Python
|
|
119
|
+
Platform wheels include the compiled backend. The package falls back to Python
|
|
120
|
+
automatically when the extension is absent:
|
|
121
121
|
|
|
122
122
|
```python
|
|
123
123
|
import interpolatepy
|
|
@@ -126,9 +126,9 @@ print(interpolatepy.HAS_CPP)
|
|
|
126
126
|
```
|
|
127
127
|
|
|
128
128
|
Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
|
|
129
|
-
implementation.
|
|
130
|
-
|
|
131
|
-
|
|
129
|
+
implementation. Installing a published wheel does not need a compiler. Building
|
|
130
|
+
from a source distribution or source checkout requires CMake 3.21+, a C++20
|
|
131
|
+
compiler, and network access for CMake's fetched dependencies;
|
|
132
132
|
see the [installation guide](docs/installation.md#optional-c-backend).
|
|
133
133
|
|
|
134
134
|
## Development
|
|
@@ -20,8 +20,12 @@ at import time.
|
|
|
20
20
|
python -m pip install InterpolatePy
|
|
21
21
|
```
|
|
22
22
|
|
|
23
|
-
InterpolatePy 3.
|
|
24
|
-
SciPy 1.11 or newer
|
|
23
|
+
InterpolatePy 3.3.1 requires Python 3.11 or newer, NumPy 1.26 or newer,
|
|
24
|
+
and SciPy 1.11 or newer. Install plotting support when needed:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
python -m pip install "InterpolatePy[plot]"
|
|
28
|
+
```
|
|
25
29
|
|
|
26
30
|
## Quick start
|
|
27
31
|
|
|
@@ -63,7 +67,7 @@ component, or `evaluate_full()` for all four.
|
|
|
63
67
|
| Scalar splines | `CubicSpline`, `CubicSmoothingSpline`, `CubicSplineWithAcceleration1`, `CubicSplineWithAcceleration2` | Smooth scalar waypoint trajectories and noisy data |
|
|
64
68
|
| B-splines | `BSpline`, `BSplineInterpolator`, `CubicBSplineInterpolation`, `ApproximationBSpline`, `SmoothingCubicBSpline` | Parametric curves, interpolation, approximation, and smoothing |
|
|
65
69
|
| Motion profiles | `DoubleSTrajectory`, `TrapezoidalTrajectory`, `PolynomialTrajectory`, `ParabolicBlendTrajectory` | Bounded or boundary-conditioned scalar motion |
|
|
66
|
-
| Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
|
|
70
|
+
| Rotations | `Quaternion`, `QuaternionSpline`, `SquadC2`, `SpringQuaternionInterpolation`, `ShootingQuaternionInterpolation`, `LogQuaternionInterpolation`, `ModifiedLogQuaternionInterpolation` | Orientation interpolation without Euler-angle singularities |
|
|
67
71
|
| Paths and utilities | `LinearPath`, `CircularPath`, Frenet-frame helpers, `linear_traj`, `solve_tridiagonal` | Geometric paths, moving frames, and numerical helpers |
|
|
68
72
|
|
|
69
73
|
Degrees 3, 4, and 5 of `BSplineInterpolator`,
|
|
@@ -76,7 +80,8 @@ See the [algorithm selection guide](ALGORITHMS.md), the
|
|
|
76
80
|
|
|
77
81
|
## Optional C++ backend
|
|
78
82
|
|
|
79
|
-
The package falls back to Python
|
|
83
|
+
Platform wheels include the compiled backend. The package falls back to Python
|
|
84
|
+
automatically when the extension is absent:
|
|
80
85
|
|
|
81
86
|
```python
|
|
82
87
|
import interpolatepy
|
|
@@ -85,9 +90,9 @@ print(interpolatepy.HAS_CPP)
|
|
|
85
90
|
```
|
|
86
91
|
|
|
87
92
|
Set `INTERPOLATEPY_NO_CPP=1` before importing the package to force the Python
|
|
88
|
-
implementation.
|
|
89
|
-
|
|
90
|
-
|
|
93
|
+
implementation. Installing a published wheel does not need a compiler. Building
|
|
94
|
+
from a source distribution or source checkout requires CMake 3.21+, a C++20
|
|
95
|
+
compiler, and network access for CMake's fetched dependencies;
|
|
91
96
|
see the [installation guide](docs/installation.md#optional-c-backend).
|
|
92
97
|
|
|
93
98
|
## Development
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
cmake_minimum_required(VERSION 3.21)
|
|
2
|
+
|
|
3
|
+
if(DEFINED SKBUILD_PROJECT_VERSION)
|
|
4
|
+
set(INTERPOLATECPP_VERSION "${SKBUILD_PROJECT_VERSION}")
|
|
5
|
+
else()
|
|
6
|
+
set(INTERPOLATECPP_VERSION "3.3.1")
|
|
7
|
+
endif()
|
|
8
|
+
|
|
2
9
|
project(InterpolateCpp
|
|
3
|
-
VERSION
|
|
10
|
+
VERSION "${INTERPOLATECPP_VERSION}"
|
|
4
11
|
LANGUAGES CXX
|
|
5
12
|
DESCRIPTION "C++ port of InterpolatePy trajectory planning library"
|
|
6
13
|
)
|
|
@@ -9,6 +16,9 @@ set(CMAKE_CXX_STANDARD 20)
|
|
|
9
16
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
|
10
17
|
set(CMAKE_CXX_EXTENSIONS OFF)
|
|
11
18
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
19
|
+
set(PYBIND11_FINDPYTHON ON)
|
|
20
|
+
|
|
21
|
+
include(GNUInstallDirs)
|
|
12
22
|
|
|
13
23
|
# Options
|
|
14
24
|
option(INTERPOLATECPP_BUILD_TESTS "Build tests" ON)
|
|
@@ -24,13 +34,17 @@ configure_file(
|
|
|
24
34
|
# Dependencies via FetchContent
|
|
25
35
|
include(FetchContent)
|
|
26
36
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
find_package(Eigen3 3.4 CONFIG QUIET)
|
|
38
|
+
|
|
39
|
+
if(NOT Eigen3_FOUND)
|
|
40
|
+
FetchContent_Declare(
|
|
41
|
+
Eigen
|
|
42
|
+
GIT_REPOSITORY https://gitlab.com/libeigen/eigen.git
|
|
43
|
+
GIT_TAG 3.4.0
|
|
44
|
+
GIT_SHALLOW TRUE
|
|
45
|
+
SYSTEM
|
|
46
|
+
)
|
|
47
|
+
endif()
|
|
34
48
|
|
|
35
49
|
if(INTERPOLATECPP_BUILD_TESTS)
|
|
36
50
|
FetchContent_Declare(
|
|
@@ -41,7 +55,7 @@ if(INTERPOLATECPP_BUILD_TESTS)
|
|
|
41
55
|
)
|
|
42
56
|
endif()
|
|
43
57
|
|
|
44
|
-
if(INTERPOLATECPP_BUILD_BINDINGS)
|
|
58
|
+
if(INTERPOLATECPP_BUILD_BINDINGS AND NOT SKBUILD)
|
|
45
59
|
FetchContent_Declare(
|
|
46
60
|
pybind11
|
|
47
61
|
GIT_REPOSITORY https://github.com/pybind/pybind11.git
|
|
@@ -50,12 +64,14 @@ if(INTERPOLATECPP_BUILD_BINDINGS)
|
|
|
50
64
|
)
|
|
51
65
|
endif()
|
|
52
66
|
|
|
53
|
-
# Make Eigen available
|
|
54
|
-
|
|
55
|
-
set(
|
|
56
|
-
set(
|
|
57
|
-
|
|
58
|
-
|
|
67
|
+
# Make the fallback Eigen dependency available without building its tests or docs.
|
|
68
|
+
if(NOT Eigen3_FOUND)
|
|
69
|
+
set(BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
70
|
+
set(EIGEN_BUILD_TESTING OFF CACHE BOOL "" FORCE)
|
|
71
|
+
set(EIGEN_BUILD_DOC OFF CACHE BOOL "" FORCE)
|
|
72
|
+
FetchContent_MakeAvailable(Eigen)
|
|
73
|
+
set(BUILD_TESTING ON CACHE BOOL "" FORCE)
|
|
74
|
+
endif()
|
|
59
75
|
|
|
60
76
|
# Library sources
|
|
61
77
|
set(INTERPOLATECPP_SOURCES
|
|
@@ -79,6 +95,11 @@ set(INTERPOLATECPP_SOURCES
|
|
|
79
95
|
src/quaternion.cpp
|
|
80
96
|
src/quaternion_spline.cpp
|
|
81
97
|
src/squad_c2.cpp
|
|
98
|
+
src/spring_quaternion_interpolation.cpp
|
|
99
|
+
src/spring_solver.cpp
|
|
100
|
+
src/spring_gauss_newton.cpp
|
|
101
|
+
src/shooting_quaternion_interpolation.cpp
|
|
102
|
+
src/shooting_solver.cpp
|
|
82
103
|
src/log_quaternion_interpolation.cpp
|
|
83
104
|
src/modified_log_quaternion_interpolation.cpp
|
|
84
105
|
# Phase 5: Path
|
|
@@ -106,6 +127,13 @@ set_target_properties(interpolatecpp PROPERTIES
|
|
|
106
127
|
VISIBILITY_INLINES_HIDDEN ON
|
|
107
128
|
)
|
|
108
129
|
|
|
130
|
+
# INTERPOLATECPP_API must export while building the library and stay empty for a
|
|
131
|
+
# static one; without this MSVC marks every symbol dllimport and the link fails.
|
|
132
|
+
target_compile_definitions(interpolatecpp
|
|
133
|
+
PRIVATE INTERPOLATECPP_EXPORTS
|
|
134
|
+
PUBLIC $<$<NOT:$<BOOL:${BUILD_SHARED_LIBS}>>:INTERPOLATECPP_STATIC_DEFINE>
|
|
135
|
+
)
|
|
136
|
+
|
|
109
137
|
target_compile_options(interpolatecpp PRIVATE
|
|
110
138
|
$<$<CXX_COMPILER_ID:GNU,Clang,AppleClang>:
|
|
111
139
|
-Wall -Wextra -Wpedantic -Wconversion -Wshadow
|
|
@@ -124,7 +152,10 @@ endif()
|
|
|
124
152
|
|
|
125
153
|
# Bindings
|
|
126
154
|
if(INTERPOLATECPP_BUILD_BINDINGS)
|
|
127
|
-
|
|
155
|
+
find_package(pybind11 CONFIG QUIET)
|
|
156
|
+
if(NOT pybind11_FOUND)
|
|
157
|
+
FetchContent_MakeAvailable(pybind11)
|
|
158
|
+
endif()
|
|
128
159
|
add_subdirectory(bindings)
|
|
129
160
|
endif()
|
|
130
161
|
|
|
@@ -134,8 +165,6 @@ if(INTERPOLATECPP_BUILD_EXAMPLES)
|
|
|
134
165
|
endif()
|
|
135
166
|
|
|
136
167
|
# Install rules
|
|
137
|
-
include(GNUInstallDirs)
|
|
138
|
-
|
|
139
168
|
install(TARGETS interpolatecpp
|
|
140
169
|
EXPORT InterpolateCppTargets
|
|
141
170
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
#include <interpolatecpp/quat/modified_log_quaternion_interpolation.hpp>
|
|
7
7
|
#include <interpolatecpp/quat/quaternion.hpp>
|
|
8
8
|
#include <interpolatecpp/quat/quaternion_spline.hpp>
|
|
9
|
+
#include <interpolatecpp/quat/spring_quaternion_interpolation.hpp>
|
|
10
|
+
#include <interpolatecpp/quat/shooting_quaternion_interpolation.hpp>
|
|
9
11
|
#include <interpolatecpp/quat/squad_c2.hpp>
|
|
10
12
|
|
|
11
13
|
namespace py = pybind11;
|
|
@@ -106,6 +108,82 @@ void bind_quaternion(py::module_& m) {
|
|
|
106
108
|
.def_property_readonly("t_max", &SquadC2::t_max)
|
|
107
109
|
.def_property_readonly("validate_continuity", &SquadC2::validate_continuity);
|
|
108
110
|
|
|
111
|
+
// SpringConfig
|
|
112
|
+
py::class_<SpringConfig>(quat_mod, "SpringConfig")
|
|
113
|
+
.def(py::init<>())
|
|
114
|
+
.def_readwrite("num_samples", &SpringConfig::num_samples)
|
|
115
|
+
.def_readwrite("iterations", &SpringConfig::iterations)
|
|
116
|
+
.def_readwrite("refinement_levels", &SpringConfig::refinement_levels)
|
|
117
|
+
.def_readwrite("step_size", &SpringConfig::step_size)
|
|
118
|
+
.def_readwrite("norm_penalty", &SpringConfig::norm_penalty)
|
|
119
|
+
.def_readwrite("keyframe_curvature_weight",
|
|
120
|
+
&SpringConfig::keyframe_curvature_weight)
|
|
121
|
+
.def_readwrite("tolerance", &SpringConfig::tolerance)
|
|
122
|
+
.def_readwrite("solver", &SpringConfig::solver)
|
|
123
|
+
.def_readwrite("final_iterations", &SpringConfig::final_iterations);
|
|
124
|
+
|
|
125
|
+
// SpringQuaternionInterpolation
|
|
126
|
+
py::class_<SpringQuaternionInterpolation>(quat_mod,
|
|
127
|
+
"SpringQuaternionInterpolation")
|
|
128
|
+
.def(py::init<const std::vector<double>&,
|
|
129
|
+
const std::vector<Quaternion>&, SpringConfig>(),
|
|
130
|
+
py::arg("time_points"), py::arg("quaternions"),
|
|
131
|
+
py::arg("config") = SpringConfig{},
|
|
132
|
+
py::call_guard<py::gil_scoped_release>())
|
|
133
|
+
.def("evaluate", &SpringQuaternionInterpolation::evaluate, py::arg("t"))
|
|
134
|
+
.def("evaluate_velocity",
|
|
135
|
+
&SpringQuaternionInterpolation::evaluate_velocity, py::arg("t"))
|
|
136
|
+
.def("evaluate_acceleration",
|
|
137
|
+
&SpringQuaternionInterpolation::evaluate_acceleration, py::arg("t"))
|
|
138
|
+
.def("generate_trajectory",
|
|
139
|
+
&SpringQuaternionInterpolation::generate_trajectory,
|
|
140
|
+
py::arg("num_points") = 100)
|
|
141
|
+
.def("get_time_points", &SpringQuaternionInterpolation::time_points)
|
|
142
|
+
.def("get_quaternions", &SpringQuaternionInterpolation::quaternions)
|
|
143
|
+
.def("get_sample_times", &SpringQuaternionInterpolation::sample_times)
|
|
144
|
+
.def("get_samples", &SpringQuaternionInterpolation::samples)
|
|
145
|
+
.def("get_keyframe_indices",
|
|
146
|
+
&SpringQuaternionInterpolation::keyframe_indices)
|
|
147
|
+
.def("get_refinement_sample_counts",
|
|
148
|
+
&SpringQuaternionInterpolation::refinement_sample_counts)
|
|
149
|
+
.def("get_stage_energy_history",
|
|
150
|
+
&SpringQuaternionInterpolation::stage_energy_history)
|
|
151
|
+
.def("get_stage_gradient_norms", &SpringQuaternionInterpolation::stage_gradient_norms)
|
|
152
|
+
.def_property_readonly("converged", &SpringQuaternionInterpolation::converged)
|
|
153
|
+
.def_property_readonly("initial_energy",
|
|
154
|
+
&SpringQuaternionInterpolation::initial_energy)
|
|
155
|
+
.def_property_readonly("final_energy",
|
|
156
|
+
&SpringQuaternionInterpolation::final_energy)
|
|
157
|
+
.def_property_readonly("iterations_run",
|
|
158
|
+
&SpringQuaternionInterpolation::iterations_run)
|
|
159
|
+
.def_property_readonly("t_min", &SpringQuaternionInterpolation::t_min)
|
|
160
|
+
.def_property_readonly("t_max", &SpringQuaternionInterpolation::t_max);
|
|
161
|
+
|
|
162
|
+
py::class_<ShootingConfig>(quat_mod, "ShootingConfig")
|
|
163
|
+
.def(py::init<>())
|
|
164
|
+
.def_readwrite("tolerance", &ShootingConfig::tolerance)
|
|
165
|
+
.def_readwrite("max_iterations", &ShootingConfig::max_iterations)
|
|
166
|
+
.def_readwrite("integration_steps", &ShootingConfig::integration_steps)
|
|
167
|
+
.def_readwrite("max_integration_steps", &ShootingConfig::max_integration_steps);
|
|
168
|
+
|
|
169
|
+
py::class_<ShootingQuaternionInterpolation>(quat_mod, "ShootingQuaternionInterpolation")
|
|
170
|
+
.def(py::init<const std::vector<double>&, const std::vector<Quaternion>&, ShootingConfig>(),
|
|
171
|
+
py::arg("time_points"), py::arg("quaternions"), py::arg("config") = ShootingConfig{},
|
|
172
|
+
py::call_guard<py::gil_scoped_release>())
|
|
173
|
+
.def("evaluate", &ShootingQuaternionInterpolation::evaluate, py::arg("t"))
|
|
174
|
+
.def("evaluate_velocity", &ShootingQuaternionInterpolation::evaluate_velocity, py::arg("t"))
|
|
175
|
+
.def("evaluate_acceleration", &ShootingQuaternionInterpolation::evaluate_acceleration, py::arg("t"))
|
|
176
|
+
.def("generate_trajectory", &ShootingQuaternionInterpolation::generate_trajectory, py::arg("num_points") = 100)
|
|
177
|
+
.def("get_time_points", &ShootingQuaternionInterpolation::time_points)
|
|
178
|
+
.def("get_quaternions", &ShootingQuaternionInterpolation::quaternions)
|
|
179
|
+
.def_property_readonly("iterations_run", &ShootingQuaternionInterpolation::iterations_run)
|
|
180
|
+
.def_property_readonly("integration_steps", &ShootingQuaternionInterpolation::integration_steps)
|
|
181
|
+
.def_property_readonly("num_variables", &ShootingQuaternionInterpolation::num_variables)
|
|
182
|
+
.def_property_readonly("residual_norm", &ShootingQuaternionInterpolation::residual_norm)
|
|
183
|
+
.def_property_readonly("acceleration_energy", &ShootingQuaternionInterpolation::acceleration_energy)
|
|
184
|
+
.def_property_readonly("t_min", &ShootingQuaternionInterpolation::t_min)
|
|
185
|
+
.def_property_readonly("t_max", &ShootingQuaternionInterpolation::t_max);
|
|
186
|
+
|
|
109
187
|
// LogQuaternionInterpolation
|
|
110
188
|
py::class_<LogQuaternionInterpolation>(quat_mod, "LogQuaternionInterpolation")
|
|
111
189
|
.def(py::init<const std::vector<double>&, const std::vector<Quaternion>&, int,
|