From 13960a1b363d61e64fc7d24f500d9b54ee9b6e0d Mon Sep 17 00:00:00 2001 From: Florent Lamiraux Date: Thu, 22 Oct 2026 12:32:24 +0200 Subject: [PATCH] [manipulation] Remove class ManipulationSpline and bind SplineGradientBased<3,5,7> instead. --- CHANGELOG.md | 1 + src/pyhpp/manipulation/path-optimizer.cc | 113 ++++------------------- 2 files changed, 20 insertions(+), 94 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b06d45..1ef583a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] +- [manipulation] Remove class ManipulationSpline - [path-validation] Create NoValidation without a ProblemSolver ## [9.1.0] - 2026-10-13 diff --git a/src/pyhpp/manipulation/path-optimizer.cc b/src/pyhpp/manipulation/path-optimizer.cc index 111c05e..6bc731a 100644 --- a/src/pyhpp/manipulation/path-optimizer.cc +++ b/src/pyhpp/manipulation/path-optimizer.cc @@ -35,7 +35,6 @@ #include #include #include -#include #include #include #include @@ -91,12 +90,10 @@ hpp::core::PathOptimizerPtr_t createGraphOptimizer( return GraphOptimizer::create(problem); } -typedef pathOptimization::SplineGradientBased - SGB1_t; - -static SGB1_t::Ptr_t createSplineGradientBased1( - const pyhpp::core::Problem& problem) { +template +typename pathOptimization::SplineGradientBased::Ptr_t +createSplineGradientBased(const pyhpp::core::Problem& problem) { hpp::manipulation::ProblemPtr_t manipProblem = HPP_DYNAMIC_PTR_CAST(hpp::manipulation::Problem, problem.obj); if (!manipProblem) { @@ -104,79 +101,21 @@ static SGB1_t::Ptr_t createSplineGradientBased1( "SplineGradientBased_bezier1 constructor expects a " "pyhpp.manipulation.Problem as input"); } - return SGB1_t::create(manipProblem); -} - -typedef pathOptimization::SplineGradientBased - SGB3_t; - -static SGB3_t::Ptr_t createSplineGradientBased3( - const pyhpp::core::Problem& problem) { - hpp::manipulation::ProblemPtr_t manipProblem = - HPP_DYNAMIC_PTR_CAST(hpp::manipulation::Problem, problem.obj); - if (!manipProblem) { - throw std::runtime_error( - "SplineGradientBased_bezier3 constructor expects a " - "pyhpp.manipulation.Problem as input"); - } - return SGB3_t::create(manipProblem); + return pathOptimization::SplineGradientBased::create(manipProblem); } -void exposeSplineGradientBased1(const char* name) { - typedef pathOptimization::SplineGradientBased +template +void exposeSplineGradientBased(const char* name) { + typedef hpp::manipulation::pathOptimization::SplineGradientBased< + hpp::core::path::BernsteinBasis, Order> SGB_t; - class_, bases, - boost::noncopyable>(name, no_init) - .def("__init__", make_constructor(&createSplineGradientBased1)) - .def_readwrite("alphaInit", &SGB_t::alphaInit) - .def_readwrite("alwaysStopAtFirst", &SGB_t::alwaysStopAtFirst) - .def_readwrite("costOrder", &SGB_t::costOrder) - .def_readwrite("usePathLengthAsWeights", &SGB_t::usePathLengthAsWeights) - .def_readwrite("reorderIntervals", &SGB_t::reorderIntervals) - .def_readwrite("linearizeAtEachStep", &SGB_t::linearizeAtEachStep) - .def_readwrite("checkJointBound", &SGB_t::checkJointBound) - .def_readwrite("returnOptimum", &SGB_t::returnOptimum) - .def_readwrite("costThreshold", &SGB_t::costThreshold) - .def_readwrite("guessThreshold", &SGB_t::guessThreshold) - .def_readwrite("QPAccuracy", &SGB_t::QPAccuracy); -} - -void exposeSplineGradientBased3(const char* name) { - typedef pathOptimization::SplineGradientBased - SGB_t; - class_, bases, - boost::noncopyable>(name, no_init) - .def("__init__", make_constructor(&createSplineGradientBased3)) - .def_readwrite("alphaInit", &SGB_t::alphaInit) - .def_readwrite("alwaysStopAtFirst", &SGB_t::alwaysStopAtFirst) - .def_readwrite("costOrder", &SGB_t::costOrder) - .def_readwrite("usePathLengthAsWeights", &SGB_t::usePathLengthAsWeights) - .def_readwrite("reorderIntervals", &SGB_t::reorderIntervals) - .def_readwrite("linearizeAtEachStep", &SGB_t::linearizeAtEachStep) - .def_readwrite("checkJointBound", &SGB_t::checkJointBound) - .def_readwrite("returnOptimum", &SGB_t::returnOptimum) - .def_readwrite("costThreshold", &SGB_t::costThreshold) - .def_readwrite("guessThreshold", &SGB_t::guessThreshold) - .def_readwrite("QPAccuracy", &SGB_t::QPAccuracy); -} - -static pathOptimization::ManipulationSpline::Ptr_t createManipulationSpline( - const pyhpp::core::Problem& problem) { - return pathOptimization::ManipulationSpline::create(problem.obj); -} - -static list getSingleSplineTransitions( - const pathOptimization::ManipulationSpline& spline) { - return pyhpp::to_python_list(spline.singleSplineTransitions); -} - -static void setSingleSplineTransitions( - pathOptimization::ManipulationSpline& spline, const object& names) { - spline.singleSplineTransitions = - pyhpp::extract_vector(list(names)); + typedef hpp::core::pathOptimization::SplineGradientBased< + hpp::core::path::BernsteinBasis, Order> + Parent_t; + class_, bases, boost::noncopyable>( + name, no_init) + .def("__init__", make_constructor(&createSplineGradientBased)); } void exposePathOptimizers() { @@ -200,23 +139,9 @@ void exposePathOptimizers() { def("GraphPartialShortcut", &createGraphOptimizer); - exposeSplineGradientBased1("SplineGradientBased_bezier1"); - exposeSplineGradientBased3("SplineGradientBased_bezier3"); - - class_, bases, - boost::noncopyable>( - "ManipulationSpline", - "Smooth transitions, then join splines within each manipulation state.\n" - "\n" - "The result contains one path vector per consecutive group of\n" - "transitions with the same containing state.", - no_init) - .def("__init__", make_constructor(&createManipulationSpline)) - .add_property("singleSplineTransitions", &getSingleSplineTransitions, - &setSingleSplineTransitions, - "Transitions fitted with one spline between their " - "endpoints."); + exposeSplineGradientBased<1>("SplineGradientBased_bezier1"); + exposeSplineGradientBased<3>("SplineGradientBased_bezier3"); + exposeSplineGradientBased<5>("SplineGradientBased_bezier5"); } } // namespace manipulation