pinocchio  UNKNOWN
joint-configuration.hxx
1 //
2 // Copyright (c) 2016-2018 CNRS
3 //
4 // This file is part of Pinocchio
5 // 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 // 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 // Pinocchio If not, see
16 // <http://www.gnu.org/licenses/>.
17 
18 #ifndef __se3_joint_configuration_hxx__
19 #define __se3_joint_configuration_hxx__
20 
21 #include "pinocchio/multibody/visitor.hpp"
22 #include "pinocchio/multibody/model.hpp"
23 #include "pinocchio/multibody/data.hpp"
24 
25 #include "pinocchio/multibody/liegroup/liegroup.hpp"
26 #include "pinocchio/multibody/liegroup/liegroup-algo.hpp"
27 
28 #include <cmath>
29 
30 /* --- Details -------------------------------------------------------------------- */
31 namespace se3
32 {
33  inline Eigen::VectorXd
34  integrate(const Model & model,
35  const Eigen::VectorXd & q,
36  const Eigen::VectorXd & v)
37  {
38  return integrate<LieGroupMap>(model, q, v);
39  }
40 
41  template<typename LieGroup_t>
42  inline Eigen::VectorXd
43  integrate(const Model & model,
44  const Eigen::VectorXd & q,
45  const Eigen::VectorXd & v)
46  {
47  Eigen::VectorXd integ(model.nq);
48  typename IntegrateStep<LieGroup_t>::ArgsType args(q, v, integ);
49  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
50  {
51  IntegrateStep<LieGroup_t>::run (model.joints[i], args);
52  }
53  return integ;
54  }
55 
56  inline Eigen::VectorXd
57  interpolate(const Model & model,
58  const Eigen::VectorXd & q0,
59  const Eigen::VectorXd & q1,
60  const double u)
61  {
62  return interpolate<LieGroupMap>(model, q0, q1, u);
63  }
64 
65  template<typename LieGroup_t>
66  inline Eigen::VectorXd
67  interpolate(const Model & model,
68  const Eigen::VectorXd & q0,
69  const Eigen::VectorXd & q1,
70  const double u)
71  {
72  Eigen::VectorXd interp(model.nq);
73  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
74  {
76  (model.joints[i], typename InterpolateStep<LieGroup_t>::ArgsType (q0, q1, u, interp));
77  }
78  return interp;
79  }
80 
81  template<typename LieGroup_t>
82  inline Eigen::VectorXd
83  difference(const Model & model,
84  const Eigen::VectorXd & q0,
85  const Eigen::VectorXd & q1)
86  {
87  Eigen::VectorXd diff(model.nv);
88  typename DifferenceStep<LieGroup_t>::ArgsType args(q0, q1, diff);
89  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
90  {
92  }
93  return diff;
94  }
95 
96  inline Eigen::VectorXd
97  difference(const Model & model,
98  const Eigen::VectorXd & q0,
99  const Eigen::VectorXd & q1)
100  {
101  return difference<LieGroupMap>(model, q0, q1);
102  }
103 
104  template<typename LieGroup_t>
105  inline Eigen::VectorXd
106  squaredDistance(const Model & model,
107  const Eigen::VectorXd & q0,
108  const Eigen::VectorXd & q1)
109  {
110  Eigen::VectorXd distances(Eigen::VectorXd::Zero(model.njoints-1));
111  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
112  {
113  typename SquaredDistanceStep<LieGroup_t>::ArgsType args(i-1, q0, q1, distances);
115  }
116  return distances;
117  }
118 
119  inline Eigen::VectorXd
120  squaredDistance(const Model & model,
121  const Eigen::VectorXd & q0,
122  const Eigen::VectorXd & q1)
123  {
124  return squaredDistance<LieGroupMap>(model, q0, q1);
125  }
126 
127  template<typename LieGroup_t>
128  inline double
129  distance(const Model & model,
130  const Eigen::VectorXd & q0,
131  const Eigen::VectorXd & q1)
132  {
133  return std::sqrt(squaredDistance<LieGroup_t>(model, q0, q1).sum());
134  }
135 
136  inline double
137  distance(const Model & model,
138  const Eigen::VectorXd & q0,
139  const Eigen::VectorXd & q1)
140  {
141  return std::sqrt(squaredDistance<LieGroupMap>(model, q0, q1).sum());
142  }
143 
144  template<typename LieGroup_t>
145  inline Eigen::VectorXd
146  randomConfiguration(const Model & model, const Eigen::VectorXd & lowerLimits, const Eigen::VectorXd & upperLimits)
147  {
148  Eigen::VectorXd q(model.nq);
149  typename RandomConfigurationStep<LieGroup_t>::ArgsType args(q, lowerLimits, upperLimits);
150  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
151  {
153  }
154  return q;
155  }
156 
157  inline Eigen::VectorXd
158  randomConfiguration(const Model & model, const Eigen::VectorXd & lowerLimits, const Eigen::VectorXd & upperLimits)
159  {
160  return randomConfiguration<LieGroupMap>(model, lowerLimits, upperLimits);
161  }
162 
163  template<typename LieGroup_t>
164  inline Eigen::VectorXd
165  randomConfiguration(const Model & model)
166  {
167  return randomConfiguration<LieGroup_t>(model, model.lowerPositionLimit, model.upperPositionLimit);
168  }
169 
170  inline Eigen::VectorXd
171  randomConfiguration(const Model & model)
172  {
173  return randomConfiguration<LieGroupMap>(model);
174  }
175 
176  template<typename LieGroup_t>
177  inline void normalize(const Model & model, Eigen::VectorXd & qout)
178  {
179  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i)
180  {
182  typename NormalizeStep<LieGroup_t>::ArgsType(qout));
183  }
184  }
185 
186  inline void normalize(const Model & model, Eigen::VectorXd & qout)
187  {
188  return normalize<LieGroupMap>(model,qout);
189  }
190 
191  template<typename LieGroup_t>
192  inline bool
193  isSameConfiguration(const Model & model,
194  const Eigen::VectorXd & q1,
195  const Eigen::VectorXd & q2,
196  const double& prec)
197  {
198  bool result = true;
199  typename IsSameConfigurationStep<LieGroup_t>::ArgsType args (result, q1, q2, prec);
200  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
201  {
203  if( !result )
204  return false;
205  }
206  return true;
207  }
208 
209  inline bool
210  isSameConfiguration(const Model & model,
211  const Eigen::VectorXd & q1,
212  const Eigen::VectorXd & q2,
213  const double& prec = Eigen::NumTraits<double>::dummy_precision())
214  {
215  return isSameConfiguration<LieGroupMap>(model, q1, q2, prec);
216  }
217 
218 
219 
220  template<typename LieGroup_t>
221  inline Eigen::VectorXd neutral(const Model & model)
222  {
223  Eigen::VectorXd neutral_elt(model.nq);
224  typename NeutralStep<LieGroup_t>::ArgsType args(neutral_elt);
225  for( Model::JointIndex i=1; i<(Model::JointIndex) model.njoints; ++i )
226  {
227  NeutralStep<LieGroup_t>::run(model.joints[i], args);
228 
229  }
230  return neutral_elt;
231  }
232 
233  inline Eigen::VectorXd neutral(const Model & model)
234  {
235  return neutral<LieGroupMap>(model);
236  }
237 
238 
239 } // namespace se3
240 
241 #endif // ifndef __se3_joint_configuration_hxx__
242 
bool isSameConfiguration(const Model &model, const Eigen::VectorXd &q1, const Eigen::VectorXd &q2, const double &prec=Eigen::NumTraits< double >::dummy_precision())
Return true if the given configurations are equivalents.
Eigen::VectorXd lowerPositionLimit
Lower joint configuration limit.
Definition: model.hpp:93
int nq
Dimension of the configuration vector representation.
Definition: model.hpp:49
int nv
Dimension of the velocity vector space.
Definition: model.hpp:52
Eigen::VectorXd squaredDistance(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Squared distance between two configuration vectors.
JointModelVector joints
Model of joint i, encapsulated in a JointModelAccessor.
Definition: model.hpp:70
Eigen::VectorXd difference(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Compute the tangent vector that must be integrated during one unit time to go from q0 to q1...
Eigen::VectorXd neutral(const Model &model)
Return the neutral configuration element related to the model configuration space.
double distance(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1)
Distance between two configuration vectors.
Eigen::VectorXd interpolate(const Model &model, const Eigen::VectorXd &q0, const Eigen::VectorXd &q1, const double u)
Interpolate the model between two configurations.
Eigen::VectorXd integrate(const Model &model, const Eigen::VectorXd &q, const Eigen::VectorXd &v)
Integrate a configuration for the specified model for a tangent vector during one unit time...
Eigen::VectorXd randomConfiguration(const Model &model, const Eigen::VectorXd &lowerLimits, const Eigen::VectorXd &upperLimits)
Generate a configuration vector uniformly sampled among provided limits.
void normalize(const Model &model, Eigen::VectorXd &q)
Normalize a configuration.
int njoints
Number of joints.
Definition: model.hpp:55