Line 27: Line 27:
 
'''Discretization'''  
 
'''Discretization'''  
  
Because an HCS12 microcontroller works with fixed-point integers, computing the required ''arctangent'' (and ''sqrt'' equations is non-trivial.  
+
Because an HCS12 microcontroller works with fixed-point integers, computing the required ''arctangent'' (and ''sqrt'' equations is non-trivial.  The atan function you might normally invoke from the <math.h> library requires floating point numbers. An example implementation can be seen here [4].  
  
Based on [3], I considered two atan implementations:  
+
However, because this application dealt with an embedded microprocessor, I considered two atan implementations from [4]:  
  
 
*'closed form' (finite number of terms) approximation  
 
*'closed form' (finite number of terms) approximation  
*lookup table (LUT) interpolation
+
*lookup table (LUT) (w/ or w/o interpolation)
  
The atan function you might normally invoke from the <math.h> library requires floating point numbers. An example implementation can be seen here [4].
 
  
 +
Details of the LUT implementation w/o interpolation can be seen in the following graphs:
 
[[Image:Atan_discretization.png | 560x720px]]
 
[[Image:Atan_discretization.png | 560x720px]]
  
 +
[[Image:Atan_discretization2.png | 560x720px]]
  
Finished implementation (with atan LUT), displaying analog axis outputs and calculated orientation angles (roll, pitch) can be seen here.  Again, explanation of readings can be found on original Youtube page.
+
 
 +
A finished implementation (with atan LUT), displaying analog axis outputs and calculated orientation angles (roll, pitch) can be seen here.  As before, an explanation of the video can be found on the original Youtube page.
 
<youtube>NRS9ppd1LkY</youtube>
 
<youtube>NRS9ppd1LkY</youtube>
  

Revision as of 20:15, 11 November 2012

Determining Orientation from Accelerometer (alec green)


OUTLINE
. introduction
. continuous equations (..to be completed..)
. discretization (..to be completed..)
. references

Introduction

An accelerometer is useful for measuring orientation relative to Earth's surface ground ('static acceleration' due to gravitational force) or accelerating motion throughout space ('dynamic acceleration' due to non-gravitational force such as a car speeding up or a human shaking an accelerometer-clad device). However, note that accelerometers are implicity restricted to measuring acceleration, and cannot measure velocity. For example, constant nonzero velocity will produce same measurement as zero velocity.

It's important to first determine if an accelerometer is appropriate for your application. If you're not sure, you may consider other orientation/position sensing devices such as: gyroscope (angular velocity), magnetic compass (2D direction of maximum local magnetic field), magnetometer (magnitude and 3D direction of local magnetic field), GPS (rough 3D position).

In order to achieve higher-level measurements such as 'dead reckoning' (calculation of position and orientation in 3D space), you will need to combine sensor readings. For example, an accelerometer, gyroscope, and magnetometer are commonly packaged together as an 'intertial measurement unit' (or IMU) to be used by 'quadcopter' hobbyists. This 'sensor fusion' also allows for sensors to recalibrate each other such that measurement 'drift' of certain sensors (esp. gyroscope) is minimized. This inter-recalibration can further benefit from probabilistic noise-reducing filters such as the Bayesian or Kalman filter.

The following video may give you a better idea of what an accelerometer can be used for. Extensive description provided at YouTube page (access by clicking on YouTube logo in lower right-hand side of video).

Continuous Equations

It's instructive to read through pages 3-4 of [2] in order to understand how an accelerometer works on a physical level, but not necessary to interpret the analog or digital signals generated from the sensor.

Discretization

Because an HCS12 microcontroller works with fixed-point integers, computing the required arctangent (and sqrt equations is non-trivial. The atan function you might normally invoke from the <math.h> library requires floating point numbers. An example implementation can be seen here [4].

However, because this application dealt with an embedded microprocessor, I considered two atan implementations from [4]:

  • 'closed form' (finite number of terms) approximation
  • lookup table (LUT) (w/ or w/o interpolation)


Details of the LUT implementation w/o interpolation can be seen in the following graphs: Atan discretization.png

Atan discretization2.png


A finished implementation (with atan LUT), displaying analog axis outputs and calculated orientation angles (roll, pitch) can be seen here. As before, an explanation of the video can be found on the original Youtube page.


References

[1] Freescale Semiconductor, "±1.5g, ±6g Three Axis Low-g Micromachined Accelerometer" Freescale Datasheet. <http://www.sparkfun.com/datasheets/Components/General/MMA7361L.pdf>

[2] L. Salhuana, "Tilt Sensing Using Linear Accelerometers," Freescale Application Note. <http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf>

[3] A. Ukil et al., "Fast Computation of arctangent Functions for Embedded Applications: A Comparative Analysis," IEEE ISIE 2011. <http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=5984330>

[4] "atan.c," Apple Open Source. <http://opensource.apple.com/source/Libm/Libm-315/Source/Intel/atan.c>

[5] N. Jones, "A tutorial on lookup tables in C", EmbeddedGurus.com. <http://embeddedgurus.com/stack-overflow/2010/01/a-tutorial-on-lookup-tables-in-c/>

[6] "Fast square root in C," IAR Application Note. <http://netstorage.iar.com/SuppDB/Public/SUPPORT/000419/AN-G-002.pdf>

Alumni Liaison

Have a piece of advice for Purdue students? Share it through Rhea!

Alumni Liaison