IMUDevice.h
Go to the documentation of this file.
1/*
2 * IMU.h
3 *
4 * Created on: Mar 16, 2014
5 * Author: Dr.-Ing. David Israel González Aguirre
6 * Mail: david.gonzalez@kit.edu
7 */
8
9#pragma once
10
11#include "IMUEvent.h"
12#include "IMUHelpers.h"
13#include "IMUState.h"
14#include "Includes.h"
15
16#ifdef _IMU_USE_XSENS_DEVICE_
17
18#include "Xsens/Xsens.h"
20
21#endif
22
23#define _IMU_DEVICE_DEFAUL_CONNECTION_ std::string("/dev/ttyUSB0")
24#define _IMU_DEVICE_DEFAUL_FREQUENCY_ IMU::CIMUDevice::eSamplingFrequency_120HZ
25#define _IMU_DEVICE_DEFAUL_CHECK_PERIOD_FACTOR_ 0.5f
26#define _IMU_DEVICE_DEFAUL_NORMALIZED_THREAD_PRIORITY_ 0.125f
27
28namespace IMU
29{
30 //Forward definition
31 class IIMUEventDispatcher;
32
33 /*!
34 \class CIMUDevice
35 \ingroup IMU
36 \brief This class contains the the devices module and the thread for read the measurements.
37
38 CIMUDevice encapsulates the device details for the rest of the library and applications.
39 This also includes a thread which is in charge of generate the IMU events
40 */
42 {
43 public:
44 /*!
45 \brief Enum specifying the running thread policy.
46 */
48 {
49 eRealTime = SCHED_FIFO,
51 eBatch = SCHED_BATCH,
52 eIdle = SCHED_IDLE
53 };
54
55 /*!
56 \brief Enum specifying the supported sampling frequencies.
57 */
59 {
103 };
104
111
112 /*!
113 \brief The default constructor.
114 The default constructor sets all member variables to zero, i.e. after construction no valid device nor thread are represented.
115 */
116 CIMUDevice();
117
118 /*!
119 \brief The destructor.
120 */
121 virtual ~CIMUDevice();
122
123 uint64_t GetDeviceId() const;
124
125 inline IMUState
127 {
128
129#ifdef _IMU_USE_XSENS_DEVICE_
130
131 return m_XsensMTiFrame.m_IMUState;
132
133#endif
134 }
135
136 bool Connect(const std::string& PortName, const SamplingFrequency Frequency);
137
138 bool Start(const bool Blocking = true);
139
140 bool SetThreadRunnigMode(const ThreadPolicyType ThreadPolicy,
141 const float NormalizedPriority);
142
143 void Stop(const bool Blocking = true);
144
145 bool SetFusion(const FusionStrategy Strategy, const ushort SamplesPerFusion);
146
147 bool IsActive() const;
148
149 bool RegisterEventDispatcher(IIMUEventDispatcher* pIMUEventDispatcher);
150
151 bool UnregisterEventDispatcher(IIMUEventDispatcher* pIMUEventDispatcher);
152
153 inline const timeval&
155 {
156 return m_ReferenceTimeStamp;
157 }
158
159 protected:
160 bool LoadCurrentState();
161
164 void MeanFusion();
165
168 void GaussianFusion();
169
172 bool IntegrateWithFusion();
173
174 private:
175 void UnregisterEventDispatchers();
176
177 bool InitializeDevice(const std::string& PortName, const SamplingFrequency Frequency);
178 void FinalizeModuleDevice();
179 void ShouldYield();
180 bool DispatchCylcle();
181 void SendEvent(const CIMUEvent& Event);
182 void SetReferenceTimeStamps();
183
184 static void* ThreadLoop(void* pData);
185
186 uint64_t m_DeviceId;
187 SamplingFrequency m_SamplingFrequency;
188 int m_PeriodMicroSeconds;
189 FusionStrategy m_FusionStrategy;
190 int m_SamplesPerFusion;
191 int m_CollectedFusionSamples;
192 volatile bool m_IsActive;
193 volatile bool m_IsDispatching;
194 bool m_IsInitialized;
195 pthread_t m_pInternalThreadHandel;
196 pthread_mutex_t m_IsActiveMutex;
197 pthread_mutex_t m_IsDispatchingMutex;
198 pthread_mutex_t m_EventDispatchersMutex;
199 pthread_mutex_t m_DeviceMutex;
200 std::set<IIMUEventDispatcher*> m_IMUEventDispatchers;
201 timeval m_ReferenceTimeStamp;
202 timeval m_LastFrameTimeStamp;
203
204 IMUState::PhysicalData m_FusedPhysicalData;
205 IMUState m_FusedIMUState;
206 IMUState m_IntegratedIMUState;
207
208#ifdef _IMU_USE_XSENS_DEVICE_
209
210 bool InitializeXsensDevice(const std::string& PortName, const SamplingFrequency Frequency);
211 void FinalizeXsensModuleDevice();
212 void DestroyXsensModuleDevice();
213
214 Xsens::CXsensMTiModule* m_pXsensMTiModule;
215 Xsens::XsensMTiFrame m_XsensMTiFrame;
216
217#endif
218 };
219} // namespace IMU
bool LoadCurrentState()
bool Start(const bool Blocking=true)
Definition IMUDevice.cpp:76
const timeval & GetReferenceTimeStamp() const
Definition IMUDevice.h:154
bool IntegrateWithFusion()
bool SetFusion(const FusionStrategy Strategy, const ushort SamplesPerFusion)
bool SetThreadRunnigMode(const ThreadPolicyType ThreadPolicy, const float NormalizedPriority)
bool MeanFuseCurrentState()
virtual ~CIMUDevice()
The destructor.
Definition IMUDevice.cpp:43
void IncorporateCurrentStateGaussianFusion()
IMUState GetIMUState() const
Definition IMUDevice.h:126
CIMUDevice()
The default constructor. The default constructor sets all member variables to zero,...
Definition IMUDevice.cpp:15
SamplingFrequency
Enum specifying the supported sampling frequencies.
Definition IMUDevice.h:59
@ eSamplingFrequency_72HZ
Definition IMUDevice.h:77
@ eSamplingFrequency_288HZ
Definition IMUDevice.h:94
@ eSamplingFrequency_100HZ
Definition IMUDevice.h:82
@ eSamplingFrequency_225HZ
Definition IMUDevice.h:91
@ eSamplingFrequency_30HZ
Definition IMUDevice.h:68
@ eSamplingFrequency_16HZ
Definition IMUDevice.h:63
@ eSamplingFrequency_20HZ
Definition IMUDevice.h:65
@ eSamplingFrequency_160HZ
Definition IMUDevice.h:87
@ eSamplingFrequency_180HZ
Definition IMUDevice.h:88
@ eSamplingFrequency_120HZ
Definition IMUDevice.h:83
@ eSamplingFrequency_18HZ
Definition IMUDevice.h:64
@ eSamplingFrequency_90HZ
Definition IMUDevice.h:80
@ eSamplingFrequency_64HZ
Definition IMUDevice.h:76
@ eSamplingFrequency_32HZ
Definition IMUDevice.h:69
@ eSamplingFrequency_150HZ
Definition IMUDevice.h:86
@ eSamplingFrequency_10HZ
Definition IMUDevice.h:60
@ eSamplingFrequency_60HZ
Definition IMUDevice.h:75
@ eSamplingFrequency_320HZ
Definition IMUDevice.h:96
@ eSamplingFrequency_12HZ
Definition IMUDevice.h:61
@ eSamplingFrequency_144HZ
Definition IMUDevice.h:85
@ eSamplingFrequency_48HZ
Definition IMUDevice.h:73
@ eSamplingFrequency_200HZ
Definition IMUDevice.h:90
@ eSamplingFrequency_50HZ
Definition IMUDevice.h:74
@ eSamplingFrequency_360HZ
Definition IMUDevice.h:97
@ eSamplingFrequency_400HZ
Definition IMUDevice.h:99
@ eSamplingFrequency_240HZ
Definition IMUDevice.h:92
@ eSamplingFrequency_384HZ
Definition IMUDevice.h:98
@ eSamplingFrequency_15HZ
Definition IMUDevice.h:62
@ eSamplingFrequency_300HZ
Definition IMUDevice.h:95
@ eSamplingFrequency_24HZ
Definition IMUDevice.h:66
@ eSamplingFrequency_128HZ
Definition IMUDevice.h:84
@ eSamplingFrequency_80HZ
Definition IMUDevice.h:79
@ eSamplingFrequency_36HZ
Definition IMUDevice.h:70
@ eSamplingFrequency_25HZ
Definition IMUDevice.h:67
@ eSamplingFrequency_192HZ
Definition IMUDevice.h:89
@ eSamplingFrequency_256HZ
Definition IMUDevice.h:93
@ eSamplingFrequency_96HZ
Definition IMUDevice.h:81
@ eSamplingFrequency_45HZ
Definition IMUDevice.h:72
@ eSamplingFrequency_75HZ
Definition IMUDevice.h:78
@ eSamplingFrequency_40HZ
Definition IMUDevice.h:71
bool Connect(const std::string &PortName, const SamplingFrequency Frequency)
Definition IMUDevice.cpp:55
void Stop(const bool Blocking=true)
Definition IMUDevice.cpp:98
bool IntegrateWithOutFusion()
void GaussianFusion()
bool IsActive() const
uint64_t GetDeviceId() const
Definition IMUDevice.cpp:49
bool UnregisterEventDispatcher(IIMUEventDispatcher *pIMUEventDispatcher)
bool IntegrateCurrentState()
bool GaussianFuseCurrentState()
ThreadPolicyType
Enum specifying the running thread policy.
Definition IMUDevice.h:48
@ eRoundRobinPriorityBased
Definition IMUDevice.h:50
void IncorporateCurrentStateMeanFusion()
bool RegisterEventDispatcher(IIMUEventDispatcher *pIMUEventDispatcher)