From 00ba708e45923d42f732be94b68cc53c975e9f00 Mon Sep 17 00:00:00 2001 From: Steve Tonneau <stonneau@laas.fr> Date: Wed, 8 Mar 2017 16:39:23 +0100 Subject: [PATCH] binded non eigen methods --- CMakeLists.txt | 15 ++++--- .../centroidal_dynamics.hh | 10 ++--- include/centroidal-dynamics-lib/logger.hh | 2 +- python/CMakeLists.txt | 12 ++++++ python/centroidal_dynamics_python.cpp | 42 +++++++++++++++++++ src/centroidal_dynamics.cpp | 30 ++++++------- test/test_static_equilibrium.cpp | 30 ++++++------- 7 files changed, 99 insertions(+), 42 deletions(-) create mode 100644 python/CMakeLists.txt create mode 100644 python/centroidal_dynamics_python.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 1486c3b..4a8c183 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -31,15 +31,15 @@ SETUP_PROJECT() string (REPLACE "-Werror" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) MESSAGE( STATUS "CMAKE_CXX_FLAGS: " ${CMAKE_CXX_FLAGS} ) +OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" ON) IF(BUILD_PYTHON_INTERFACE) - OPTION (BUILD_PYTHON_INTERFACE "Build the python binding" OFF) -ENDIF(BUILD_PYTHON_INTERFACE) + find_package( PythonLibs 2.7 REQUIRED ) + include_directories( ${PYTHON_INCLUDE_DIRS} ) -find_package( PythonLibs 2.7 REQUIRED ) -include_directories( ${PYTHON_INCLUDE_DIRS} ) + find_package( Boost COMPONENTS python REQUIRED ) + include_directories( ${Boost_INCLUDE_DIR} ) +ENDIF(BUILD_PYTHON_INTERFACE) -find_package( Boost COMPONENTS python REQUIRED ) -include_directories( ${Boost_INCLUDE_DIR} ) # Declare Headers SET(${PROJECT_NAME}_HEADERS @@ -76,6 +76,9 @@ ADD_REQUIRED_DEPENDENCY("qpOASES") add_subdirectory (src) add_subdirectory (test) +IF(BUILD_PYTHON_INTERFACE) + add_subdirectory (python) +ENDIF(BUILD_PYTHON_INTERFACE) SETUP_PROJECT_FINALIZE() SETUP_PROJECT_CPACK() diff --git a/include/centroidal-dynamics-lib/centroidal_dynamics.hh b/include/centroidal-dynamics-lib/centroidal_dynamics.hh index 5ecf4aa..1de25df 100644 --- a/include/centroidal-dynamics-lib/centroidal_dynamics.hh +++ b/include/centroidal-dynamics-lib/centroidal_dynamics.hh @@ -24,7 +24,7 @@ enum CENTROIDAL_DYNAMICS_DLLAPI EquilibriumAlgorithm EQUILIBRIUM_ALGORITHM_DIP /// incremental projection algorithm based on dual LP formulation }; -class CENTROIDAL_DYNAMICS_DLLAPI StaticEquilibrium +class CENTROIDAL_DYNAMICS_DLLAPI Equilibrium { private: static bool m_is_cdd_initialized; /// true if cdd lib has been initialized, false otherwise @@ -83,7 +83,7 @@ private: public: /** - * @brief StaticEquilibrium constructor. + * @brief Equilibrium constructor. * @param name Name of the object. * @param mass Mass of the system for which to test equilibrium. * @param generatorsPerContact Number of generators used to approximate the friction cone per contact point. @@ -93,8 +93,8 @@ public: * @param canonicalize_cdd_matrix whether to remove redundant inequalities when computing double description matrices * a small pertubation of the system */ - StaticEquilibrium(std::string name, double mass, unsigned int generatorsPerContact, - SolverLP solver_type, bool useWarmStart=true, const unsigned int max_num_cdd_trials=0, + Equilibrium(std::string name, double mass, unsigned int generatorsPerContact, + SolverLP solver_type = SOLVER_LP_QPOASES, bool useWarmStart=true, const unsigned int max_num_cdd_trials=0, const bool canonicalize_cdd_matrix=false); /** @@ -107,7 +107,7 @@ public: * @brief Specifies whether the LP solver is allowed to use warm start. * @param uws True if the LP solver is allowed to use warm start, false otherwise. */ - void useWarmStart(bool uws){ m_solver->setUseWarmStart(uws); } + void setUseWarmStart(bool uws){ m_solver->setUseWarmStart(uws); } /** * @brief Get the name of this object. diff --git a/include/centroidal-dynamics-lib/logger.hh b/include/centroidal-dynamics-lib/logger.hh index 7fe616d..314be7d 100644 --- a/include/centroidal-dynamics-lib/logger.hh +++ b/include/centroidal-dynamics-lib/logger.hh @@ -10,7 +10,7 @@ /* --- INCLUDE --------------------------------------------------------- */ /* --------------------------------------------------------------------- */ -#include <robust-equilibrium-lib/config.hh> +#include <centroidal-dynamics-lib/config.hh> #include <sstream> #include <Eigen/Dense> #include <map> diff --git a/python/CMakeLists.txt b/python/CMakeLists.txt new file mode 100644 index 0000000..34d4390 --- /dev/null +++ b/python/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required( VERSION 2.8 ) + +include_directories("${INCLUDE_DIR}") +include_directories("${EIGEN3_INCLUDE_DIR}") + +# Define the wrapper library that wraps our library +add_library( centroidal_dynamics SHARED centroidal_dynamics_python.cpp ) +target_link_libraries( centroidal_dynamics ${Boost_LIBRARIES} ${PROJECT_NAME} ) +# don't prepend wrapper library name with lib +set_target_properties( centroidal_dynamics PROPERTIES PREFIX "" ) + +#INSTALL(TARGETS centroidal_dynamics DESTINATION lib) diff --git a/python/centroidal_dynamics_python.cpp b/python/centroidal_dynamics_python.cpp new file mode 100644 index 0000000..8c4e3a2 --- /dev/null +++ b/python/centroidal_dynamics_python.cpp @@ -0,0 +1,42 @@ +#include "centroidal-dynamics-lib/centroidal_dynamics.hh" + +#include <boost/python.hpp> + +namespace centroidal_dynamics +{ +using namespace boost::python; + +BOOST_PYTHON_MODULE(centroidal_dynamics) +{ + /** BEGIN enum types **/ + #ifdef CLP_FOUND + enum_<SolverLP>("SolverLP") + .value("SOLVER_LP_QPOASES", SOLVER_LP_QPOASES) + .value("SOLVER_LP_CLP", SOLVER_LP_CLP) + .export_values(); + #else + enum_<SolverLP>("SolverLP") + .value("SOLVER_LP_QPOASES", SOLVER_LP_QPOASES) + .export_values(); + #endif + + + enum_<EquilibriumAlgorithm>("EquilibriumAlgorithm") + .value("EQUILIBRIUM_ALGORITHM_LP", EQUILIBRIUM_ALGORITHM_LP) + .value("EQUILIBRIUM_ALGORITHM_LP2", EQUILIBRIUM_ALGORITHM_LP2) + .value("EQUILIBRIUM_ALGORITHM_DLP", EQUILIBRIUM_ALGORITHM_DLP) + .value("EQUILIBRIUM_ALGORITHM_PP", EQUILIBRIUM_ALGORITHM_PP) + .value("EQUILIBRIUM_ALGORITHM_IP", EQUILIBRIUM_ALGORITHM_IP) + .value("EQUILIBRIUM_ALGORITHM_DIP", EQUILIBRIUM_ALGORITHM_DIP) + .export_values(); + + /** END enum types **/ + class_<Equilibrium>("Equilibrium", init<std::string, double, unsigned int, optional <SolverLP, bool, const unsigned int, const bool> >()) + .def("useWarmStart", &Equilibrium::useWarmStart) + .def("setUseWarmStart", &Equilibrium::setUseWarmStart) + .def("getName", &Equilibrium::getName) + .def("getAlgorithm", &Equilibrium::getAlgorithm) + ; +} + +} // namespace centroidal_dynamics diff --git a/src/centroidal_dynamics.cpp b/src/centroidal_dynamics.cpp index 329b194..38fc825 100644 --- a/src/centroidal_dynamics.cpp +++ b/src/centroidal_dynamics.cpp @@ -15,9 +15,9 @@ using namespace std; namespace centroidal_dynamics { -bool StaticEquilibrium::m_is_cdd_initialized = false; +bool Equilibrium::m_is_cdd_initialized = false; -StaticEquilibrium::StaticEquilibrium(string name, double mass, unsigned int generatorsPerContact, +Equilibrium::Equilibrium(string name, double mass, unsigned int generatorsPerContact, SolverLP solver_type, bool useWarmStart, const unsigned int max_num_cdd_trials, const bool canonicalize_cdd_matrix) : m_is_cdd_stable(true) @@ -53,7 +53,7 @@ StaticEquilibrium::StaticEquilibrium(string name, double mass, unsigned int gene m_D.block<3,3>(3,0) = crossMatrix(-m_mass*m_gravity); } -bool StaticEquilibrium::computeGenerators(Cref_matrixX3 contactPoints, Cref_matrixX3 contactNormals, +bool Equilibrium::computeGenerators(Cref_matrixX3 contactPoints, Cref_matrixX3 contactNormals, double frictionCoefficient, const bool perturbate) { long int c = contactPoints.rows(); @@ -129,7 +129,7 @@ bool StaticEquilibrium::computeGenerators(Cref_matrixX3 contactPoints, Cref_matr return true; } -bool StaticEquilibrium::setNewContacts(Cref_matrixX3 contactPoints, Cref_matrixX3 contactNormals, +bool Equilibrium::setNewContacts(Cref_matrixX3 contactPoints, Cref_matrixX3 contactNormals, double frictionCoefficient, EquilibriumAlgorithm alg) { assert(contactPoints.rows()==contactNormals.rows()); @@ -175,7 +175,7 @@ bool StaticEquilibrium::setNewContacts(Cref_matrixX3 contactPoints, Cref_matrixX } -LP_status StaticEquilibrium::computeEquilibriumRobustness(Cref_vector3 com, double &robustness) +LP_status Equilibrium::computeEquilibriumRobustness(Cref_vector3 com, double &robustness) { const long m = m_G_centr.cols(); // number of gravito-inertial wrench generators if(m==0) @@ -303,7 +303,7 @@ LP_status StaticEquilibrium::computeEquilibriumRobustness(Cref_vector3 com, doub return LP_STATUS_ERROR; } -LP_status StaticEquilibrium::computeEquilibriumRobustness(Cref_vector3 com, Cref_vector3 acc, double &robustness){ +LP_status Equilibrium::computeEquilibriumRobustness(Cref_vector3 com, Cref_vector3 acc, double &robustness){ // Take the acceleration in account in D and d : Matrix63 old_D = m_D; Vector6 old_d = m_d; @@ -324,7 +324,7 @@ LP_status StaticEquilibrium::computeEquilibriumRobustness(Cref_vector3 com, Cref m_D.block<3,3>(3,0) = crossMatrix(-m_mass*m_gravity); */ -LP_status StaticEquilibrium::checkRobustEquilibrium(Cref_vector3 com, bool &equilibrium, double e_max) +LP_status Equilibrium::checkRobustEquilibrium(Cref_vector3 com, bool &equilibrium, double e_max) { if(m_G_centr.cols()==0) { @@ -355,7 +355,7 @@ LP_status StaticEquilibrium::checkRobustEquilibrium(Cref_vector3 com, bool &equi } -LP_status StaticEquilibrium::getPolytopeInequalities(MatrixXX& H, VectorX& h) const +LP_status Equilibrium::getPolytopeInequalities(MatrixXX& H, VectorX& h) const { if(m_algorithm!=EQUILIBRIUM_ALGORITHM_PP) { @@ -376,7 +376,7 @@ LP_status StaticEquilibrium::getPolytopeInequalities(MatrixXX& H, VectorX& h) co return LP_STATUS_OPTIMAL; } -LP_status StaticEquilibrium::findExtremumOverLine(Cref_vector3 a, Cref_vector3 a0, double e_max, Ref_vector3 com) +LP_status Equilibrium::findExtremumOverLine(Cref_vector3 a, Cref_vector3 a0, double e_max, Ref_vector3 com) { const long m = m_G_centr.cols(); // number of gravito-inertial wrench generators if(m_G_centr.cols()==0) @@ -506,7 +506,7 @@ LP_status StaticEquilibrium::findExtremumOverLine(Cref_vector3 a, Cref_vector3 a return LP_STATUS_ERROR; } -LP_status StaticEquilibrium::findExtremumInDirection(Cref_vector3 direction, Ref_vector3 com, double e_max) +LP_status Equilibrium::findExtremumInDirection(Cref_vector3 direction, Ref_vector3 com, double e_max) { if(m_G_centr.cols()==0) return LP_STATUS_INFEASIBLE; @@ -514,7 +514,7 @@ LP_status StaticEquilibrium::findExtremumInDirection(Cref_vector3 direction, Ref return LP_STATUS_ERROR; } -bool StaticEquilibrium::computePolytopeProjection(Cref_matrix6X v) +bool Equilibrium::computePolytopeProjection(Cref_matrix6X v) { // getProfiler().start("eigen_to_cdd"); dd_MatrixPtr V = cone_span_eigen_to_cdd(v.transpose(),canonicalize_cdd_matrix); @@ -573,18 +573,18 @@ bool StaticEquilibrium::computePolytopeProjection(Cref_matrix6X v) return true; } -double StaticEquilibrium::convert_b0_to_emax(double b0) +double Equilibrium::convert_b0_to_emax(double b0) { return (b0*m_b0_to_emax_coefficient); } -double StaticEquilibrium::convert_emax_to_b0(double emax) +double Equilibrium::convert_emax_to_b0(double emax) { return (emax/m_b0_to_emax_coefficient); } -LP_status StaticEquilibrium::findMaximumAcceleration(Cref_matrixXX A, Cref_vector6 h, double& alpha0){ +LP_status Equilibrium::findMaximumAcceleration(Cref_matrixXX A, Cref_vector6 h, double& alpha0){ int m = (int)A.cols() -1 ; // 4* number of contacts VectorX b_a0(m+1); VectorX c = VectorX::Zero(m+1); @@ -612,7 +612,7 @@ LP_status StaticEquilibrium::findMaximumAcceleration(Cref_matrixXX A, Cref_vecto } -bool StaticEquilibrium::checkAdmissibleAcceleration(Cref_matrixXX G, Cref_matrixXX H, Cref_vector6 h, Cref_vector3 a ){ +bool Equilibrium::checkAdmissibleAcceleration(Cref_matrixXX G, Cref_matrixXX H, Cref_vector6 h, Cref_vector3 a ){ int m = (int)G.cols(); // number of contact * 4 VectorX b(m); VectorX c = VectorX::Zero(m); diff --git a/test/test_static_equilibrium.cpp b/test/test_static_equilibrium.cpp index f05dd7b..a12b032 100644 --- a/test/test_static_equilibrium.cpp +++ b/test/test_static_equilibrium.cpp @@ -24,8 +24,8 @@ using namespace std; #define EPS 1e-3 // required precision -/** Check the coherence between the method StaticEquilibrium::computeEquilibriumRobustness - * and the method StaticEquilibrium::checkRobustEquilibrium. +/** Check the coherence between the method Equilibrium::computeEquilibriumRobustness + * and the method Equilibrium::checkRobustEquilibrium. * @param solver_1 Solver used to test computeEquilibriumRobustness. * @param solver_2 Solver used to test checkRobustEquilibrium. * @param comPositions List of 2d com positions on which to perform the tests. @@ -33,8 +33,8 @@ using namespace std; * @param PERF_STRING_2 String to use for logging the computation times of solver_2 * @param verb Verbosity level, 0 print nothing, 1 print summary, 2 print everything */ -int test_computeEquilibriumRobustness_vs_checkEquilibrium(StaticEquilibrium *solver_1, - StaticEquilibrium *solver_2, +int test_computeEquilibriumRobustness_vs_checkEquilibrium(Equilibrium *solver_1, + Equilibrium *solver_2, Cref_matrixXX comPositions, const string& PERF_STRING_1="", const string& PERF_STRING_2="", @@ -93,7 +93,7 @@ int test_computeEquilibriumRobustness_vs_checkEquilibrium(StaticEquilibrium *sol return error_counter; } -/** Test two different solvers on the method StaticEquilibrium::computeEquilibriumRobustness. +/** Test two different solvers on the method Equilibrium::computeEquilibriumRobustness. * @param solver_1 First solver to test. * @param solver_2 Second solver to test. * @param comPositions List of 2d com positions on which to perform the tests. @@ -101,7 +101,7 @@ int test_computeEquilibriumRobustness_vs_checkEquilibrium(StaticEquilibrium *sol * @param PERF_STRING_2 String to use for logging the computation times of solver_2 * @param verb Verbosity level, 0 print nothing, 1 print summary, 2 print everything */ -int test_computeEquilibriumRobustness(StaticEquilibrium *solver_1, StaticEquilibrium *solver_2, Cref_matrixXX comPositions, +int test_computeEquilibriumRobustness(Equilibrium *solver_1, Equilibrium *solver_2, Cref_matrixXX comPositions, const string& PERF_STRING_1, const string& PERF_STRING_2, int verb=0) { int error_counter = 0; @@ -146,7 +146,7 @@ int test_computeEquilibriumRobustness(StaticEquilibrium *solver_1, StaticEquilib return error_counter; } -/** Test method StaticEquilibrium::findExtremumOverLine. The test works in this way: first it +/** Test method Equilibrium::findExtremumOverLine. The test works in this way: first it * calls the method findExtremumOverLine of the solver to test to find the extremum over a random * line with a specified robustness. Then it checks that the point found really has the specified * robustness by using the ground-truth solver. @@ -159,7 +159,7 @@ int test_computeEquilibriumRobustness(StaticEquilibrium *solver_1, StaticEquilib * @param PERF_STRING_GROUND_TRUTH String to use for logging the computation times of solver_ground_truth * @param verb Verbosity level, 0 print nothing, 1 print summary, 2 print everything */ -int test_findExtremumOverLine(StaticEquilibrium *solver_to_test, StaticEquilibrium *solver_ground_truth, +int test_findExtremumOverLine(Equilibrium *solver_to_test, Equilibrium *solver_ground_truth, Cref_vector3 a0, int N_TESTS, double e_max, const string& PERF_STRING_TEST, const string& PERF_STRING_GROUND_TRUTH, int verb=0) { @@ -226,11 +226,11 @@ int test_findExtremumOverLine(StaticEquilibrium *solver_to_test, StaticEquilibri } /** Draw a grid on the screen using the robustness computed with the method - * StaticEquilibrium::computeEquilibriumRobustness. + * Equilibrium::computeEquilibriumRobustness. * @param solver The solver to use for computing the equilibrium robustness. * @param comPositions Grid of CoM positions in the form of an Nx2 matrix. */ -void drawRobustnessGrid(int N_CONTACTS, int GRID_SIZE, StaticEquilibrium *solver, +void drawRobustnessGrid(int N_CONTACTS, int GRID_SIZE, Equilibrium *solver, Cref_matrixXX comPositions, Cref_matrixXX p) { MatrixXi contactPointCoord(4*N_CONTACTS,2); @@ -381,11 +381,11 @@ void testWithLoadedData() return; } - StaticEquilibrium* solvers[N_SOLVERS]; + Equilibrium* solvers[N_SOLVERS]; double robustness[N_SOLVERS]; for(int s=0; s<N_SOLVERS; s++) { - solvers[s] = new StaticEquilibrium(solverNames[s], mass, generatorsPerContact, SOLVER_LP_QPOASES); + solvers[s] = new Equilibrium(solverNames[s], mass, generatorsPerContact, SOLVER_LP_QPOASES); if(!solvers[s]->setNewContacts(contactPoints, contactNormals, mu, algorithms[s])) { SEND_ERROR_MSG("Error while setting new contacts for solver "+solvers[s]->getName()); @@ -461,10 +461,10 @@ int main() cout<<"Number of generators per contact: "<<generatorsPerContact<<endl; cout<<"Gonna test equilibrium on a 2d grid of "<<GRID_SIZE<<"X"<<GRID_SIZE<<" points "<<endl; - StaticEquilibrium* solver_PP = new StaticEquilibrium("PP", mass, generatorsPerContact, SOLVER_LP_QPOASES); - StaticEquilibrium* solvers[N_SOLVERS]; + Equilibrium* solver_PP = new Equilibrium("PP", mass, generatorsPerContact, SOLVER_LP_QPOASES); + Equilibrium* solvers[N_SOLVERS]; for(int s=0; s<N_SOLVERS; s++) - solvers[s] = new StaticEquilibrium(solverNames[s], mass, generatorsPerContact, lp_solver_types[s]); + solvers[s] = new Equilibrium(solverNames[s], mass, generatorsPerContact, lp_solver_types[s]); MatrixXX p, N; RVector2 com_LB, com_UB; -- GitLab