From 1aee527da040bd6b8ee8cefc980d8d0b945088e3 Mon Sep 17 00:00:00 2001
From: pFernbach <pierre.fernbach@gmail.com>
Date: Tue, 19 Feb 2019 18:14:55 +0100
Subject: [PATCH] [end effector] add python API to get matrices

---
 python/bezier_com_traj.cpp | 38 +++++++++++++++++++++++++++++++++++---
 1 file changed, 35 insertions(+), 3 deletions(-)

diff --git a/python/bezier_com_traj.cpp b/python/bezier_com_traj.cpp
index f73f47b..e17c7f6 100644
--- a/python/bezier_com_traj.cpp
+++ b/python/bezier_com_traj.cpp
@@ -1,6 +1,6 @@
-#include "hpp/bezier-com-traj/solve.hh"
-#include "hpp/bezier-com-traj/solver/solver-abstract.hpp"
-#include "hpp/bezier-com-traj/solve_end_effector.hh"
+#include <hpp/bezier-com-traj/solve.hh>
+#include <hpp/bezier-com-traj/solver/solver-abstract.hpp>
+#include <hpp/bezier-com-traj/solve_end_effector.hh>
 #include <eigenpy/memory.hpp>
 #include <eigenpy/eigenpy.hpp>
 
@@ -16,6 +16,7 @@ EIGENPY_DEFINE_STRUCT_ALLOCATOR_SPECIALIZATION(bezier_com_traj::bezier_t)
 namespace bezier_com_traj
 {
 using namespace boost::python;
+typedef double real;
 
 ResultDataCOMTraj* zeroStepCapturability(centroidal_dynamics::Equilibrium* eq, const Vector3& com ,const Vector3& dCom ,const Vector3& l0, const bool useAngMomentum
                               , const double timeDuration, const double timeStep)
@@ -370,12 +371,38 @@ struct DummyPath{
 };
 
 
+typedef std::pair<Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic>,
+                  Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic> > linear_points_t;
+
+
+struct MatrixVector
+{
+    linear_points_t res;
+    Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic> A() {return res.first;}
+    Eigen::Matrix<real, Eigen::Dynamic, Eigen::Dynamic> b() {return res.second;}
+};
+
+
 ResultDataCOMTraj* computeEndEffector(const ProblemData& pData, const double time){
 
    ResultDataCOMTraj  res =solveEndEffector<DummyPath>(pData,DummyPath(),time, 0);
    return new ResultDataCOMTraj(res);
 }
 
+MatrixVector* computeEndEffectorConstraintsPython(const ProblemData& pData, const double time){
+   std::vector<bezier_t::point_t> pi = computeConstantWaypoints(pData,time);
+   MatrixVector* res = new MatrixVector();
+   res->res =computeEndEffectorConstraints(pData,time, pi);
+   return res;
+}
+
+MatrixVector* computeEndEffectorCostPython(const ProblemData& pData, const double time){
+   std::vector<bezier_t::point_t> pi = computeConstantWaypoints(pData,time);
+   MatrixVector* res = new MatrixVector();
+   res->res = computeEndEffectorCost<DummyPath>(pData,DummyPath(),time, 0,false,pi);
+   return res;
+}
+
 /** END end effector **/
 
 
@@ -481,6 +508,9 @@ BOOST_PYTHON_MODULE(hpp_bezier_com_traj)
             .value("UNKNOWN", UNKNOWN)
             .export_values();
 
+    class_<MatrixVector>("MatrixVector", no_init)
+          .def_readonly("A", &MatrixVector::A)
+          .def_readonly("b", &MatrixVector::b);
 
 
     def("zeroStepCapturability", &zeroStepCapturability, return_value_policy<manage_new_object>());
@@ -488,6 +518,8 @@ BOOST_PYTHON_MODULE(hpp_bezier_com_traj)
     def("computeCOMTraj", &computeCOMTrajPointer, return_value_policy<manage_new_object>());
     def("computeCOMTraj", &computeCOMTrajPointerChooseSolver, return_value_policy<manage_new_object>());
     def("computeEndEffector", &computeEndEffector, return_value_policy<manage_new_object>());
+    def("computeEndEffectorConstraints", &computeEndEffectorConstraintsPython, return_value_policy<manage_new_object>());
+    def("computeEndEffectorCost", &computeEndEffectorCostPython, return_value_policy<manage_new_object>());
 
 }
 
-- 
GitLab