imu_stim300
Task.hpp
Go to the documentation of this file.
1 /* Generated from orogen/lib/orogen/templates/tasks/Task.hpp */
2 
3 #ifndef STIM300_TASK_TASK_HPP
4 #define STIM300_TASK_TASK_HPP
5 
6 #include "imu_stim300/TaskBase.hpp"
7 
9 #include <imu_stim300/Stim300Base.hpp>
10 #include <imu_stim300/Stim300RevB.hpp>
11 #include <imu_stim300/Stim300RevD.hpp>
12 
13 #include <quater_ikf/Ikf.hpp>
15 #include <aggregator/TimestampEstimator.hpp>
16 #include <rtt/extras/FileDescriptorActivity.hpp>
17 
18 namespace imu_stim300 {
19 
21  static const int Re = 6378137;
22  static const int Rp = 6378137;
23  static const double ECC = 0.0818191908426;
24  static const double GRAVITY = 9.79766542;
25  static const double GWGS0 = 9.7803267714;
26  static const double GWGS1 = 0.00193185138639;
27  static const double EARTHW = 7.292115e-05;
29  enum CONST {
31  };
32 
33  static const double GRAVITY_MARGIN = 0.3;
49  class Task : public TaskBase
50  {
51  friend class TaskBase;
52 
53  protected:
54 
55  /******************************/
56  /*** Control Flow Variables ***/
57  /******************************/
58 
61 
63  unsigned int initial_alignment_idx;
64 
65  /**************************/
66  /*** Property Variables ***/
67  /**************************/
68 
71 
74 
77 
80 
84 
87 
88  /**************************/
89  /*** Internal Variables ***/
90  /**************************/
91 
92  base::Time prev_ts;
93 
95 
97 
99  imu_stim300::Stim300Base *imu_stim300_driver;
100  aggregator::TimestampEstimator* timestamp_estimator;
101 
103  Eigen::Vector3d correctionAcc, correctionInc;
104 
106  Eigen::Matrix <double, 3, Eigen::Dynamic> initial_alignment_gyro;
107  Eigen::Matrix <double, 3, Eigen::Dynamic> initial_alignment_acc;
108 
109  filter::Ikf<double, true, true> myfilter;
111  Eigen::Quaterniond deltaquat, deltahead, attitude;
112 
113  Eigen::Matrix4d oldomega;
114 
115  /***************************/
117  /***************************/
118 
119  base::samples::RigidBodyState orientation_out;
121  public:
126  Task(std::string const& name = "imu_stim300::Task");
127 
133  Task(std::string const& name, RTT::ExecutionEngine* engine);
134 
137  ~Task();
138 
153  bool configureHook();
154 
160  bool startHook();
161 
176  void updateHook();
177 
184  void errorHook();
185 
189  void stopHook();
190 
195  void cleanupHook();
196 
197 
200  Eigen::Quaternion<double> deltaHeading(const Eigen::Vector3d &angvelo, Eigen::Matrix4d &oldomega, const double delta_t);
201 
202 
205  void outputPortSamples(imu_stim300::Stim300Base *driver, filter::Ikf<double, true, true> &myfilter, base::samples::IMUSensors &imusamples);
206 
218  static double GravityModel(double latitude, double altitude)
219  {
220  double g;
223  g = GWGS0*((1+GWGS1*pow(sin(latitude),2))/sqrt(1-pow(ECC,2)*pow(sin(latitude),2)));
224 
226  g = g*pow(Re/(Re+altitude), 2);
227 
228  #ifdef DEBUG_PRINTS
229  std::cout<<"[STIM300_CLASS] Theoretical gravity for this location (WGS-84 ellipsoid model): "<< g<<" [m/s^2]\n";
230  #endif
231 
232  return g;
233  };
234 
251  static void SubtractEarthRotation(Eigen::Vector3d &u, const Eigen::Quaterniond &q, const double latitude)
252  {
253  Eigen::Vector3d v (EARTHW*cos(latitude), 0, EARTHW*sin(latitude));
256  v = q * v;
257 
258  #ifdef DEBUG_PRINTS
259  std::cout<<"[STIM300_CLASS] Earth Rotation:"<<v<<"\n";
260  #endif
261 
263  u = u - v;
264 
265  return;
266  };
267 
271  static Eigen::Quaternion<double> deltaQuaternion(const Eigen::Vector3d &angvelo, const Eigen::Matrix4d &oldomega4, const Eigen::Matrix4d &omega4, const double dt)
272  {
273  Eigen::Vector4d quat;
274  quat<< 1.00, 0.00, 0.00, 0.00;
277  quat = (Eigen::Matrix<double,4,4>::Identity() +(0.75 * omega4 *dt)-(0.25 * oldomega4 * dt) -
278  ((1.0/6.0) * angvelo.squaredNorm() * pow(dt,2) * Eigen::Matrix<double, 4, 4>::Identity()) -
279  ((1.0/24.0) * omega4 * oldomega4 * pow(dt,2)) - ((1.0/48.0) * angvelo.squaredNorm() * omega4 * pow(dt,3))) * quat;
280 
281  Eigen::Quaternion<double> deltaq;
282  deltaq.w() = quat(0);
283  deltaq.x() = quat(1);
284  deltaq.y() = quat(2);
285  deltaq.z() = quat(3);
286  deltaq.normalize();
287 
288  return deltaq;
289  };
290 
291  public:
292  EIGEN_MAKE_ALIGNED_OPERATOR_NEW
293 
294  };
295 }
296 
297 #endif
298 
static double GravityModel(double latitude, double altitude)
This computes the theoretical gravity value according to the WGS-84 ellipsoid Earth model...
Definition: Task.hpp:218
Definition: imu_stim300Types.hpp:9
Eigen::Quaternion< double > deltaHeading(const Eigen::Vector3d &angvelo, Eigen::Matrix4d &oldomega, const double delta_t)
Definition: Task.cpp:551
Definition: imu_stim300Types.hpp:62
int correction_numbers
Definition: Task.hpp:94
FilterConfiguration config
Definition: Task.hpp:70
void outputPortSamples(imu_stim300::Stim300Base *driver, filter::Ikf< double, true, true > &myfilter, base::samples::IMUSensors &imusamples)
Port out the values.
Definition: Task.cpp:569
Eigen::Matrix< double, 3, Eigen::Dynamic > initial_alignment_acc
Definition: Task.hpp:107
unsigned int initial_alignment_idx
Definition: Task.hpp:63
The task context provides and requires services. It uses an ExecutionEngine to perform its functions...
Definition: Task.hpp:49
void stopHook()
Definition: Task.cpp:521
filter::Ikf< double, true, true > myfilter
Definition: Task.hpp:109
Eigen::Vector3d correctionAcc
Definition: Task.hpp:103
InertialNoiseParameters gyronoise
Definition: Task.hpp:76
base::Time prev_ts
Definition: Task.hpp:92
int correction_idx
Definition: Task.hpp:94
aggregator::TimestampEstimator * timestamp_estimator
Definition: Task.hpp:100
Definition: imu_stim300Types.hpp:93
Eigen::Quaterniond deltaquat
Definition: Task.hpp:111
bool startHook()
Definition: Task.cpp:238
friend class TaskBase
Definition: Task.hpp:51
Eigen::Matrix< double, 3, Eigen::Dynamic > initial_alignment_gyro
Definition: Task.hpp:106
InertialNoiseParameters incnoise
Definition: Task.hpp:79
Definition: imu_stim300Types.hpp:35
bool configureHook()
The following lines are template definitions for the various state machine.
Definition: Task.cpp:47
base::samples::RigidBodyState orientation_out
Definition: Task.hpp:119
void cleanupHook()
Definition: Task.cpp:540
Eigen::Quaterniond attitude
Definition: Task.hpp:111
void errorHook()
Definition: Task.cpp:517
Definition: imu_stim300Types.hpp:81
Definition: Task.hpp:30
void updateHook()
Definition: Task.cpp:256
imu_stim300::Stim300Base * imu_stim300_driver
Definition: Task.hpp:99
static Eigen::Quaternion< double > deltaQuaternion(const Eigen::Vector3d &angvelo, const Eigen::Matrix4d &oldomega4, const Eigen::Matrix4d &omega4, const double dt)
Delta quaternion rotation. Integration of small (given by the current angular velo) variation in atti...
Definition: Task.hpp:271
static void SubtractEarthRotation(Eigen::Vector3d &u, const Eigen::Quaterniond &q, const double latitude)
Subtract the Earth rotation from the gyroscopes readout.
Definition: Task.hpp:251
Task(std::string const &name="imu_stim300::Task")
Definition: Task.cpp:20
CONST
Definition: Task.hpp:29
AdaptiveAttitudeConfig adaptiveconfigAcc
Definition: Task.hpp:82
~Task()
Definition: Task.cpp:32
AdaptiveAttitudeConfig adaptiveconfigInc
Definition: Task.hpp:83
LocationConfiguration location
Definition: Task.hpp:86
double sampling_frequency
Definition: Task.hpp:96
Eigen::Quaterniond deltahead
Definition: Task.hpp:111
InertialNoiseParameters accnoise
Definition: Task.hpp:73
Eigen::Matrix4d oldomega
Definition: Task.hpp:113
Eigen::Vector3d correctionInc
Definition: Task.hpp:103
bool initAttitude
Definition: Task.hpp:60