Patent Publication Number: US-9851204-B2

Title: Magnetormeter calibration for navigation assistance

Description:
CROSS-REFERENCE TO RELATED APPLICATION 
     This Application is a Continuation-in-Part and claims priority to U.S. patent application Ser. No. 13/571,501 filed Aug. 10, 2012, which claims priority to U.S. Provisional Patent Application No. 61/522,112 filed on Aug. 10, 2011 which is hereby incorporated herein by reference. 
    
    
     BACKGROUND 
     Many applications for smartphones use location information. Many smartphones include a global navigation satellite system (GNSS) such as the global positioning system (GPS). In an indoor environment, GNSS solutions do not always function accurately due to heavy attenuation of the satellite signals. Alternatives are available to GNSS such as sensor-based navigation and WiFi-based positioning. 
     Sensor-based solutions may include a micro-electrical-mechanical system (MEMS) sensor such as an accelerometer, an electronic compass (e-compass), gyroscope, etc. An issue in sensor-based solutions is sensor calibration. Sensors provide only user-displacement information, not absolute location. Thus, an initial position is required. The sensor can be used to determine position from that point forward as the smartphone becomes mobile. Measurement errors, however, eventually render the position determined from a sensor inaccurate. 
     Magnetometers are commonly included in consumer electronic devices to enable navigation or other applications. The magnetometer&#39;s measurements are only useful when they are calibrated. Typically, when the user wants to use an application that requires the magnetometer, the device instructs the user to perform a calibration maneuver. This can be confusing and tedious, which devalues the use of the magnetometer. 
     The prior art developed an error model for the magnetometer and describes a least-squares estimator for the calibration parameters. The least-squares estimator requires a reasonably accurate initial guess that is obtained via an algorithm. Another valuable contribution from the prior art is that a covariance of the estimate is provided. A more generalized parameter estimator in a concise form has been developed as was a similar magnetometer error model and an even more generalized calibration parameter estimator. 
     SUMMARY 
     In some embodiments, a system includes an imaging device, a barometric pressure sensor, and a processor coupled to the imaging device and the pressure sensor. The processor causes the imaging device to scan a visual code. Based on scanning the visual code, the processor obtains a first value indicative of height of the visual code from the visual code and obtains a first barometric pressure reading from the pressure sensor. After scanning the visual code, the processor uses the first value indicative of height of the visual code and the first barometric pressure reading to determine a height of the system. 
     A corresponding method includes initiating scanning of a visual code and obtaining a first value indicative of height of the visual code from the visual code. The method further includes obtaining a first barometric pressure reading from a barometric pressure sensor. From a second height, a second barometric pressure reading is obtained from the barometric pressure sensor. The method includes computing a second value indicative of height based on the second barometric pressure reading, the first value indicative of the height of the visual code, and a rate of change of pressure with respect to height. 
     In other embodiments, a system includes an imaging device, an e-compass, an accelerometer, and a processor coupled to the imaging device, the e-compass, and the accelerometer. The processor causes the imaging device to scan a visual code, read a yaw angle from the QR code, and compute an estimate of a yaw angle based on magnetic field measurements taken by the e-compass and scale factors and biases determined by the e-compass. Based on scanning the visual code, the processor computes a quality factor based on the yaw angle read from the visual code and the estimate of the yaw angle. The processor determines whether the e-compass is satisfactorily calibrated based on the quality factor. 
     A corresponding method of calibrating an e-compass includes scanning a visual code, reading yaw angle from visual code, and computing an estimate of yaw angle based on magnetic field measurements, scale factors, and biases from the e-compass. The method further includes computing a quality factor based on the yaw angle read from the visual code the estimate of the yaw angle and determining whether calibration of the e-compass is acceptable based on the quality factor. 
     Other embodiments are directed to a system including an imaging device, a gyroscope, and a processor coupled to the imaging device and the gyroscope. The processor causes the imaging device to scan a visual code and, based on scanning the visual code, the processor causes the gyroscope to be calibrated. 
     A corresponding method includes initiating scanning using a digital image device, detecting the presence of a visual code, and based on detecting the visual code, calibrating a gyroscope. 
    
    
     
       BRIEF DESCRIPTION OF THE DRAWINGS 
         FIG. 1  shows a system in accordance with various implementations; 
         FIG. 2  shows a method of calibrating a gyroscope based on scanning a visual code such as a Quick Response (QR) code in accordance with various implementations; 
         FIG. 3  shows a method of calibrating an e-compass based on scanning a visual code in accordance with various implementations; 
         FIG. 4  shows a more specific implementation of a method of calibrating an e-compass based on scanning a visual code; 
         FIG. 5  illustrates the relationship between barometric pressure and height; and 
         FIG. 6  shows a method of calibrating a barometric pressure sensor based on scanning a visual code in accordance with various implementations. 
     
    
    
     DETAILED DESCRIPTION 
     The following discussion is directed to various embodiments of the invention. Although one or more of these embodiments may be preferred, the embodiments disclosed should not be interpreted, or otherwise used, as limiting the scope of the disclosure, including the claims. In addition, one skilled in the art will understand that the following description has broad application, and the discussion of any embodiment is meant only to be exemplary of that embodiment, and not intended to intimate that the scope of the disclosure, including the claims, is limited to that embodiment. 
     All the existing calibration parameter estimators require that the user perform a calibration maneuver. An assisted magnetometer calibration, where the algorithm is given the magnitude of the magnetic field and the initial yaw angle is described. The embodiments provide methods which estimate the calibration parameters using this extra information, and show that it reduces dramatically the complexity of the required calibration maneuver. Since simpler calibration maneuvers are sufficient, the embodiments enable some new magnetometer calibration applications. Factory calibration may be implemented with less cost, calibration of magnetometers in vehicles (or pedestrian applications) may be done opportunistically when the initial yaw is available (from GPS for example). 
     The term “visual code” refers to any type of graphic depiction that encodes information such as the information described herein. An example of a visual code is a Quick Response (QR). A QR code is a specific matrix barcode (or two-dimensional code) that is readable by QR barcode readers and camera telephones. The code includes black modules arranged in a square pattern on a white background. These and other visual features enable the code to be detected by a digital camera during as scan. The information encoded may be text, a uniform resource locator (URL), or other data such as the data described below for navigation assistance. Micro codes and Microsoft tags can also be used. 
     If the visual code is encoded with the coordinates of the code&#39;s location, then the sensor solution can provide displacement from that point. Coordinates could be in latitude, longitude, and altitude or in any other coordinate system. Coordinates on a specific map are possible. Coordinates could contain the level or floor in the building or altitude where the QR code is located. 
       FIG. 1  shows an example of a system  100  which provides navigation assistance. The system  100  may include a GNSS module (e.g., GPS)  118  for which the system provides navigation assistance when, for example, the GNSS module  118  is not adequate (e.g., inside a building). The illustrative system  100  as shown includes a processor  102  coupled to a non-transitory storage device  104 , an e-compass  108 , a gyroscope (“gyro” for short)  110 , a barometric pressure sensor  112 , a digital imaging device  114 , a wireless transceiver  116 , an accelerometer  117 , and the GNSS module  118 . Other implementations of system  100  may have additional or different components to that shown in  FIG. 1 . In some implementations, not all of the components shown in Figure are included. 
     The e-compass  108  is any suitable type of magnetic field sensors. Examples include triaxis anisotropic magnetoresistive (AMR) sensors. The gyro  110  also may be a multi-axis (e.g., 3-axis) device in some embodiments. The barometric pressure sensor  112  is a sensor that generates a signal based on the sensed barometric pressure. 
     The digital imaging device  114  may include a charge-coupled device (CCD) to acquire digital images, and provide such images to the processor  102  for further processing in accordance with software  106 . The digital imaging device  114  may be a digital camera. The digital imaging device  114  may be used to scan visual codes as explained below for navigation assistance. 
     The accelerometer  117  preferably is a three-axis accelerometer. 
     The non-transitory storage device  104  is any suitable type of volatile storage (e.g., random access memory), non-volatile storage (e.g., hard disk, solid state storage, optical storage, read-only memory, etc.), or combinations thereof. The storage device  104  contains software  106  which is executable by processor  102  to impart the system  100  with some or all of the functionality described herein. 
     The system  100  may be a portable device such as a smartphone or any other type of mobile device. 
     The quality of a navigation solution which uses sensors depends on the type of sensors used. Low cost MEMS sensors, such as those found in PND and smart-phones, may drift over-time and hence continuous re-calibration of the sensor outputs is helpful. Calibration of such sensors may be performed based on comparison of the sensor outputs with positional information derived from an external reference e.g. imaging of a visual code or detection of an external event (e.g. stationarity detection). 
     As explained below, the system  100  of claim  1  may be used to calibrate the gyro  110 , calibrate the e-compass  108 , and calibrate the barometric pressure sensor  112 . 
     Gyro Calibration 
     Gyroscope calibration is optimal when the user holds the system  100  stationary for a period of time. Because the user necessarily must hold the system  100  relatively stationary to scan the visual image, in accordance with preferred embodiments, scanning and detecting a visual code triggers the processor  102  to cause the gyro to begin a calibration process. The user preferably holds the system (and the digital imaging device  114  in particular) to the visual code for some time to enable the system to read the image. When the digital imaging device  114  and processor  102  recognize the presence of a visual code, the processor  102  preferably initiates gyro calibration as there will be a short moment in which the system is stationary. As such, the recognition of the visual code triggers gyro calibration. Even if the visual code does not contain location information, at least the gyro  110  nevertheless is calibrated. Once the gyro  110  is calibrated it can reliably track relative movements of the phone for a period of time. 
     Calibrating the gyro  110  may include averaging the output of the gyro corresponding to each axis of the gyro during an interval when the phone is stationary (e.g., during scanning of a visual code). The computed averages represent the gyro biases. Subsequently, new gyro measurements can be calibrated by subtracting these biases from such new measurements. The biases may be dependent on the temperature of the gyro  110 . A temperature sensor  111  may be provided on or near the gyro to record the gyro&#39;s temperature when requested by the processor. The processor  102  may store the biases determined at various gyro temperatures in the non-volatile storage device  104 . 
     In some embodiments, the visual code is encoded with position and heading values that are read by the system  100  via the digital imaging device  114 . The position value indicates the location of the visual code. Examples of a position value include longitude and latitude, coordinates on a map, etc. Heading values indicate the direction that the system  100  is necessarily pointing upon scanning the visual code. An example of a heading value is “due east” and the like. If the visual code encodes the heading that the system  100  is pointing in addition to the position (i.e., location) of the system, then the gyro  114  can accurately track changes in the system&#39;s position and heading for some time afterwards depending on the quality of the gyro. 
       FIG. 2  illustrates a method  120  pertaining to gyro calibration. The various operations may be performed or caused to be performed by the processor  102  executing software  106  in combination with the gyro  110 . At  122 , the method includes initiating a scan of using the digital imaging device  114 . At  124 , the processor  102  may detect the presence of a visual code in the digital images acquired by the digital imaging device  114 . Based on detecting the presence of a visual code, the processor  102  initiates a gyro calibration process to occur ( 126 ). 
     E-Compass Calibration 
     When the user holds the smart phone camera towards the visual code, the phone will necessarily be pointing in a specific direction. If the visual code is encoded with the direction, the direction information may be used to assist with calibration of the e-compass. 
     By way of background, the equations that describe e-compass calibration may be as follows: 
     
       
         
           
             
               
                 
                   
                     [ 
                     
                       
                         
                           
                             
                               V 
                               x 
                             
                             ⁡ 
                             
                               ( 
                               t 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               V 
                               y 
                             
                             ⁡ 
                             
                               ( 
                               t 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               V 
                               z 
                             
                             ⁡ 
                             
                               ( 
                               t 
                               ) 
                             
                           
                         
                       
                     
                     ] 
                   
                   = 
                   
                     
                       
                         [ 
                         
                           
                             
                               
                                 α 
                                 x 
                               
                             
                             
                               
                                 s 
                                 xy 
                               
                             
                             
                               
                                 s 
                                 xz 
                               
                             
                           
                           
                             
                               
                                 s 
                                 xy 
                               
                             
                             
                               
                                 α 
                                 y 
                               
                             
                             
                               
                                 s 
                                 yz 
                               
                             
                           
                           
                             
                               
                                 s 
                                 xz 
                               
                             
                             
                               
                                 s 
                                 yz 
                               
                             
                             
                               
                                 α 
                                 z 
                               
                             
                           
                         
                         ] 
                       
                       ⁡ 
                       
                         [ 
                         
                           
                             
                               
                                 
                                   h 
                                   x 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   t 
                                   ) 
                                 
                               
                             
                           
                           
                             
                               
                                 
                                   h 
                                   y 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   t 
                                   ) 
                                 
                               
                             
                           
                           
                             
                               
                                 
                                   h 
                                   z 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   t 
                                   ) 
                                 
                               
                             
                           
                         
                         ] 
                       
                     
                     + 
                     
                       [ 
                       
                         
                           
                             
                               β 
                               x 
                             
                           
                         
                         
                           
                             
                               β 
                               y 
                             
                           
                         
                         
                           
                             
                               β 
                               z 
                             
                           
                         
                       
                       ] 
                     
                     + 
                     
                       [ 
                       
                         
                           
                             
                               ɛ 
                               x 
                             
                           
                         
                         
                           
                             
                               ɛ 
                               y 
                             
                           
                         
                         
                           
                             
                               ɛ 
                               z 
                             
                           
                         
                       
                       ] 
                     
                   
                 
               
               
                 
                   ( 
                   1 
                   ) 
                 
               
             
           
         
       
     
     Using vector notation:
 
 {right arrow over (V)} ( t )= A·{right arrow over (h)} ( t )+{right arrow over (β)}+{right arrow over (ε)}  (2)
 
     where {right arrow over (V)}(t) is the sensor outputs at time t, A is the matrix of scale factors, {right arrow over (h)}(t) is the vector of the magnetic field that is being measured at time t, {right arrow over (β)} is the vector of biases, and {right arrow over (ε)} is the vector of residual errors. 
     The norm of the magnetic field in a given location without magnetic interference is constant. This fact is exploited to calibrate the e-compass. In other words, it is known that for all times:
 
 H   2   =h   x   2 ( t )+ h   y   2 ( t )+ h   z   2 ( t )  (3)
 
     The e-compass calibration should solve for the 9 parameters in A and {right arrow over (β)}. In some cases it can be assumed that the off-diagonal elements of A are zero so that there are only 6 parameters to be computed. 
     Once calibration is complete the estimate of the magnetic field is given by: 
     
       
         
           
             
               
                 
                   
                     
                       h 
                       ^ 
                     
                     ⁡ 
                     
                       ( 
                       t 
                       ) 
                     
                   
                   = 
                   
                     
                       [ 
                       
                         
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 x 
                               
                               ⁡ 
                               
                                 ( 
                                 t 
                                 ) 
                               
                             
                           
                         
                         
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 y 
                               
                               ⁡ 
                               
                                 ( 
                                 t 
                                 ) 
                               
                             
                           
                         
                         
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 z 
                               
                               ⁡ 
                               
                                 ( 
                                 t 
                                 ) 
                               
                             
                           
                         
                       
                       ] 
                     
                     = 
                     
                       
                         
                           ( 
                           
                             
                               A 
                               T 
                             
                             ⁢ 
                             
                                 
                             
                             ⁢ 
                             A 
                           
                           ) 
                         
                         
                           - 
                           1 
                         
                       
                       ⁢ 
                       
                         ( 
                         
                           
                             
                               V 
                               ⇀ 
                             
                             ⁡ 
                             
                               ( 
                               t 
                               ) 
                             
                           
                           - 
                           
                             β 
                             ⇀ 
                           
                         
                         ) 
                       
                     
                   
                 
               
               
                 
                   ( 
                   4 
                   ) 
                 
               
             
           
         
       
     
     Without loss of generality (because a rotation matrix can always be applied), assume that the system  100  is oriented so that, for example, its x-axis is pointed towards the visual code, the z-axis is pointing up, and the y-axis is pointing left. While the system  100  is stationary (e.g., scanning a visual code), the processor obtains accelerometer readings from the accelerometer  117  to determine two of the three orientation angles (e.g., pitch and roll). The third angle (yaw) is known because the camera is facing the visual code being scanned. In addition, the digital imaging device  114  may measure the orientation of the visual code relative to the imaging device  114  to more accurately estimate these angles. Once pitch, roll, and yaw are known, a rotation matrix preferably is applied such that the system  100  has an assumed orientation, in this case the yaw angle φ(t) and the residual rotation angle θ(t) should have known values: 
                       φ   ^     ⁡     (   t   )       =       arc   ⁢           ⁢     tan   (           h   ^     y     ⁡     (   t   )             h   ^     x     ⁡     (   t   )         )       =   φ             (   5   )                 θ   ⁡     (   t   )       =       arc   ⁢           ⁢     tan   (               h   ^     x   2     ⁡     (   t   )       +         h   ^     y   2     ⁡     (   t   )                 h   ^     z     ⁡     (   t   )         )       =   0             (   6   )               
where these angles are defined as spherical coordinates, and where the yaw angle φ is the angle in the horizontal plane between the x-axis and magnetic North. There are two possible ways to use these angles, as will be explained below in greater detail:
         1. Use |θ(t)| and |φ(t)−φ| to determine the quality of the e-compass calibration.   2. Perform a grid search to find the calibration parameters that minimize |θ(t)| and |θ(t)−φ| to thereby to correct the calibration of the e-compass. A global search can be performed for the calibration parameters in some embodiments, but in other embodiments, the search is performed around the calibration parameters already computed using a technique such as the one above.       

     The image code may also be encoded with the true magnetic field measurements at its location. In other words, the image code can provide the true value of {right arrow over (h)}={right arrow over (h)}(t) when the system  100  is at a certain orientation relative to the image code. This provides three additional equations that can be used during the calibration by equating ĥ(t) and {right arrow over (h)} for the time t when the phone was held in front of the image code. 
     Generally, e-compass calibration requires that the system  100  be rotated in all directions in order to solve the system of equations given above. Knowing {right arrow over (h)}={right arrow over (h)}(t) at a given point can help relax this requirement, but measurements from multiple orientations are still required. After holding the system  100  up to the image code for scanning purposes, the user will typically bring it back down—this motion rotates the system  100 . During this rotation the e-compass  108  may collect data for calibration. Recognizing an image code therefore preferably triggers an e-compass calibration. To further improve the calibration, the recognition of the image code preferably triggers the system to inform the user to perform a calibration maneuver such as spinning the system. 
     Furthermore, after reading the image code and calibrating the gyro  110 , the gyro can provide accurate estimates of the rotations of the phone for some time. This means at a given instant the tilt, pitch and roll angles are known by integrating the angular rate measurements from the gyro and adding them to the initial angles from when the system  100  was in front of the image code. This effectively provides the true values of φ(t) and θ(t) at different times, which makes the e-compass calibration easier. The yaw, pitch, and roll can be defined respectively as: 
                       tan   ⁡     (     φ   ⁡     (   t   )       )       =         h   y     ⁡     (   t   )           h   x     ⁡     (   t   )           ,           (   7   )                   tan   ⁡     (     ϕ   ⁡     (   t   )       )       =         h   z     ⁡     (   t   )           h   z     ⁡     (   t   )           ,           (   8   )                 tan   ⁡     (     γ   ⁡     (   t   )       )       =           h   x     ⁡     (   t   )           h   z     ⁡     (   t   )         .             (   9   )               
Assuming that while the digital imaging device  114  is held in front of the image code at time zero, the angles are φ(0)=φ, φ(0)=0, and γ(0)=0. Then the estimated angles at a future time t are:
 
                 φ   ⁡     (   t   )       =       ∫   0   t     ⁢         φ   .     ⁡     (   λ   )       ⁢           ⁢   δ   ⁢           ⁢   λ         ,       ϕ   ⁡     (   t   )       =       ∫   0   t     ⁢         ϕ   .     ⁡     (   λ   )       ⁢           ⁢   δ   ⁢           ⁢   λ         ,       and   ⁢           ⁢     γ   ⁡     (   t   )         =       ∫   0   t     ⁢         γ   .     ⁡     (   λ   )       ⁢           ⁢   δ   ⁢           ⁢   λ         ,         
where the angular rates come from the calibrated gyro  110 . Knowing the values of these angles provides further constraints for the system of equations used for e-compass calibration. One way to use these constraints is to do a grid search for e-compass and/or gyro calibration parameters to minimize the difference between the yaw, pitch and roll angles estimated based on the gyro  110  and the e-compass  108  during the same time interval.
 
       FIG. 3  shows a method  130  of calibrating the e-compass  108  in accordance with some implementations. The various operations may be performed or caused to be performed by the processor  102  executing software  106  in combination with the e-compass  108 , gyro  110 , and accelerometer  117 . The operations may be performed in the order shown, or in a different order. Further, two or more of the operations may be performed in parallel rather than sequentially. 
     At  132 , the method includes initiating a scan of a visual code by a user of the system  100  (and thereby detecting the presence of the visual code itself). While scanning the code, the system  100  also reads a yaw angle from the visual code. The yaw angle read from the visual code indicates the angle of yaw of the system  100  assuming the system is facing the visual code, which would be the case during the visual code scan operation. 
     At  134 , the method includes the processor  102  computing an estimate of yaw angle based on magnetic field measurements, scale factors, and biases from the e-compass  108 . At  136 , the method includes computing a quality factor based on the yaw angle read from the visual code and the computed estimate of the yaw angle. The two yaw angles ought to be identical or relatively close to the same if the e-compass is properly calibrated. At  138 , the processor  102  determines whether the calibration of the e-compass  108  is acceptable based on the computed quality factor. 
     The visual code may also encode the magnetic declination (i.e., the angle between magnetic north and true north). The e-compass  108  calibration may also include adjusting the determination of magnetic north by the magnetic declination encoded in the visual code. For example, the magnetic declination may be added to, or subtracted from, the determination of magnetic north 
       FIG. 4  shows a more specific implementation of method  130  of  FIG. 3 . The various operations may be performed or caused to be performed by the processor  102  executing software  106  in combination with the e-compass  108 , gyro  110 , and accelerometer  117 . The operations may be performed in the order shown, or in a different order. Further, two or more of the operations may be performed in parallel rather than sequentially. 
     At  140 , the method includes initiating a scan of a visual code by a user of the system  100  (and thereby detecting the presence of the visual code itself). At that time, the system  100  also reads a yaw angle from the visual code. The yaw angle read from the visual code indicates the angle of yaw of the system  100  assuming the system is facing the visual code, which would be the case during the visual code scan operation. 
     At  142 , the processor  102  obtains measurements from the e-compass  108  and buffers those measurements in, for example, the non-volatile storage device  104 . The buffered e-compass measurements are {right arrow over (V)}(t) as described above. The scanning of the visual code also causes the processor to calibrate the gyro  110  ( 144 ). Because the system  100  presumably is held stationary to image the visual code, visual code scanning is an excellent time to calibrate the gyro  110 . Gyro calibration reduces or eliminates offset in the readings from the gyro. Gyro calibration averages out the gyro biases. 
     At  146 , pitch and roll are estimated based on readings from the accelerometer  117 . The processor  102  computes the average of the values from each axis of the multi-axis (preferably three-axis) accelerometer  117 . The average is computed of samples from a window in time when the system  100  is approximately stationary, such as during visual code scanning. The average, for example, of the accelerometer&#39;s x-axis readings is computed as: 
                       a   _     x     =       1   N     ⁢       ∑   i     ⁢           ⁢       a   x     ⁡     (   i   )                   (   10   )               
where i is the i-th sample in time, and N is the number of samples in the average. Similar computations are made for the y and z axes of the accelerometer as well. This creates the vector ā=└ā x  ā y  ā z ┘. The processor then computes a unit vector:
 
     
       
         
           
             
               
                 
                   
                     a 
                     ~ 
                   
                   = 
                   
                     
                       
                         a 
                         _ 
                       
                       
                          
                         
                           a 
                           _ 
                         
                          
                       
                     
                     . 
                   
                 
               
               
                 
                   ( 
                   11 
                   ) 
                 
               
             
           
         
       
     
     The processor  102  computes pitch as p=−sin −1 (ã x ) and roll as r=a tan 2(ã y ,ã z ). Roll and pitch matrices are then determined to be: 
     
       
         
           
             
               
                 
                   R 
                   = 
                   
                     
                       [ 
                       
                         
                           
                             1 
                           
                           
                             0 
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 r 
                                 ) 
                               
                             
                           
                           
                             
                               sin 
                               ⁡ 
                               
                                 ( 
                                 r 
                                 ) 
                               
                             
                           
                         
                         
                           
                             0 
                           
                           
                             
                               - 
                               
                                 sin 
                                 ⁡ 
                                 
                                   ( 
                                   r 
                                   ) 
                                 
                               
                             
                           
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 r 
                                 ) 
                               
                             
                           
                         
                       
                       ] 
                     
                     . 
                   
                 
               
               
                 
                   ( 
                   12 
                   ) 
                 
               
             
             
               
                 
                   P 
                   = 
                   
                     
                       [ 
                       
                         
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 p 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             
                               - 
                               
                                 sin 
                                 ⁡ 
                                 
                                   ( 
                                   p 
                                   ) 
                                 
                               
                             
                           
                         
                         
                           
                             0 
                           
                           
                             1 
                           
                           
                             0 
                           
                         
                         
                           
                             
                               sin 
                               ⁡ 
                               
                                 ( 
                                 p 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 p 
                                 ) 
                               
                             
                           
                         
                       
                       ] 
                     
                     . 
                   
                 
               
               
                 
                   ( 
                   13 
                   ) 
                 
               
             
           
         
       
     
     At  148  in  FIG. 4 , if A and {right arrow over (β)} are available from a prior e-compass calibration, then at  150 , the processor computes ĥ(t) based on {right arrow over (β)}, A and {right arrow over (V)}(t). The computation of ĥ(t) may be made using equation (4) above. 
     Detilting is performed in operation  152 . Detilting maps the orientation of the system  100  from its current orientation during visual image scanning to a predetermined orientation. A technique for performing detilting includes computing {tilde over (h)}(t)=P T R T ĥ(t), where the R and P matrices are provided above at (12) and (13), respectively. The values {tilde over (h)}(t) represents the detilted estimate of the magnetic field. 
     At  154 , the processor computes an estimate of the yaw angle ({circumflex over (φ)}(t)) based on {tilde over (h)}(t). Specifically, {circumflex over (φ)}(t) may be computed as: 
     
       
         
           
             
               
                 
                   
                     
                       φ 
                       ^ 
                     
                     ⁡ 
                     
                       ( 
                       t 
                       ) 
                     
                   
                   = 
                   
                     arc 
                     ⁢ 
                     
                         
                     
                     ⁢ 
                     
                       tan 
                       ( 
                       
                         
                           
                             
                               h 
                               ~ 
                             
                             y 
                           
                           ⁡ 
                           
                             ( 
                             t 
                             ) 
                           
                         
                         
                           
                             
                               h 
                               ~ 
                             
                             x 
                           
                           ⁡ 
                           
                             ( 
                             t 
                             ) 
                           
                         
                       
                       ) 
                     
                   
                 
               
               
                 
                   ( 
                   14 
                   ) 
                 
               
             
           
         
       
     
     At this point, an estimate of the yaw angle of the system  100  has been computed based on equation (14) and a yaw angle has been read from the visual code. If the e-compass  108  is in proper calibration, the two yaw angles should be approximately identical. 
     At  156 , a residual rotation angle (θ(t)) is computed based on {tilde over (h)}(t). The residual rotation angle θ(t) may be computed as: 
                     θ   ⁡     (   t   )       =     arc   ⁢           ⁢     tan   (               h   ~     x   2     ⁡     (   t   )       +         h   ~     y   2     ⁡     (   t   )                 h   ~     z     ⁡     (   t   )         )               (   15   )               
For an e-compass in proper calibration, the residual rotation angle θ(t) should be approximately 0.
 
     In accordance with the various embodiments, a quality factor is computed by the processor (operation  158 ). In some embodiments, the quality factor (Q(t)) is computed as Q(t)=|{circumflex over (φ)}(t)−φ|, while in other embodiments, the quality factor is computed as Q(t)=√{square root over (|{circumflex over (φ)}(t)−φ| 2 +(t))}. The former quality factor is the absolute value of the difference between the computed estimate of the yaw angle and the yaw angle read from the visual code. The latter quality factor is the square root of the sum of the square of two values. The first value is the square of the absolute value of the difference between the computed estimate of the yaw angle and the yaw angle read from the visual code. The second value is the square of the residual rotation angle θ(t). 
     For either quality factor, the quality factor should be approximately zero for an e-compass that is in proper calibration. At  160 , the processor  102  compares the quality factor to a predetermined (preferably low) threshold to determine if the quality factor is below the threshold, thereby indicating proper calibration ( 162 ). 
     If the quality factor θ(t) is above the threshold (indicating improper e-compass calibration), then operations  164  and  166  may be performed to correct the calibration of the e-compass. Operations  164  and  166  are also performed if neither A nor {right arrow over (β)} were available as determined at operation  148 . At  164 , the processor re-computes the quality factor using other values of A and {right arrow over (β)}, and at  166 , the values of A and {right arrow over (β)} that resulted in the best (e.g., lowest) quality factor are chosen for use by the e-compass from that point on. In some implementations and as explained above, a global search can be performed for new values of A and {right arrow over (β)} to use but performing a search around the values of A and {right arrow over (β)} already computed by thee-compass is more efficient. 
     Barometer Calibration 
     The system  100  of  FIG. 1  also can be used to calibrate a barometric pressure sensor  112  if the system includes such a sensor. Barometric pressure sensors can be used to determine altitude or the floor of a building at which the system containing the sensor is located.  FIG. 5  illustrates the relationship  170  between barometric pressure and height—lower pressure at higher elevations (floors) and higher pressure at lower elevations (floors). 
     In some embodiments, a visual code is encoded with an altitude or floor number at which the code is located. For example, if the visual code is located at height H VC  (the subscript VC indicating the height of the visual code), the height H VC  of the visual code is encoded into the visual code. The system  100  uses the digital imaging device  114  to scan the code and read the height H VC . During the scanning operation, the processor  102  also may acquire a barometric pressure reading from the system&#39;s barometric pressure sensor  112  (P VC ). 
     The system  100  (e.g., the software  106 ) may be programmed with a mathematical relationship between pressure and height such as the following: 
                     H   NEW     =       H   VC     -     (         P   NEW     -     P   VC         Δ   ⁢           ⁢   P   ⁢     /     ⁢   FLOOR       )               (   16   )               
where H NEW  is the system&#39;s new height to be determined, P NEW  is the barometric pressure reading taken from the system&#39;s barometric pressure sensor  112  at the new height, and ΔP/FLOOR indicates the change in pressure for each floor of a building. For this computation, it may be assumed that each floor of a building is approximately the same height (e.g., 10 feet per floor). The new height presumable is different than the height HVC of the visual code but it could be the same. The change in pressure per floor of a building may be encoded into the visual code itself and read by the digital imaging device  114  of the system  100  or may be pre-programmed into the system. Further, the relationship between pressure and floors of a building may instead indicate the relationship between pressure altitude measured in, for example, feet above/below sea level.
 
     Referring to equation (16), the values of H VC , P VC , and ΔP/FLOOR are known. To determine the floor number (or altitude) of the system, the processor causes the barometric pressure sensor  112  to report a barometric pressure reading which the processor  102  inserts into equation (16) as P NEW  to compute H NEW  (the system&#39;s current floor/altitude). 
       FIG. 6  shows a method of calibrating the barometric pressure sensor  112 . The various operations may be performed or caused to be performed by the processor  102  executing software  106  in combination with the barometric pressure sensor  112 . The operations may be performed in the order shown, or in a different order. Further, two or more of the operations may be performed in parallel rather than sequentially. 
     At  182 , the method includes initiating a scan of a visual code by a user of the system  100 . At  184 , the method includes obtaining a first value indicative of the height (e.g., floor number, altitude, etc.) of the visual code from the visual code. 
     At  186 , the method further includes obtaining a first barometric pressure reading from the barometric pressure sensor  112  while scanning the visual code. Thus, scanning the visual code causes the processor to obtain a pressure reading. At that point, the system has values of the height of the visual code and the barometric pressure at that height, which the system can use in equation (16) as explained above. 
     At  188 , the system has been moved to a different height. For example, the user of the system may have moved to a different floor in a building. The method includes the processor obtaining a second barometric pressure reading at the new height. The values are all used in equation (16) and the system computes (at  190 ) a second value indicative of height based on the second barometric pressure reading, the first value indicative of the height of the visual code, and the rate of change of pressure with respect to height (e.g., floor). 
     Magnetometer Sensor 
     The main value of the magnetometer sensor is to determine the relative orientation of the sensors to the local frame of reference. Following is the framework and background for how this is achieved. The local frame of reference is defined as having the x and y axes lie on the horizontal plane with the x axis pointing East, the y axis pointing North, and the z-axis pointing up. This is commonly referred to as the ENU coordinate system. The Earth&#39;s magnetic field vector lies in the magnetic frame which is a not aligned with either the sensor frame or local frame of reference. 
     Throughput the application, the vector subscripts identify the frame of reference within which the vector is defined. L=Local frame (ENU), M=magnetic frame, and S=sensor frame. 
     A. Converting from Local Frame to Sensor Frame 
     Φ L   S  is the matrix that can translate measurements in the local frame into the sensor frame of reference as a product of 3 matrices which each represent an angular rotation around one of the axes:
 
Φ L   S ( r,p,y )= R ( r ) P ( p ) Y ( y ),  (17)
 
where R(r) is the roll matrix, P(p) is the pitch matrix, and Y(y) is the yaw matrix as defined below. The angle around the x-axis r, the angle around the y-axis p, and the angle around the z-axis y (y standing for yaw):
 
     
       
         
           
             
               
                 
                   
                     R 
                     ⁡ 
                     
                       ( 
                       r 
                       ) 
                     
                   
                   = 
                   
                     ( 
                     
                       
                         
                           1 
                         
                         
                           0 
                         
                         
                           0 
                         
                       
                       
                         
                           0 
                         
                         
                           
                             cos 
                             ⁡ 
                             
                               ( 
                               r 
                               ) 
                             
                           
                         
                         
                           
                             - 
                             
                               sin 
                               ⁡ 
                               
                                 ( 
                                 r 
                                 ) 
                               
                             
                           
                         
                       
                       
                         
                           0 
                         
                         
                           
                             sin 
                             ⁡ 
                             
                               ( 
                               r 
                               ) 
                             
                           
                         
                         
                           
                             cos 
                             ⁡ 
                             
                               ( 
                               r 
                               ) 
                             
                           
                         
                       
                     
                     ) 
                   
                 
               
               
                 
                   ( 
                   18 
                   ) 
                 
               
             
             
               
                 
                   
                     P 
                     ⁡ 
                     
                       ( 
                       p 
                       ) 
                     
                   
                   = 
                   
                     ( 
                     
                       
                         
                           
                             cos 
                             ⁡ 
                             
                               ( 
                               p 
                               ) 
                             
                           
                         
                         
                           0 
                         
                         
                           
                             - 
                             
                               sin 
                               ⁡ 
                               
                                 ( 
                                 p 
                                 ) 
                               
                             
                           
                         
                       
                       
                         
                           0 
                         
                         
                           1 
                         
                         
                           0 
                         
                       
                       
                         
                           
                             sin 
                             ⁡ 
                             
                               ( 
                               p 
                               ) 
                             
                           
                         
                         
                           0 
                         
                         
                           
                             cos 
                             ⁡ 
                             
                               ( 
                               p 
                               ) 
                             
                           
                         
                       
                     
                     ) 
                   
                 
               
               
                 
                   ( 
                   19 
                   ) 
                 
               
             
             
               
                 
                   
                     Y 
                     ⁡ 
                     
                       ( 
                       y 
                       ) 
                     
                   
                   = 
                   
                     
                       ( 
                       
                         
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 y 
                                 ) 
                               
                             
                           
                           
                             
                               - 
                               
                                 sin 
                                 ⁡ 
                                 
                                   ( 
                                   y 
                                   ) 
                                 
                               
                             
                           
                           
                             0 
                           
                         
                         
                           
                             
                               sin 
                               ⁡ 
                               
                                 ( 
                                 y 
                                 ) 
                               
                             
                           
                           
                             
                               cos 
                               ⁡ 
                               
                                 ( 
                                 y 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                         
                       
                       ) 
                     
                     . 
                   
                 
               
               
                 
                   ( 
                   20 
                   ) 
                 
               
             
           
         
       
     
     Therefore, any unit vector in the sensor frame can be translated into the local frame via the angular rotation described by the 3 angles r, p, and y. Note that Y(y 1 )Y(y 2 )=Y(y 1 +y 2 ) and that (Y(y)) T =(Y(y)) −1 =Y(−y), likewise for R and P. 
     B. Converting from Magnetic Frame to Local Frame 
     Earth&#39;s magnetic field vector points towards Magnetic North (the y-axis in the magnetic frame), and the y-axis in the local frame points towards True North. Only two angular rotations are needed to describe the relative orientation of these two frames: the inclination and declination angles. Matrix Φ M   L  may translate measurements in the Magnetic frame into the local frame as a product of 2 matrices:
 
Φ M   L ( d,i )= Y ( d ) R ( i )  (21)
 
where i=inclination angle, and d=declination angle. The inclination and declination angles may be computed from a course approximation of the latitude and longitude of the device. Note that the inclination angle may be impacted by magnetic disturbance.
 
C. Gyro and Delta Roll/Pitch/Yaw Angles
 
     One type of sensor commonly included in devices is a triaxis gyroscope (or gyro). It measures the angular rate around each of the axes in the sensor frame. The 3 outputs may be labeled as {dot over (r)}=angular rate around the x axis, {dot over (p)}=angular rate around the y axis, and {dot over (y)}=angular rate around the z axis. The delta change in the angles from a given point in time is simply the integration of the angular rate over the time interval. 
     The gyro measurements are denoted (in the sensor frame) as g S =(g x  g y  g z ) T . 
     In the following, gyro measurements are used to help estimate the instantaneous roll and pitch angles. 
     D. Accelerometer and Roll/Pitch Angles 
     The triaxis accelerometer may be used to estimate the pitch and roll angles that are used in Φ L   S . When the device is stationary, the accelerometers measure the gravity vector which is aligned with the z axis of the local frame. The acceleration measurement in the sensor frame is described by the following equation: 
                       a   S     =           Φ   L   S     ⁡     (     r   ,   p   ,   y     )       ⁢     (         0           0           g         )       =     (           a   x               a   y               a   z           )         ,           (   22   )               
where g is the acceleration of gravity. Expanding this equation it is first observe that the yaw angle has no impact on the accelerometer measurements. Next, it is easily shown that given a S  the pitch angle is estimated as:
 
 {circumflex over (p)} =−sin −1 ( a   x )/ g   (23)
 
and the roll angle is estimated as:
 
 {circumflex over (r)} =tan −1 ( a   y   /a   z ).  (24)
 
E. Blending Accelerometer and Gyro Measurements to Estimate Roll/Pitch Angles
 
     The gyro angular rate measurements may be blended with the angle estimates obtained from the accelerometer measurements as in (23) and (24) to obtain a more accurate estimate of the angles. IIR filters may be used for this purpose:
 
   p     t   = p     t-1   +Δt ( g   y ( t )−β y ))α+(1−α) {circumflex over (p)}   t   (25)
 
   r     t   = r     t-1   +Δt ( g   x ( t )−β x ))α+(1−α) {circumflex over (r)}   t   (26)
 
where α is the filter coefficient and is between 0 and 1, Δt is the interval between gyro samples (assumed to be the same as the accelerometer samples), g y (t) and g x (t) are the t-th gyro samples, β y  and β x  are the gyro biases. Also, the filter is initialized according to  p   0 ={circumflex over (p)} 0  and  r   0 ={circumflex over (r)} 0 . To mitigate the impact of integrating any residual gyro bias, the data used for calibration is best if it begins just before the rotation (calibration maneuver) starts.
 
F. Magnetometer and Yaw Angle
 
     Earth&#39;s magnetic field is represented by a vector in its own frame of reference as h M =(0 E 0) T , where E is its magnitude. The magnetometer is not situated in the sensor frame of reference, so the magnetic field measured by an ideal magnetometer in the absence of soft and hard iron effects is expressed as:
 
 h   S =Φ M   S   h   M =Φ L   S Φ M   L   h   M =Φ L   S   h   L .  (27)
 
     Actual magnetometer measurements come in the sensor frame of reference and contain hard and soft iron effects as well as other non-idealities. They can be modeled as:
 
 m   S   =Ah   S   +b   S +ε  (28)
 
where A=SMA si , b S =SMb hi +b o , and ε is Gaussian wideband noise. The 3×3 diagonal matrix S contains scale factor errors, the 3×3 matrix M contains misalignment errors in the magnetometer, the 3×3 matrix A si  represents soft iron effects, the 3×1 vector b hi  models the hard-iron effects, and the 3×1 vector b o  models the offset introduced by the magnetometer itself.
 
     As the magnetometer is rotated the aggregate of the measurements it provides lie on the surface of an ellipsoid. Most calibration algorithms fit the parameters of an ellipsoid to the magnetometer measurements to obtain estimates of A and b S  denoted as Â and {circumflex over (b)} S , respectively. The calibrated magnetometer measurements are then obtained as:
 
 {tilde over (m)}   S   =Â   −1 ( m   S   −{circumflex over (b)}   S ),  (29)
 
     If both estimates are correct the calibrated magnetometer measurements may be expressed as (leaving out ε): 
     
       
         
           
             
               
                 
                   
                     
                       
                         
                           
                             m 
                             ~ 
                           
                           S 
                         
                         = 
                           
                         ⁢ 
                         
                           
                             R 
                             ⁡ 
                             
                               ( 
                               r 
                               ) 
                             
                           
                           ⁢ 
                           
                             P 
                             ⁡ 
                             
                               ( 
                               p 
                               ) 
                             
                           
                           ⁢ 
                           
                             Y 
                             ⁡ 
                             
                               ( 
                               y 
                               ) 
                             
                           
                           ⁢ 
                           
                             Y 
                             ⁡ 
                             
                               ( 
                               d 
                               ) 
                             
                           
                           ⁢ 
                           
                             R 
                             ⁡ 
                             
                               ( 
                               i 
                               ) 
                             
                           
                           ⁢ 
                           
                             ( 
                             
                               
                                 
                                   0 
                                 
                               
                               
                                 
                                   E 
                                 
                               
                               
                                 
                                   0 
                                 
                               
                             
                             ) 
                           
                         
                       
                     
                   
                   
                     
                       
                         = 
                           
                         ⁢ 
                         
                           
                             R 
                             ⁡ 
                             
                               ( 
                               r 
                               ) 
                             
                           
                           ⁢ 
                           
                             P 
                             ⁡ 
                             
                               ( 
                               p 
                               ) 
                             
                           
                           ⁢ 
                           
                             Y 
                             ⁡ 
                             
                               ( 
                               
                                 y 
                                 + 
                                 d 
                               
                               ) 
                             
                           
                           ⁢ 
                           
                             
                               ( 
                               
                                 
                                   
                                     0 
                                   
                                 
                                 
                                   
                                     
                                       E 
                                       H 
                                     
                                   
                                 
                                 
                                   
                                     
                                       E 
                                       V 
                                     
                                   
                                 
                               
                               ) 
                             
                             . 
                           
                         
                       
                     
                   
                 
               
               
                 
                   ( 
                   30 
                   ) 
                 
               
             
           
         
       
     
     The end goal is to compute the yaw angle y from the magnetometer measurements given the angle estimates {circumflex over (r)} and {circumflex over (p)} from accelerometer measurements. The detilted and calibrated magnetometer measurements are written as: 
                     (             m   ^     x                 m   ^     y                 m   ^     z           )     =       P   ⁡     (     -     p   ^       )       ⁢     R   ⁡     (     -     r   ^       )       ⁢         m   ~     S     .               (   31   )               
When {circumflex over (p)}=p and {circumflex over (r)}=r this reduces to:
 
                       (             m   ^     x                 m   ^     y                 m   ^     z           )     =     (             E   H     ·     -     sin   ⁡     (     y   +   d     )                       E   H     ·     cos   ⁡     (     y   +   d     )                   E   V           )       ,           (   32   )               
Therefore, the estimated yaw angle is given as:
 
 Ŷ =tan −1 ( {circumflex over (m)}   y   /{circumflex over (m)}   x )− d.   (33)
 
II. Calibration Method
 
     Described is a calibration method that has apriori access to E, A si , b hi  and the y(0) in addition to i and d. If A si  and b hi  are unavailable, then the calibration parameters will be valid only for the environment where the calibration maneuver was performed—this is a common problem for magnetometer calibration. For factory calibrations, A si  and b hi  can be measured and made available. For applications with magnetometers in vehicles, the A si  and b hi  caused by the metal components of the car will always be present so they need not be separated from the calibration parameters of the sensors. 
     For the calibration method, magnetometer measurements will be taken over time. The measurement m S (t) is denoted as the magnetometer measurement at time t in the sensor frame. Likewise, y(t), r(t), and p(t) are the yaw, roll, and pitch at time t, respectively. 
     Given E and y(0), then estimating r(t) and p(t) by blending accelerometer and gyro measurements, and estimating y(t) using the gyro measurements allows an estimate of h S (t) to be constructed: 
     
       
         
           
             
               
                 
                   
                     
                       
                         h 
                         ^ 
                       
                       S 
                     
                     ⁡ 
                     
                       ( 
                       t 
                       ) 
                     
                   
                   = 
                   
                     
                       R 
                       ⁡ 
                       
                         ( 
                         
                           
                             r 
                             ^ 
                           
                           ⁡ 
                           
                             ( 
                             t 
                             ) 
                           
                         
                         ) 
                       
                     
                     ⁢ 
                     
                       P 
                       ⁡ 
                       
                         ( 
                         
                           
                             p 
                             ^ 
                           
                           ⁡ 
                           
                             ( 
                             t 
                             ) 
                           
                         
                         ) 
                       
                     
                     ⁢ 
                     
                       Y 
                       ⁡ 
                       
                         ( 
                         
                           
                             
                               y 
                               ^ 
                             
                             ⁡ 
                             
                               ( 
                               t 
                               ) 
                             
                           
                           + 
                           d 
                         
                         ) 
                       
                     
                     ⁢ 
                     
                       
                         ( 
                         
                           
                             
                               0 
                             
                           
                           
                             
                               
                                 E 
                                 H 
                               
                             
                           
                           
                             
                               
                                 E 
                                 V 
                               
                             
                           
                         
                         ) 
                       
                       . 
                     
                   
                 
               
               
                 
                   ( 
                   34 
                   ) 
                 
               
             
           
         
       
     
     The instantaneous yaw is estimated using the gyro measurements as:
 
 ŷ ( t )= y (0)+Δ tΣ   i=0   t   g   z ( i ).  (35)
 
     The magnetometer measurement at time t is written as: 
                       (             m   x     ⁡     (   t   )                   m   y     ⁡     (   t   )                   m   z     ⁡     (   t   )             )     =         (           a     1   ,   1             a     1   ,   2             a     1   ,   3                 a     2   ,   1             a     2   ,   2             a     2   ,   3                 a     3   ,   1             a     3   ,   2             a     3   ,   3             )     ⁢     (             h   x     ⁡     (   t   )                   h   y     ⁡     (   t   )                   h   z     ⁡     (   t   )             )       +     b   S     +     ɛ   ⁡     (   t   )           ,           (   36   )               
where m S (t)=(m x (t) m y (t) m z (t) T , a j,k  is the element at the j-th row and k-th column of A, and h S (t)=(h x (t) h y (t) h z (t)) T .
 
     Next, N measurements are aggregated over time and formulate a set of linear equations to solve for the unknown A and b S : 
     
       
         
           
             
               
                 
                   
                     ( 
                     
                       
                         
                           
                             
                               m 
                               x 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               y 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               z 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           ⋮ 
                         
                       
                       
                         
                           
                             
                               m 
                               x 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               y 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               z 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                     
                     ) 
                   
                   = 
                   
                     
                       ( 
                       
                         
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   0 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               I 
                               1 
                             
                           
                         
                         
                           
                             0 
                           
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   0 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             0 
                           
                           
                             
                               I 
                               2 
                             
                           
                         
                         
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   0 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             
                               I 
                               3 
                             
                           
                         
                         
                           
                             
                                 
                             
                           
                           
                             ⋮ 
                           
                           
                             
                                 
                             
                           
                           
                             
                                 
                             
                           
                         
                         
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   N 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               I 
                               1 
                             
                           
                         
                         
                           
                             0 
                           
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   N 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             0 
                           
                           
                             
                               I 
                               2 
                             
                           
                         
                         
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               
                                 
                                   
                                     h 
                                     ^ 
                                   
                                   S 
                                 
                                 ⁡ 
                                 
                                   ( 
                                   N 
                                   ) 
                                 
                               
                               T 
                             
                           
                           
                             
                               I 
                               3 
                             
                           
                         
                       
                       ) 
                     
                     ⁢ 
                     
                       ( 
                       
                         
                           
                             
                               a 
                               
                                 1 
                                 , 
                                 1 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 1 
                                 , 
                                 2 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 1 
                                 , 
                                 3 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 2 
                                 , 
                                 1 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 2 
                                 , 
                                 2 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 2 
                                 , 
                                 3 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 3 
                                 , 
                                 1 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 3 
                                 , 
                                 2 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 3 
                                 , 
                                 3 
                               
                             
                           
                         
                         
                           
                             
                               b 
                               S 
                             
                           
                         
                       
                       ) 
                     
                   
                 
               
               
                 
                   ( 
                   37 
                   ) 
                 
               
             
           
         
       
     
     where 0=(0 0 0), I 1 =(1 0 0), I 2 =(0 1 0), I 3 =(0 0 1), and where ε(t)=0. This equation in a more concise form is:
 
 z=Hx   (38)
 
where H has 3N rows. As long as H is well-conditioned one may compute the least squares solution for x:
 
 {circumflex over (x)} =( H   T   H ) −1   H   T   z.   (39)
 
     Then estimates for A and b S  are extracted from {circumflex over (x)}. 
     Alternatively, it can assume that the off-diagonal elements of A are zero to get a simplified equation: 
     
       
         
           
             
               
                 
                   
                     ( 
                     
                       
                         
                           
                             
                               m 
                               x 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               y 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               z 
                             
                             ⁡ 
                             
                               ( 
                               0 
                               ) 
                             
                           
                         
                       
                       
                         
                           ⋮ 
                         
                       
                       
                         
                           
                             
                               m 
                               x 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               y 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                       
                         
                           
                             
                               m 
                               z 
                             
                             ⁡ 
                             
                               ( 
                               N 
                               ) 
                             
                           
                         
                       
                     
                     ) 
                   
                   = 
                   
                     
                       ( 
                       
                         
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 x 
                               
                               ⁡ 
                               
                                 ( 
                                 0 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                           
                             0 
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 y 
                               
                               ⁡ 
                               
                                 ( 
                                 0 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 z 
                               
                               ⁡ 
                               
                                 ( 
                                 0 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                         
                         
                           
                             
                                 
                             
                           
                           
                             ⋮ 
                           
                           
                             
                                 
                             
                           
                           
                             
                                 
                             
                           
                           
                             
                                 
                             
                           
                           
                             
                                 
                             
                           
                         
                         
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 x 
                               
                               ⁡ 
                               
                                 ( 
                                 N 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                           
                             0 
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 y 
                               
                               ⁡ 
                               
                                 ( 
                                 N 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                           
                             0 
                           
                         
                         
                           
                             0 
                           
                           
                             0 
                           
                           
                             
                               
                                 
                                   h 
                                   ^ 
                                 
                                 z 
                               
                               ⁡ 
                               
                                 ( 
                                 N 
                                 ) 
                               
                             
                           
                           
                             0 
                           
                           
                             0 
                           
                           
                             1 
                           
                         
                       
                       ) 
                     
                     ⁢ 
                     
                       ( 
                       
                         
                           
                             
                               a 
                               
                                 1 
                                 , 
                                 1 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 2 
                                 , 
                                 2 
                               
                             
                           
                         
                         
                           
                             
                               a 
                               
                                 3 
                                 , 
                                 3 
                               
                             
                           
                         
                         
                           
                             
                               b 
                               S 
                             
                           
                         
                       
                       ) 
                     
                   
                 
               
               
                 
                   ( 
                   40 
                   ) 
                 
               
             
           
         
       
     
     This equation in a more concise form is:
 
 z={tilde over (H)}{tilde over (x)}   (41)
 
     Since H and {tilde over (H)} are functions of the relative orientation of the sensor and magnetometer frames the more rotations included within the time interval tε[0,N] the more accurate the estimation of x. On the other hand, an object is to perform calibration with minimal rotations included within the time interval. In the following it is shown how much change in y, p, and/or r is required to obtain accurate calibrations. 
     When, the calibration parameter estimates Â and {circumflex over (b)} S  are extracted from {circumflex over (x)}. These estimates also contain soft and hard iron effects that apply only to the environment in which the calibration was performed. When the magnetometer moves into a different environment it may be better to use calibration parameters that are not dependent on any soft or hard iron effects. In the factory calibration if A si  and b hi  are known then the matrix SM and vector b o  can be computed from Â and {circumflex over (b)} S . 
     III. Simulation Results 
     Solutions evaluated based on (38) and (41), and compare to the usage of a traditional methods. The ideal conditions examined below means that ŷ(0)=y(0), {circumflex over (r)}(t)=r(t), {circumflex over (p)}(t)=p(t), and a j,k =0 when j≠k in addition the given values of E, i, and d are correct. In the non-ideal conditions a Gaussian error with standard deviation of 1° is added to ŷ(0), {circumflex over (r)}(t), and {circumflex over (p)}(t), a constant error of 0.01 is added to E, and a j,k  are zero-mean Gaussian random variables with standard deviation of 0.006 when j≠k. For all experiments there are N=100 magnetometer samples taken within the calibration maneuver. It is also assumed that the gyros have been perfectly calibrated. In all simulations, the magnetic field intensity, E, is taken as 0.4 gausses (G) ands is taken as a zero-mean Gaussian random variable with standard deviation of 0.005. 
     A new performance metric is provided for the magnetometer calibration. The impact of the error in the calibration parameter estimates actually depends on the angles r, p, and y. Therefore, this metric is the worst case error in y over all possible values of r, p, and y. This metric is computed across many random trials and look at the 95 th  quantile for different amounts of rotation during calibration. 
     Many modifications and other embodiments of the invention will come to mind to one skilled in the art to which this invention pertains having the benefit of the teachings presented in the foregoing descriptions, and the associated drawings. Therefore, it is to be understood that the invention is not to be limited to the specific embodiments disclosed. Although specific terms are employed herein, they are used in a generic and descriptive sense only and not for purposes of limitation.