API Documentation
Loading...
Searching...
No Matches
OrientationSensor.h
Go to the documentation of this file.
1/*--------------------------------------------------------------------------------------------
2Copyright (c) 2019, NDEVR LLC
3tyler.parke@ndevr.org
4 __ __ ____ _____ __ __ _______
5 | \ | | | __ \ | ___|\ \ / / | __ \
6 | \ | | | | \ \ | |___ \ \ / / | |__) |
7 | . \| | | |__/ / | |___ \ V / | _ /
8 | |\ |_|_____/__|_____|___\_/____| | \ \
9 |__| \__________________________________| \__\
10
11Subject to the terms of the Enterprise+ Agreement, NDEVR hereby grants
12Licensee a limited, non-exclusive, non-transferable, royalty-free license
13(without the right to sublicense) to use the API solely for the purpose of
14Licensee's internal development efforts to develop applications for which
15the API was provided.
16
17The above copyright notice and this permission notice shall be included in all
18copies or substantial portions of the Software.
19
20THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
21INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
22PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
23FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
24OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25DEALINGS IN THE SOFTWARE.
26
27Library: Hardware
28File: OrientationSensor
29Included in API: True
30Author(s): Tyler Parke
31 *-----------------------------------------------------------------------------------------**/
32#pragma once
33#include <NDEVR/Device.h>
34#include <NDEVR/Matrix.h>
35#include <QObject>
36namespace NDEVR
37{
38 /**--------------------------------------------------------------------------------------------------
39 \brief Used by OrientationSensor to display the current state of any available gyro
40 \ingroup Hardware Magnetometer
41 **/
54
55 /**--------------------------------------------------------------------------------------------------
56 \brief Used by OrientationSensor to display the current state of any available magnetometer
57 \ingroup Hardware Magnetometer
58 **/
66 /**--------------------------------------------------------------------------------------------------
67 \brief Reports the state of an accelerometer within a OrientationSensor
68 **/
75 class StationModel;
76 class Calibration;
77 class IMUCalibrator;
78 class DesignObjectLookup;
79 class MagneticCalibrationData;
80
81 /**--------------------------------------------------------------------------------------------------
82 \brief Used to report the orientation of a Hardware object within 3D space
83 \ingroup Hardware Magnetometer Orientation Gyro Accelerometer
84 **/
86 {
87 Q_OBJECT
88 public:
89 OrientationSensor(const Model& model, ProgressInfo* log, QObject* parent = nullptr);
90 [[nodiscard]] virtual Time getGyroCalibrationTime() const;
91 [[nodiscard]] virtual MagnetometerState magnetometerState() const { return m_magnetometer_state; };
92 [[nodiscard]] virtual GyroState gyroState() const;
93 [[nodiscard]] virtual Matrix<fltp08> lastOrientation() const;
94 [[nodiscard]] static Matrix<fltp08, 3, 3> calculateDeviation(TimeSpan time, const Vector<4, fltp08>& start, const Vector<4, fltp08>& end);
95 [[nodiscard]] static Angle<fltp08> calculateNorthFacing(const Matrix<fltp08, 3, 3>& offset_mat);
96 [[nodiscard]] static Matrix<fltp08, 3, 3> offsetCalibration(TimeSpan time_since_calibration, const Matrix<fltp08, 3, 3>& current_orientation, const Matrix<fltp08, 3, 3>& dev_matrix);
97 [[nodiscard]] virtual bool usingAccelerometer() const { return m_using_accelerometer; }
98 [[nodiscard]] virtual bool usingCompass() const { return m_using_compass; }
99 [[nodiscard]] virtual bool usingGyro() const { return m_using_gyro; }
100 [[nodiscard]] virtual bool isGyroUpdating() const { return m_is_gyro_updating; }
101 [[nodiscard]] virtual bool hasLockedYaw() const;
102 [[nodiscard]] virtual bool hasLockedRoll() const;
103 [[nodiscard]] const Vector<3, Angle<fltp08>>& driftRate() const { return m_angle_drift_rate; }
104 [[nodiscard]] Vector<3, Angle<fltp08>> driftValue() const;
105 [[nodiscard]] Vector<3, Angle<fltp08>> userSpecifiedOffsets() const { return m_user_specified_offsets; };
106 [[nodiscard]] Vector<3, Angle<fltp08>> deviceOffsets() const { return m_device_specified_offsets; };
107 [[nodiscard]] virtual bool isLocked() const { return m_is_locked; }
108 [[nodiscard]] virtual TranslatedString calibrationMessage() const;
110 void setUserSpecifiedOffsets(const Vector<3, Angle<fltp08>>& user_specified_offsets) { m_user_specified_offsets = user_specified_offsets; }
111 void setDeviceOffsets(Vector<3, Angle<fltp08>> device_offsets) { m_device_specified_offsets = device_offsets; }
112 virtual bool requestAccelerationBiasLimit(fltp04 bias_limit) { UNUSED(bias_limit); return false; }
113 virtual bool requestUsingAccelerometer(bool using_accelerometer);
114 virtual Ray<3, fltp08> calibratedMagnetometerVector() const { return m_calibrated_magnetomer_vector; };
115 virtual Ray<3, fltp08> rawMagnetometerVector() const { return m_raw_magnetometer_vector; };
116 virtual Angle<fltp08> compassAngle() const { return Constant<Angle<fltp08>>::Invalid; };
117 virtual bool requestUsingCompass(bool using_compass);
118 virtual bool requestUsingGyro(bool using_gyro, bool reset_state);
119 virtual bool requestGyroCalibration() { return false; }
120 virtual void lockRoll(bool lock_roll, Angle<fltp08> roll = Constant<Angle<fltp08>>::Invalid, Angle<fltp08> yaw = Constant<Angle<fltp08>>::Invalid);
121 virtual void lockYaw(bool lock_yaw, Angle<fltp08> lock_heading = Constant<Angle<fltp08>>::Invalid);
122 virtual bool supportsFixed() const { return true; }
123 virtual bool supportsModes() const { return false; }
124 virtual bool supportsRodded() const { return true; }
125 virtual void setDriftRate(const Vector<3, Angle<fltp08>>& drift_rate);
126 virtual void setCalibrator(IMUCalibrator* imu_calibrator);
127#if NDEVR_CALIBRATION
128 virtual Calibration createCalibrationObject(DesignObjectLookup* lookup);
129#endif
131 virtual bool requestMagnetometerCalibration(bool) { return false; }
132 virtual bool requestApplyMagnetometerCalibration() { return false; }
133 virtual bool needsMagnetometerCalibration() const { return false; }
134 virtual bool hasCalibratedDrift() const { return m_has_calibrated_drift; }
137 void setFromGravityAcceleration(const Vector<3, fltp08>& acceleration_vector);
138 virtual void setFromQuaternion(const Vector<4, fltp08>& quaternion);
140 void createCalibrationOffset(const Matrix<fltp08>& map_from, const Matrix<fltp08>& map_to);
141 void setFromAngles(const Vector<3, Angle<fltp08>>& angles);
143 virtual void clearCurrentDrift();
144 IMUCalibrator* calibrator() const { return m_imu_calibrator; }
145 [[nodiscard]] virtual Ray<3, fltp08> referenceDirection() const { return Ray<3, fltp08>(1.0, 0.0, 0.0); }
146 [[nodiscard]] virtual UUID calibrationID() const { return m_calibration_id; };
147 protected:
148 [[nodiscard]] virtual Vector<3, Angle<fltp08>> lastOrientationAngle() const;
149 signals:
154 protected:
155 Ray<3, fltp08> m_calibrated_magnetomer_vector = Constant<Ray<3, fltp08>>::Invalid;
156 Ray<3, fltp08> m_raw_magnetometer_vector = Constant<Ray<3, fltp08>>::Invalid;
163 Time m_calibration_time;//The time when the current calibration was created
168 IMUCalibrator* m_imu_calibrator = nullptr;
173 bool m_using_gyro = false;
174 bool m_using_compass = false;
175 bool m_using_accelerometer = false;
176 bool m_is_gyro_updating = false;
177 bool m_is_locked = false;
178 bool m_has_calibrated_drift = false;
179 bool m_gyro_calibration_requested = false;
180 };
181}
#define UNUSED(expr)
Definition BaseValues.hpp:409
#define HARDWARE_API
Definition DLLInfo.h:56
The primary angle storage class for this API. Stores an angle in an optimized format.
Definition StringStream.h:540
A core class where all Design Objects including models, materials, and geometries are stored....
Definition DesignObjectLookup.h:65
A root class which describes some physical object, such as a Motor, Sensor, or Connection....
Definition Device.h:52
Logic and storage for IMU calibration. An IMU calibration works by moving the sensor into a series of...
Definition IMUCalibrator.h:35
Stores magnetic calibration data as a Model including the transformation and calibration points.
Definition MagneticCalibration.h:14
Definition Matrix.hpp:176
A core class that represents a node on model heirarchy. This node may contain a Geometry or one or mo...
Definition Model.h:58
Used to report the orientation of a Hardware object within 3D space.
Definition OrientationSensor.h:86
static Matrix< fltp08, 3, 3 > offsetCalibration(TimeSpan time_since_calibration, const Matrix< fltp08, 3, 3 > &current_orientation, const Matrix< fltp08, 3, 3 > &dev_matrix)
static Angle< fltp08 > calculateNorthFacing(const Matrix< fltp08, 3, 3 > &offset_mat)
virtual Ray< 3, fltp08 > referenceDirection() const
Definition OrientationSensor.h:145
virtual Vector< 3, Angle< fltp08 > > lastOrientationAngle() const
virtual bool hasCalibratedDrift() const
Definition OrientationSensor.h:134
fltp04 m_calibration_percent
Definition OrientationSensor.h:164
Vector< 3, Angle< fltp08 > > m_angle_drift_rate
Definition OrientationSensor.h:161
virtual bool supportsRodded() const
Definition OrientationSensor.h:124
virtual GyroState gyroState() const
virtual bool usingGyro() const
Definition OrientationSensor.h:99
virtual void lockRoll(bool lock_roll, Angle< fltp08 > roll=Constant< Angle< fltp08 > >::Invalid, Angle< fltp08 > yaw=Constant< Angle< fltp08 > >::Invalid)
virtual Matrix< fltp08 > lastOrientation() const
Vector< 3, Angle< fltp08 > > quaternionToAngle(const Vector< 4, fltp08 > &quaternion) const
GyroState m_gyro_state
Definition OrientationSensor.h:170
virtual bool requestUsingCompass(bool using_compass)
virtual Ray< 3, fltp08 > calibratedMagnetometerVector() const
Definition OrientationSensor.h:114
const Vector< 3, Angle< fltp08 > > & driftRate() const
Definition OrientationSensor.h:103
virtual bool requestGyroCalibration()
Definition OrientationSensor.h:119
virtual bool hasLockedYaw() const
Angle< fltp08 > m_yaw_lock
Definition OrientationSensor.h:166
MagnetometerState m_magnetometer_state
Definition OrientationSensor.h:171
AccelerometerState m_acceleromter_state
Definition OrientationSensor.h:172
Time m_calibration_time
Definition OrientationSensor.h:163
Vector< 3, Angle< fltp08 > > driftValue() const
Angle< fltp08 > m_roll_lock_reference_yaw
Definition OrientationSensor.h:167
virtual bool supportsModes() const
Definition OrientationSensor.h:123
Vector< 3, Angle< fltp08 > > m_user_specified_offsets
Definition OrientationSensor.h:159
Vector< 3, Angle< fltp08 > > userSpecifiedOffsets() const
Definition OrientationSensor.h:105
virtual bool isLocked() const
Definition OrientationSensor.h:107
virtual MagneticCalibrationData * magnetometerCalibrationObject()
Definition OrientationSensor.h:130
virtual bool hasLockedRoll() const
void setDeviceOffsets(Vector< 3, Angle< fltp08 > > device_offsets)
Definition OrientationSensor.h:111
IMUCalibrator * calibrator() const
Definition OrientationSensor.h:144
virtual Ray< 3, fltp08 > rawMagnetometerVector() const
Definition OrientationSensor.h:115
virtual bool needsMagnetometerCalibration() const
Definition OrientationSensor.h:133
void magnetometerCalibrationUpdatedSignal()
virtual void setDriftRate(const Vector< 3, Angle< fltp08 > > &drift_rate)
virtual bool usingAccelerometer() const
Definition OrientationSensor.h:97
virtual void clearCurrentDrift()
void setFromAngles(const Vector< 3, Angle< fltp08 > > &angles)
virtual void setCalibrator(IMUCalibrator *imu_calibrator)
virtual bool requestUsingGyro(bool using_gyro, bool reset_state)
fltp04 calibrationPercent() const
void setFromGravityAcceleration(const Vector< 3, fltp08 > &acceleration_vector)
void deploymentModeOptionsUpdatedSignal()
virtual void setFromQuaternion(const Vector< 4, fltp08 > &quaternion)
virtual Angle< fltp08 > compassAngle() const
Definition OrientationSensor.h:116
virtual UUID calibrationID() const
Definition OrientationSensor.h:146
virtual bool requestMagnetometerCalibration(bool)
Definition OrientationSensor.h:131
Vector< 3, Angle< fltp08 > > m_tilt_angle
Definition OrientationSensor.h:157
Matrix< fltp08 > m_calibration_offset
Definition OrientationSensor.h:160
Angle< fltp08 > m_roll_lock
Definition OrientationSensor.h:165
virtual TranslatedString calibrationMessage() const
void setUserSpecifiedOffsets(const Vector< 3, Angle< fltp08 > > &user_specified_offsets)
Definition OrientationSensor.h:110
virtual MagnetometerState magnetometerState() const
Definition OrientationSensor.h:91
OrientationSensor(const Model &model, ProgressInfo *log, QObject *parent=nullptr)
virtual bool isGyroUpdating() const
Definition OrientationSensor.h:100
void setCalibrationOffset(const Matrix< fltp08 > &offset)
Vector< 3, Angle< fltp08 > > gravityAccelerationToAngle(const Vector< 3, fltp08 > &acceleration_vector)
virtual bool requestUsingAccelerometer(bool using_accelerometer)
UUID m_calibration_id
Definition OrientationSensor.h:169
virtual Time getGyroCalibrationTime() const
virtual bool requestAccelerationBiasLimit(fltp04 bias_limit)
Definition OrientationSensor.h:112
Time m_angle_drift_start_time
Definition OrientationSensor.h:162
virtual void lockYaw(bool lock_yaw, Angle< fltp08 > lock_heading=Constant< Angle< fltp08 > >::Invalid)
Vector< 3, Angle< fltp08 > > m_device_specified_offsets
Definition OrientationSensor.h:158
static Matrix< fltp08, 3, 3 > calculateDeviation(TimeSpan time, const Vector< 4, fltp08 > &start, const Vector< 4, fltp08 > &end)
virtual bool requestApplyMagnetometerCalibration()
Definition OrientationSensor.h:132
virtual bool usingCompass() const
Definition OrientationSensor.h:98
void createCalibrationOffset(const Matrix< fltp08 > &map_from, const Matrix< fltp08 > &map_to)
virtual bool supportsFixed() const
Definition OrientationSensor.h:122
Vector< 3, Angle< fltp08 > > deviceOffsets() const
Definition OrientationSensor.h:106
A light-weight base class for Log that allows processes to update, without the need for additional in...
Definition ProgressInfo.hpp:48
Definition Vertex.hpp:317
Represents a timestamp with utilities for manipulation and conversion.
Definition Time.h:54
Stores a time span, or difference between two times, with an optional start time.
Definition TimeSpan.h:46
Any text displayed to the user should be defined as a TranslatedString which allows the program to lo...
Definition TranslatedString.h:13
A universally unique identifier (UUID) is a 128-bit number used to identify information in computer s...
Definition UUID.h:60
A fixed-size array with better performance compared to dynamic containers.
Definition Vector.hpp:60
Definition ACIColor.h:37
float fltp04
Defines an alias representing a 4 byte floating-point number Bit layout is as follows: -Sign: 1 bit a...
Definition BaseValues.hpp:127
AccelerometerState
Reports the state of an accelerometer within a OrientationSensor.
Definition OrientationSensor.h:70
@ e_no_accelerometer
Definition OrientationSensor.h:71
@ e_accelerometer_invalid
Definition OrientationSensor.h:73
@ e_accelerometer_valid
Definition OrientationSensor.h:72
GyroState
Used by OrientationSensor to display the current state of any available gyro.
Definition OrientationSensor.h:43
@ e_gyro_invalid
Definition OrientationSensor.h:45
@ e_stabalizing_temp
Definition OrientationSensor.h:49
@ e_validating_drift
Definition OrientationSensor.h:51
@ e_initializing
Definition OrientationSensor.h:47
@ e_calculating_drift
Definition OrientationSensor.h:50
@ e_no_gyro
Definition OrientationSensor.h:44
@ e_needs_reset
Definition OrientationSensor.h:52
@ e_disabled
Definition OrientationSensor.h:48
@ e_gyro_valid
Definition OrientationSensor.h:46
MagnetometerState
Used by OrientationSensor to display the current state of any available magnetometer.
Definition OrientationSensor.h:60
@ e_no_compass
Definition OrientationSensor.h:61
@ e_compass_valid
Definition OrientationSensor.h:62
@ e_calculating_bias
Definition OrientationSensor.h:64
@ e_compass_invalid
Definition OrientationSensor.h:63
Defines for a given type (such as sint04, fltp08, UUID, etc) a maximum, minimum, and reserved 'invali...
Definition BaseValues.hpp:233