oculus1

annotate libovr/Src/Util/Util_MagCalibration.h @ 1:e2f9e4603129

added LibOVR and started a simple vr wrapper.
author John Tsiombikas <nuclear@member.fsf.org>
date Sat, 14 Sep 2013 16:14:59 +0300
parents
children b069a5c27388
rev   line source
nuclear@1 1 /************************************************************************************
nuclear@1 2
nuclear@1 3 PublicHeader: OVR.h
nuclear@1 4 Filename : Util_MagCalibration.h
nuclear@1 5 Content : Procedures for calibrating the magnetometer
nuclear@1 6 Created : April 16, 2013
nuclear@1 7 Authors : Steve LaValle, Andrew Reisse
nuclear@1 8
nuclear@1 9 Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved.
nuclear@1 10
nuclear@1 11 Use of this software is subject to the terms of the Oculus license
nuclear@1 12 agreement provided at the time of installation or download, or which
nuclear@1 13 otherwise accompanies this software in either electronic or hard copy form.
nuclear@1 14
nuclear@1 15 *************************************************************************************/
nuclear@1 16
nuclear@1 17 #ifndef OVR_Util_MagCalibration_h
nuclear@1 18 #define OVR_Util_MagCalibration_h
nuclear@1 19
nuclear@1 20 #include "../OVR_SensorFusion.h"
nuclear@1 21 #include "../Kernel/OVR_String.h"
nuclear@1 22 #include "../Kernel/OVR_Log.h"
nuclear@1 23
nuclear@1 24 namespace OVR { namespace Util {
nuclear@1 25
nuclear@1 26 class MagCalibration
nuclear@1 27 {
nuclear@1 28 public:
nuclear@1 29 enum MagStatus
nuclear@1 30 {
nuclear@1 31 Mag_Uninitialized = 0,
nuclear@1 32 Mag_AutoCalibrating = 1,
nuclear@1 33 Mag_ManuallyCalibrating = 2,
nuclear@1 34 Mag_Calibrated = 3
nuclear@1 35 };
nuclear@1 36
nuclear@1 37 MagCalibration() :
nuclear@1 38 Stat(Mag_Uninitialized),
nuclear@1 39 MinMagDistance(0.2f), MinQuatDistance(0.5f),
nuclear@1 40 SampleCount(0)
nuclear@1 41 {
nuclear@1 42 MinMagDistanceSq = MinMagDistance * MinMagDistance;
nuclear@1 43 MinQuatDistanceSq = MinQuatDistance * MinQuatDistance;
nuclear@1 44 MinMagValues = Vector3f(10000.0f,10000.0f,10000.0f);
nuclear@1 45 MaxMagValues = Vector3f(-10000.0f,-10000.0f,-10000.0f);
nuclear@1 46 MinQuatValues = Quatf(1.0f,1.0f,1.0f,1.0f);
nuclear@1 47 MaxQuatValues = Quatf(0.0f,0.0f,0.0f,0.0f);
nuclear@1 48 }
nuclear@1 49
nuclear@1 50 // Methods that are useful for either auto or manual calibration
nuclear@1 51 bool IsUnitialized() const { return Stat == Mag_Uninitialized; }
nuclear@1 52 bool IsCalibrated() const { return Stat == Mag_Calibrated; }
nuclear@1 53 int NumberOfSamples() const { return SampleCount; }
nuclear@1 54 int RequiredSampleCount() const { return 4; }
nuclear@1 55 void AbortCalibration()
nuclear@1 56 {
nuclear@1 57 Stat = Mag_Uninitialized;
nuclear@1 58 SampleCount = 0;
nuclear@1 59 }
nuclear@1 60
nuclear@1 61 void ClearCalibration(SensorFusion& sf)
nuclear@1 62 {
nuclear@1 63 Stat = Mag_Uninitialized;
nuclear@1 64 SampleCount = 0;
nuclear@1 65 sf.ClearMagCalibration();
nuclear@1 66 };
nuclear@1 67
nuclear@1 68 // Methods for automatic magnetometer calibration
nuclear@1 69 void BeginAutoCalibration(SensorFusion& sf);
nuclear@1 70 unsigned UpdateAutoCalibration(SensorFusion& sf);
nuclear@1 71 bool IsAutoCalibrating() const { return Stat == Mag_AutoCalibrating; }
nuclear@1 72
nuclear@1 73 // Methods for building a manual (user-guided) calibraton procedure
nuclear@1 74 void BeginManualCalibration(SensorFusion& sf);
nuclear@1 75 bool IsAcceptableSample(const Quatf& q, const Vector3f& m);
nuclear@1 76 bool InsertIfAcceptable(const Quatf& q, const Vector3f& m);
nuclear@1 77 // Returns true if successful, requiring that SampleCount = 4
nuclear@1 78 bool SetCalibration(SensorFusion& sf);
nuclear@1 79 bool IsManuallyCalibrating() const { return Stat == Mag_ManuallyCalibrating; }
nuclear@1 80
nuclear@1 81 // This is the minimum acceptable distance (Euclidean) between raw
nuclear@1 82 // magnetometer values to be acceptable for usage in calibration.
nuclear@1 83 void SetMinMagDistance(float dist)
nuclear@1 84 {
nuclear@1 85 MinMagDistance = dist;
nuclear@1 86 MinMagDistanceSq = MinMagDistance * MinMagDistance;
nuclear@1 87 }
nuclear@1 88
nuclear@1 89 // The minimum acceptable distance (4D Euclidean) between orientations
nuclear@1 90 // to be acceptable for calibration usage.
nuclear@1 91 void SetMinQuatDistance(float dist)
nuclear@1 92 {
nuclear@1 93 MinQuatDistance = dist;
nuclear@1 94 MinQuatDistanceSq = MinQuatDistance * MinQuatDistance;
nuclear@1 95 }
nuclear@1 96
nuclear@1 97 // A result of the calibration, which is the center of a sphere that
nuclear@1 98 // roughly approximates the magnetometer data.
nuclear@1 99 Vector3f GetMagCenter() const { return MagCenter; }
nuclear@1 100 // Retrieves the full magnetometer calibration matrix
nuclear@1 101 Matrix4f GetMagCalibration() const;
nuclear@1 102 // Retrieves the range of each quaternion term during calibration
nuclear@1 103 Quatf GetCalibrationQuatSpread() const { return QuatSpread; }
nuclear@1 104 // Retrieves the range of each magnetometer term during calibration
nuclear@1 105 Vector3f GetCalibrationMagSpread() const { return MagSpread; }
nuclear@1 106
nuclear@1 107 private:
nuclear@1 108 // Determine the unique sphere through 4 non-coplanar points
nuclear@1 109 Vector3f CalculateSphereCenter(const Vector3f& p1, const Vector3f& p2,
nuclear@1 110 const Vector3f& p3, const Vector3f& p4);
nuclear@1 111
nuclear@1 112 // Distance from p4 to the nearest point on a plane through p1, p2, p3
nuclear@1 113 float PointToPlaneDistance(const Vector3f& p1, const Vector3f& p2,
nuclear@1 114 const Vector3f& p3, const Vector3f& p4);
nuclear@1 115
nuclear@1 116 Vector3f MagCenter;
nuclear@1 117 unsigned Stat;
nuclear@1 118 float MinMagDistance;
nuclear@1 119 float MinQuatDistance;
nuclear@1 120 float MinMagDistanceSq;
nuclear@1 121 float MinQuatDistanceSq;
nuclear@1 122 // For gathering statistics during calibration
nuclear@1 123 Vector3f MinMagValues;
nuclear@1 124 Vector3f MaxMagValues;
nuclear@1 125 Vector3f MagSpread;
nuclear@1 126 Quatf MinQuatValues;
nuclear@1 127 Quatf MaxQuatValues;
nuclear@1 128 Quatf QuatSpread;
nuclear@1 129
nuclear@1 130 unsigned SampleCount;
nuclear@1 131 Vector3f MagSamples[4];
nuclear@1 132 Quatf QuatSamples[4];
nuclear@1 133
nuclear@1 134 };
nuclear@1 135
nuclear@1 136 }}
nuclear@1 137
nuclear@1 138 #endif