hpp-pinocchio  4.9.1
Wrapping of the kinematic/dynamic chain Pinocchio for HPP.
liegroup-element.hh
Go to the documentation of this file.
1 // Copyright (c) 2017, CNRS
2 // Authors: Florent Lamiraux
3 //
4 // This file is part of hpp-pinocchio.
5 // hpp-pinocchio is free software: you can redistribute it
6 // and/or modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation, either version
8 // 3 of the License, or (at your option) any later version.
9 //
10 // hpp-pinocchio is distributed in the hope that it will be
11 // useful, but WITHOUT ANY WARRANTY; without even the implied warranty
12 // of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 // General Lesser Public License for more details. You should have
14 // received a copy of the GNU Lesser General Public License along with
15 // hpp-pinocchio. If not, see <http://www.gnu.org/licenses/>.
16 
17 #ifndef HPP_PINOCCHIO_LIEGROUP_ELEMENT_HH
18 # define HPP_PINOCCHIO_LIEGROUP_ELEMENT_HH
19 
21 # include <hpp/pinocchio/deprecated.hh>
22 
23 namespace hpp {
24  namespace pinocchio {
27 
31  template <typename vector_type>
32  class LiegroupElementConstBase
33  {
34  public:
38  template <typename Derived>
39  LiegroupElementConstBase (const Eigen::EigenBase<Derived>& value,
40  const LiegroupSpacePtr_t& liegroupSpace) :
41  value_ (value.derived()), space_ (liegroupSpace)
42  {
43  check();
44  }
45 
50  template <typename Derived>
51  explicit LiegroupElementConstBase (const Eigen::EigenBase<Derived>& value) :
52  value_ (value.derived()),
53  space_ (LiegroupSpace::create (value.derived().size ())) {}
54 
57  template <typename vector_type2>
59  value_ (other.vector()),
60  space_ (other.space ())
61  {}
62 
64  const LiegroupSpacePtr_t& space () const
65  {
66  return space_;
67  }
68 
70  const vector_type& vector () const
71  {
72  return value_;
73  }
74 
76  size_type size () const
77  {
78  return value_.size ();
79  }
80 
83  void check () const
84  {
85  assert (value_.size () == space_->nq ());
86  }
87 
88  protected:
89  template <typename Derived>
90  LiegroupElementConstBase (const Eigen::EigenBase<Derived>& value,
92  void* /*to enable this constructor*/):
93  value_ (const_cast<Derived&>(value.derived())),
94  space_ (space)
95  {}
96 
97  vector_type value_;
99 
100  template <typename vector_type2> friend class LiegroupElementConstBase;
101  template <typename vector_type2> friend class LiegroupElementBase;
102  };
103 
107  template <typename vector_type>
108  class LiegroupElementBase : public LiegroupElementConstBase<vector_type>
109  {
110  public:
112 
116  LiegroupElementBase (const vector_type& value,
117  const LiegroupSpacePtr_t& space) :
118  Base (value, space, NULL) {}
119 
123  Base (vector_t (space->nq ()), space) {}
124 
129  explicit LiegroupElementBase (const vector_type& value) :
130  Base (value, LiegroupSpace::create (value.size ()), NULL) {}
131 
134  template <typename vector_type2>
136  Base (other.value_, other.space()) {}
137 
142  template <typename vector_type2>
144  Base (other.value_, other.space()) {}
145 
147  template <typename vector_type2>
149  Base (other.value_, other.space(), NULL) {}
150 
152  LiegroupElementBase () : Base (vector_t(), LiegroupSpace::empty ()) {}
153 
155  const vector_type& vector () const
156  {
157  return Base::vector();
158  }
159 
161  vector_type& vector ()
162  {
163  return this->value_;
164  }
165 
167  void setNeutral ()
168  {
169  this->value_ = this->space_->neutral ().vector ();
170  }
171 
174 
176  template <typename vector_type2>
178  {
179  this->space_ = other.space();
180  this->value_ = other.vector();
181  return *this;
182  }
183 
185  template <typename Vector>
186  LiegroupElementBase& operator= (const Eigen::MatrixBase<Vector>& v)
187  {
188  EIGEN_STATIC_ASSERT_VECTOR_ONLY(Vector);
189  assert (this->space_->nq() == v.derived().size());
190  this->value_.noalias() = v.derived();
191  return *this;
192  }
193  };
194 
203  template <typename vector_type>
205 
213  template <typename vector_type1, typename vector_type2>
216 
218  template <typename vector_type>
220 
221  template <typename vector_type>
222  inline std::ostream& operator<< (std::ostream& os, const LiegroupElementConstBase<vector_type>& e)
223  {
224  os << "Lie group element in " << *(e.space ())
225  << " represented by vector (" << e. vector ().transpose () << ")";
226  return os;
227  }
228  } // namespace pinocchio
229 } // namespace hpp
230 
231 #endif // HPP_PINOCCHIO_LIEGROUP_ELEMENT_HH
LiegroupElement operator+(const LiegroupElementConstBase< vector_type > &e, vectorIn_t v)
const vector_type & vector() const
Const vector representation.
Definition: liegroup-element.hh:70
vector_t log(const LiegroupElementConstBase< vector_type > &lge)
Compute the log as a tangent vector of a Lie group element.
LiegroupElementBase(LiegroupElementBase< vector_type2 > &other)
Casting operator from LiegroupElement to LiegroupElementRef
Definition: liegroup-element.hh:148
const vector_type & vector() const
Const vector representation.
Definition: liegroup-element.hh:155
size_type size() const
Size of the vector representation.
Definition: liegroup-element.hh:76
Utility functions.
LiegroupElementConstBase(const Eigen::EigenBase< Derived > &value, const LiegroupSpacePtr_t &liegroupSpace)
Definition: liegroup-element.hh:39
LiegroupElementConstBase(const Eigen::EigenBase< Derived > &value)
Definition: liegroup-element.hh:51
ObjectFactory * create(ObjectFactory *parent=NULL, const XMLElement *element=NULL)
LiegroupElementBase(const LiegroupSpacePtr_t &space)
Definition: liegroup-element.hh:122
KDOP< N > & operator+=(const Vec3f &p)
LiegroupElementConstBase(const Eigen::EigenBase< Derived > &value, const LiegroupSpacePtr_t &space, void *)
Definition: liegroup-element.hh:90
matrix_t::Index size_type
Definition: fwd.hh:84
Definition: liegroup-space.hh:92
LiegroupElementBase()
Constructor of trivial element.
Definition: liegroup-element.hh:152
const LiegroupSpacePtr_t & space() const
get reference to vector of Lie groups
Definition: liegroup-element.hh:64
LiegroupElementConstBase< vector_type > Base
Definition: liegroup-element.hh:111
vector_t operator-(const LiegroupElementConstBase< vector_type1 > &e1, const LiegroupElementConstBase< vector_type2 > &e2)
Eigen::Matrix< value_type, Eigen::Dynamic, 1 > vector_t
Definition: fwd.hh:75
vector_type value_
Definition: liegroup-element.hh:97
LiegroupSpacePtr_t space_
Definition: liegroup-element.hh:98
LiegroupElementBase(const LiegroupElementBase< vector_type2 > &other)
Definition: liegroup-element.hh:143
LiegroupElementConstBase(const LiegroupElementConstBase< vector_type2 > &other)
Definition: liegroup-element.hh:58
Eigen::Ref< const vector_t > vectorIn_t
Definition: fwd.hh:80
LiegroupElementBase(const vector_type &value, const LiegroupSpacePtr_t &space)
Definition: liegroup-element.hh:116
void setNeutral()
Set element to neutral element.
Definition: liegroup-element.hh:167
void check() const
Definition: liegroup-element.hh:83
LiegroupElementBase(const LiegroupElementConstBase< vector_type2 > &other)
Definition: liegroup-element.hh:135
boost::shared_ptr< LiegroupSpace > LiegroupSpacePtr_t
Definition: fwd.hh:134
LiegroupElementBase(const vector_type &value)
Definition: liegroup-element.hh:129
vector_type & vector()
Modifiable vector representation.
Definition: liegroup-element.hh:161