5#ifndef __pinocchio_python_lie_group_hpp__
6#define __pinocchio_python_lie_group_hpp__
8#include <eigenpy/memory.hpp>
10#include "pinocchio/multibody/liegroup/liegroup.hpp"
11#include "pinocchio/multibody/liegroup/cartesian-product-variant.hpp"
12#include "pinocchio/multibody/liegroup/liegroup-generic.hpp"
13#include "pinocchio/multibody/liegroup/liegroup-collection.hpp"
19 namespace bp = boost::python;
21 template<
class LieGroupType>
24 typedef Eigen::Matrix<context::Scalar, Eigen::Dynamic, 1> ConfigVector_t;
25 typedef Eigen::Matrix<context::Scalar, Eigen::Dynamic, 1> TangentVector_t;
26 typedef Eigen::Matrix<context::Scalar, Eigen::Dynamic, Eigen::Dynamic> JacobianMatrix_t;
29 integrate(
const LieGroupType &
lg,
const ConfigVector_t & q,
const TangentVector_t & v)
31 return lg.integrate(q, v);
34 static ConfigVector_t interpolate(
36 const ConfigVector_t & q0,
37 const ConfigVector_t &
q1,
38 const context::Scalar & u)
40 return lg.interpolate(q0,
q1, u);
43 static TangentVector_t
44 difference(
const LieGroupType &
lg,
const ConfigVector_t & q0,
const ConfigVector_t &
q1)
46 return lg.difference(q0,
q1);
49 static JacobianMatrix_t dDifference1(
51 const ConfigVector_t & q0,
52 const ConfigVector_t &
q1,
55 JacobianMatrix_t J(
lg.nv(),
lg.nv());
60 static JacobianMatrix_t dDifference2(
62 const ConfigVector_t & q0,
63 const ConfigVector_t &
q1,
65 const JacobianMatrix_t &
Jin,
68 JacobianMatrix_t J(
Jin.rows(),
Jin.cols());
78 throw std::invalid_argument(
"arg must be either ARG0 or ARG1");
83 static JacobianMatrix_t dDifference3(
85 const ConfigVector_t & q0,
86 const ConfigVector_t &
q1,
89 const JacobianMatrix_t &
Jin)
91 JacobianMatrix_t J(
Jin.rows(),
Jin.cols());
101 throw std::invalid_argument(
"arg must be either ARG0 or ARG1");
106 static JacobianMatrix_t dIntegrate(
108 const ConfigVector_t & q,
109 const TangentVector_t & v,
112 JacobianMatrix_t J(
lg.nv(),
lg.nv());
113 lg.dIntegrate(q, v, J,
arg);
117 static JacobianMatrix_t
118 dIntegrate_dq1(
const LieGroupType &
lg,
const ConfigVector_t & q,
const TangentVector_t & v)
120 JacobianMatrix_t J(
lg.nv(),
lg.nv());
121 lg.dIntegrate_dq(q, v, J);
125 static JacobianMatrix_t dIntegrate_dq2(
127 const ConfigVector_t & q,
128 const TangentVector_t & v,
129 const JacobianMatrix_t &
Jin,
132 JacobianMatrix_t J(
Jin.rows(),
lg.nv());
133 lg.dIntegrate_dq(q, v,
Jin, self, J, SETTO);
137 static JacobianMatrix_t dIntegrate_dq3(
139 const ConfigVector_t & q,
140 const TangentVector_t & v,
142 const JacobianMatrix_t &
Jin)
144 JacobianMatrix_t J(
lg.nv(),
Jin.cols());
145 lg.dIntegrate_dq(q, v, self,
Jin, J, SETTO);
149 static JacobianMatrix_t
150 dIntegrate_dv1(
const LieGroupType &
lg,
const ConfigVector_t & q,
const TangentVector_t & v)
152 JacobianMatrix_t J(
lg.nv(),
lg.nv());
153 lg.dIntegrate_dv(q, v, J);
157 static JacobianMatrix_t dIntegrate_dv2(
159 const ConfigVector_t & q,
160 const TangentVector_t & v,
161 const JacobianMatrix_t &
Jin,
164 JacobianMatrix_t J(
Jin.rows(),
lg.nv());
165 lg.dIntegrate_dv(q, v,
Jin, self, J, SETTO);
169 static JacobianMatrix_t dIntegrate_dv3(
171 const ConfigVector_t & q,
172 const TangentVector_t & v,
174 const JacobianMatrix_t &
Jin)
176 JacobianMatrix_t J(
lg.nv(),
Jin.cols());
177 lg.dIntegrate_dv(q, v, self,
Jin, J, SETTO);
181 static JacobianMatrix_t dIntegrateTransport_proxy(
183 const ConfigVector_t & q,
184 const TangentVector_t & v,
185 const JacobianMatrix_t & J,
188 JacobianMatrix_t
Jout(
lg.nv(), J.cols());
189 lg.dIntegrateTransport(q, v, J,
Jout,
arg);
194 template<
class LieGroupType>
195 struct LieGroupPythonVisitor
196 :
public boost::python::def_visitor<LieGroupPythonVisitor<LieGroupType>>
200 template<
class PyClass>
203 typedef Eigen::Matrix<context::Scalar, Eigen::Dynamic, 1> ConfigVector_t;
206 cl.def(bp::init<>(
"Default constructor"))
207 .def(
"integrate", LieGroupWrapper::integrate)
208 .def(
"dIntegrate", LieGroupWrapper::dIntegrate)
209 .def(
"dIntegrate_dq", LieGroupWrapper::dIntegrate_dq1)
210 .def(
"dIntegrate_dq", LieGroupWrapper::dIntegrate_dq2)
211 .def(
"dIntegrate_dq", LieGroupWrapper::dIntegrate_dq3)
212 .def(
"dIntegrate_dv", LieGroupWrapper::dIntegrate_dv1)
213 .def(
"dIntegrate_dv", LieGroupWrapper::dIntegrate_dv2)
214 .def(
"dIntegrate_dv", LieGroupWrapper::dIntegrate_dv3)
215 .def(
"dIntegrateTransport", LieGroupWrapper::dIntegrateTransport_proxy)
216 .def(
"difference", LieGroupWrapper::difference)
217 .def(
"dDifference", LieGroupWrapper::dDifference1)
218 .def(
"dDifference", LieGroupWrapper::dDifference2)
219 .def(
"dDifference", LieGroupWrapper::dDifference3)
221 .def(
"interpolate", LieGroupWrapper::interpolate)
225 &LieGroupType::random))
227 "randomConfiguration",
235 .add_property(
"name", &LieGroupType::name)
236 .add_property(
"neutral", &LieGroupType::neutral)
237 .add_property(
"nq", &LieGroupType::nq)
238 .add_property(
"nv", &LieGroupType::nv)
240 .def(bp::self * bp::self)
241 .def(bp::self *= bp::self)
242#ifndef PINOCCHIO_PYTHON_SKIP_COMPARISON_OPERATIONS
243 .def(bp::self == bp::self)
248 static void expose(
const char *
name)
Main pinocchio namespace.
ArgumentPosition
Argument position. Used as template parameter to refer to an argument.
std::string name(const LieGroupGenericTpl< LieGroupCollection > &lg)
Visit a LieGroupVariant to get the name of it.