threed_odometry
Task.hpp
Go to the documentation of this file.
1 /* Generated from orogen/lib/orogen/templates/tasks/Task.hpp */
2 
3 #ifndef THREED_ODOMETRY_TASK_TASK_HPP
4 #define THREED_ODOMETRY_TASK_TASK_HPP
5 
6 #include "threed_odometry/TaskBase.hpp"
7 
9 #include <boost/shared_ptr.hpp>
12 #include <Eigen/Core>
13 #include <Eigen/SVD>
14 #include <Eigen/Dense>
15 #include <Eigen/StdVector>
18 #include <threed_odometry/KinematicKDL.hpp>
19 #include <threed_odometry/MotionModel.hpp>
20 #include <threed_odometry/IIR.hpp>
24 namespace threed_odometry {
25 
27  typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> WeightingMatrix;
28 
29  template<class scalar> inline scalar tolerance();
30 
31  template<> inline float tolerance<float >() { return 1e-5f; }
32  template<> inline double tolerance<double>() { return 1e-11; }
33 
34  static const unsigned int NORDER_BESSEL_FILTER = 8;
60  class Task : public TaskBase
61  {
62  friend class TaskBase;
63  protected:
64 
65  virtual void joints_samplesTransformerCallback(const base::Time &ts, const ::base::samples::Joints &joints_samples_sample);
66 
67  virtual void orientation_samplesTransformerCallback(const base::Time &ts, const ::base::samples::RigidBodyState &orientation_samples_sample);
68 
69  protected:
70 
71  /**************************/
72  /*** Property Variables ***/
73  /**************************/
74 
75  std::string urdfFile;
76 
77  std::vector<std::string> contact_point_segments;
78 
79  std::vector<std::string> contact_angle_segments;
80 
82  std::vector<std::string> all_joint_names;
83 
84  std::vector<std::string> slip_joint_names;
85 
86  std::vector<std::string> contact_joint_names;
87 
89 
92 
93  /******************************************/
94  /*** General Internal Storage Variables ***/
95  /******************************************/
96 
99 
101  std::vector<std::string> motion_model_joint_names;
102 
104  Eigen::Matrix< double, Eigen::Dynamic, 1 > joint_positions;
105 
107  Eigen::Matrix< double, Eigen::Dynamic, 1 > joint_velocities;
108 
110  Eigen::Matrix< double, 6, 1 > cartesian_velocities;
111 
113  std::vector< Eigen::Matrix <double, 6, 1> , Eigen::aligned_allocator < Eigen::Matrix <double, 6, 1> > > vector_cartesian_velocities;
114 
116  boost::shared_ptr< threed_odometry::KinematicKDL > robotKinematics;
117 
119  boost::shared_ptr< threed_odometry::MotionModel<double> > motionModel;
120 
122  std::vector<Eigen::Affine3d> fkRobotTrans;
123 
125  std::vector<base::Matrix6d> fkRobotCov;
126 
128  Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > modelVelCov;
129 
131  Eigen::Matrix< double, 6, 6 > cartesianVelCov;
132 
135  boost::shared_ptr< threed_odometry::IIR<NORDER_BESSEL_FILTER, 3> > bessel;
136 
138  WeightingMatrix weight_matrix;
139 
141  ::base::samples::RigidBodyState delta_pose;
142 
143  /***************************/
145  /***************************/
146 
147  ::base::samples::Joints joints_samples;
148 
149  ::base::samples::RigidBodyState orientation_samples;
150 
151 
152  /***************************/
154  /***************************/
155 
157  Eigen::Affine3d pose;
158  Eigen::Matrix<double, 6, 6> poseCov;
159 
160 
161  public:
166  Task(std::string const& name = "exoter_odometry::Task");
167 
173  Task(std::string const& name, RTT::ExecutionEngine* engine);
174 
177  ~Task();
178 
193  bool configureHook();
194 
200  bool startHook();
201 
216  void updateHook();
217 
224  void errorHook();
225 
229  void stopHook();
230 
235  void cleanupHook();
236 
240  void motionVelocities();
241 
244  void deadReckoning(const double &delta_t);
245 
248  void joints_samplesUnpack(const ::base::samples::Joints &original_joints,
249  const std::vector<std::string> &order_names,
250  Eigen::Matrix< double, Eigen::Dynamic, 1 > &joint_positions,
251  Eigen::Matrix< double, Eigen::Dynamic, 1 > &joint_velocities);
252 
253  bool joints_samplesMotionModel(std::vector<std::string> &order_names,
254  const std::vector<std::string> &joint_names,
255  const std::vector<std::string> &slip_names,
256  const std::vector<std::string> &contact_names);
257 
258 
261  void outputPortPose(const Eigen::Matrix< double, 6, 1 > &cartesian_velocities);
262 
266 
267  public:
268 
269  template <typename _MatrixType>
270  static _MatrixType guaranteeSPD (const _MatrixType &A)
271  {
272  _MatrixType spdA;
273  Eigen::VectorXd s;
274  s.resize(A.rows(), 1);
275 
279  Eigen::JacobiSVD <Eigen::MatrixXd > svdOfA (A, Eigen::ComputeThinU | Eigen::ComputeThinV);
280 
281  s = svdOfA.singularValues();
282 
283  #ifdef DEBUG_PRINTS
284  std::cout<<"[SPD-SVD] s: \n"<<s<<"\n";
285  std::cout<<"[SPD-SVD] svdOfA.matrixU():\n"<<svdOfA.matrixU()<<"\n";
286  std::cout<<"[SPD-SVD] svdOfA.matrixV():\n"<<svdOfA.matrixV()<<"\n";
287 
288  Eigen::EigenSolver<_MatrixType> eig(A);
289  std::cout << "[SPD-SVD] BEFORE: eigen values: " << eig.eigenvalues().transpose() << std::endl;
290  #endif
291 
292  for (register int i=0; i<s.size(); ++i)
293  {
294  #ifdef DEBUG_PRINTS
295  std::cout<<"[SPD-SVD] i["<<i<<"]\n";
296  #endif
297 
298  if (s(i) < 0.00)
299  s(i) = 0.00;
300  }
301  spdA = svdOfA.matrixU() * s.matrix().asDiagonal() * svdOfA.matrixV().transpose();
302 
303  #ifdef DEBUG_PRINTS
304  Eigen::EigenSolver<_MatrixType> eigSPD(spdA);
305  if (eig.eigenvalues() == eigSPD.eigenvalues())
306  std::cout<<"[SPD-SVD] EQUAL!!\n";
307 
308  std::cout << "[SPD-SVD] AFTER: eigen values: " << eigSPD.eigenvalues().transpose() << std::endl;
309  #endif
310 
311  return spdA;
312  };
313 
323  Eigen::Vector3d boxminus(const double &w, const Eigen::Vector3d& vec, const double &scale, bool plus_minus_periodicity)
324  {
325  Eigen::Vector3d result;
326 
327  double nv = vec.norm();
329  {
330  if(!plus_minus_periodicity)
331  {
332  // find the maximal entry:
333  int i;
334  vec.maxCoeff(&i);
335  result = scale * std::atan2(0, w) * Eigen::Vector3d::Unit(i);
336  return result;
337  }
339  }
340  double s = scale / nv * (plus_minus_periodicity ? std::atan(nv / w) : std::atan2(nv, w) );
341 
342  result = s * vec;
343 
344  return result;
345  };
346 
347  public:
348  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
349 
350 
351  };
352 }
353 
354 #endif
355 
boost::shared_ptr< threed_odometry::MotionModel< double > > motionModel
Definition: Task.hpp:119
std::vector< std::string > motion_model_joint_names
Definition: Task.hpp:101
void updateHook()
Definition: Task.cpp:344
boost::shared_ptr< threed_odometry::IIR< NORDER_BESSEL_FILTER, 3 > > bessel
Definition: Task.hpp:135
std::vector< base::Matrix6d > fkRobotCov
Definition: Task.hpp:125
~Task()
Definition: Task.cpp:47
The task context provides and requires services. It uses an ExecutionEngine to perform its functions...
Definition: Task.hpp:60
ModelType kinematic_model_type
Definition: Task.hpp:88
Eigen::Matrix< double, Eigen::Dynamic, 1 > joint_positions
Definition: Task.hpp:104
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > modelVelCov
Definition: Task.hpp:128
virtual void orientation_samplesTransformerCallback(const base::Time &ts, const ::base::samples::RigidBodyState &orientation_samples_sample)
Definition: Task.cpp:89
double tolerance< double >()
Definition: Task.hpp:32
std::vector< std::string > all_joint_names
Definition: Task.hpp:82
int number_robot_joints
Definition: Task.hpp:98
::base::samples::RigidBodyState delta_pose
Definition: Task.hpp:141
std::vector< std::string > contact_joint_names
Definition: Task.hpp:86
Eigen::Matrix< double, 6, 6 > cartesianVelCov
Definition: Task.hpp:131
bool joints_samplesMotionModel(std::vector< std::string > &order_names, const std::vector< std::string > &joint_names, const std::vector< std::string > &slip_names, const std::vector< std::string > &contact_names)
Definition: Task.cpp:513
Eigen::Vector3d boxminus(const double &w, const Eigen::Vector3d &vec, const double &scale, bool plus_minus_periodicity)
Definition: Task.hpp:323
void motionVelocities()
Computes the velocities using the motion model.
Definition: Task.cpp:361
float tolerance< float >()
Definition: Task.hpp:31
std::vector< std::string > contact_angle_segments
Definition: Task.hpp:79
void cleanupHook()
Definition: Task.cpp:356
Eigen::Matrix< double, 6, 6 > poseCov
Definition: Task.hpp:158
Task(std::string const &name="exoter_odometry::Task")
Definition: Task.cpp:16
Eigen::Matrix< double, Eigen::Dynamic, 1 > joint_velocities
Definition: Task.hpp:107
Eigen::Affine3d pose
Definition: Task.hpp:157
Eigen::Matrix< double, 6, 1 > cartesian_velocities
Definition: Task.hpp:110
::base::samples::Joints joints_samples
Definition: Task.hpp:147
void deadReckoning(const double &delta_t)
Performs the odometry update.
Definition: Task.cpp:443
std::string urdfFile
Definition: Task.hpp:75
std::vector< std::string > slip_joint_names
Definition: Task.hpp:84
friend class TaskBase
Definition: Task.hpp:62
static _MatrixType guaranteeSPD(const _MatrixType &A)
Definition: Task.hpp:270
boost::shared_ptr< threed_odometry::KinematicKDL > robotKinematics
Definition: Task.hpp:116
void outputPortPose(const Eigen::Matrix< double, 6, 1 > &cartesian_velocities)
Store the variables in the Output ports.
Definition: Task.cpp:567
Definition: ThreedOdometryTypes.hpp:26
IIRCoefficients iirConfig
Definition: Task.hpp:91
void outputPortContactPoints()
Contact point information.
Definition: Task.cpp:646
Definition: Task.hpp:24
void errorHook()
Definition: Task.cpp:348
bool startHook()
Definition: Task.cpp:338
bool configureHook()
The following lines are template definitions for the various state machine.
Definition: Task.cpp:170
std::vector< std::string > contact_point_segments
Definition: Task.hpp:77
std::vector< Eigen::Matrix< double, 6, 1 >, Eigen::aligned_allocator< Eigen::Matrix< double, 6, 1 > > > vector_cartesian_velocities
Definition: Task.hpp:113
std::vector< Eigen::Affine3d > fkRobotTrans
Definition: Task.hpp:122
WeightingMatrix weight_matrix
Definition: Task.hpp:138
scalar tolerance()
::base::samples::RigidBodyState orientation_samples
Definition: Task.hpp:149
void stopHook()
Definition: Task.cpp:352
ModelType
Definition: ThreedOdometryTypes.hpp:11
Eigen::Matrix< double, Eigen::Dynamic, Eigen::Dynamic > WeightingMatrix
Definition: Task.hpp:27
virtual void joints_samplesTransformerCallback(const base::Time &ts, const ::base::samples::Joints &joints_samples_sample)
Definition: Task.cpp:51
void joints_samplesUnpack(const ::base::samples::Joints &original_joints, const std::vector< std::string > &order_names, Eigen::Matrix< double, Eigen::Dynamic, 1 > &joint_positions, Eigen::Matrix< double, Eigen::Dynamic, 1 > &joint_velocities)
Definition: Task.cpp:475