Download as pdf or txt
Download as pdf or txt
You are on page 1of 37

Inertial Measurement Units II!

Gordon Wetzstein!
Stanford University!
!

EE 267 Virtual Reality!


Lecture 10!
stanford.edu/class/ee267/!
!
Polynesian Migration!

wikipedia!
Lecture Overview!

•  short review of coordinate systems, tracking in flatland, and


accelerometer-only tracking !

•  rotations: Euler angles, axis & angle, gimbal lock!


•  rotations with quaternions!
•  6-DOF IMU sensor fusion with quaternions!
•  primary goal: track
orientation of head or
device!

•  inertial sensors required


pitch, yaw, and roll to be
determined!

oculus.com!
from lecture 2:!
vertex in clip space! vertex!

vclip = M proj ⋅ M view ⋅ M model ⋅ v

oculus.com!
from lecture 2:!
vertex in clip space! vertex!

vclip = M proj ⋅ M view ⋅ M model ⋅ v


projection matrix! view matrix! model matrix!

rotation! translation!

M view = R ⋅T ( −eye )

oculus.com!
Euler angles !

θy

rotation! translation!

θx M view = R ⋅T ( −eye )
θz
( )
R = Rz ( −θ z ) ⋅ Rx ( −θ x ) ⋅ Ry −θ y
roll! pitch! yaw!
oculus.com!
Euler angles !

θy

2 important
coordinate systems: !
body/sensor world/inertial
frame! frame!

θx M view = R ⋅T ( −eye )
θz
( )
R = Rz ( −θ z ) ⋅ Rx ( −θ x ) ⋅ Ry −θ y
roll! pitch! yaw!
oculus.com!
Gyro Integration aka Dead Reckoning!

•  from gyro measurements to orientation – use Taylor expansion!

have: angle at! have: !


last time step! time step!


θ ( t + Δt ) ≈ θ ( t ) + θ ( t ) Δt + ε , ε ∼ O ( Δt 2 )
! ∂t
want: angle at!
current time step!
= ω approximation error!!

have: gyro measurement!


(angular velocity)!
Orientation Tracking in Flatland!

•  problem: track 1 angle in 2D space!


•  sensors: 1 gyro, 2-axis
accelerometer!
VRduino
•  sensor fusion with complementary IMU
filter, i.e. linear interpolation:!

( ) (
θ (t ) = α θ (t−1) + ω! Δt + (1− α ) atan2 a! x , a! y )
•  no drift, no noise!!
Tilt from Accelerometer!
•  assuming acceleration points up (i.e. no external forces), we can
compute the tilt (i.e. pitch and roll) from a 3-axis accelerometer !

⎛ 0 ⎞ ⎛ 0 ⎞
a!
â =
a! ⎜ ⎟
( )
= R ⎜ 1 ⎟ = Rz ( −θ z ) ⋅ Rx ( −θ x ) ⋅ Ry −θ y ⎜ 1 ⎟
⎜ ⎟
⎝ 0 ⎠ ⎝ 0 ⎠

⎛ − cos ( −θ ) sin ( −θ )

x z

⎟ ( ( )
θ x = −atan2 âz ,sign ây ⋅ âx2 + ây2 )
= ⎜ cos ( −θ x ) cos ( −θ z ) ⎟
⎜ ⎟ θz = −atan2 ( − â , â ) both in rad
sin ( −θ x )
x y
⎜⎝ ⎟⎠
Euler Angles and Gimbal Lock!

•  so far we have represented head rotations with Euler angles: 3


rotation angles around the axis applied in a specific sequence!

•  problematic when interpolating between rotations in keyframes


(in computer animation) or integration à singularities!
Gimbal Lock!

The Guerrilla CG Project, The Euler (gimbal lock) Explained – see: https://www.youtube.com/watch?v=zc8b2Jo7mno!
Rotations with Axis-Angle Representation
and Quaternions!
Rotations with Axis and Angle Representation!

•  solution to gimbal lock: use axis and angle representation for


rotation!!
•  simultaneous rotation around a
normalized vector v by angle θ
!

•  no “order” of rotation, all at once around


that vector!
Quaternions!

•  think about quaternions as an extension of complex numbers


to having 3 (different) imaginary numbers or fundamental
quaternion units i,j,k!

q = qw + iqx + jqy + kqz


ij = − ji = k
i≠ j≠k ki = −ik = j
!
i 2 = j 2 = k 2 = ijk = −1 jk = −kj = i
Quaternions!

•  think about quaternions as an extension of complex numbers


to having 3 (different) imaginary numbers or fundamental
quaternion units i,j,k!

q = qw + iqx + jqy + kqz

•  quaternion algebra is well-defined and will give us a powerful


tool to work with rotations in axis-angle representation in
practice!
Quaternions!

•  axis-angle to quaternion (need normalized axis v)!

⎛θ ⎞ ⎛θ ⎞ ⎛θ ⎞ ⎛θ ⎞
q (θ ,v ) = cos ⎜ ⎟ + i vx sin ⎜ ⎟ + j vy sin ⎜ ⎟ + k vz sin ⎜ ⎟
⎝ 2⎠ ⎝ 2⎠ ⎝ 2⎠ ⎝ 2⎠
!"
# # $ !#"# $ !#"# $ !#"# $
qw qx qy qz
Quaternions!

•  axis-angle to quaternion (need normalized axis v)!

⎛θ ⎞ ⎛θ ⎞ ⎛θ ⎞ ⎛θ ⎞
q (θ ,v ) = cos ⎜ ⎟ + i vx sin ⎜ ⎟ + j vy sin ⎜ ⎟ + k vz sin ⎜ ⎟
⎝ 2⎠ ⎝ 2⎠ ⎝ 2⎠ ⎝ 2⎠
!"
# # $ !#"# $ !#"# $ !#"# $
qw qx qy qz

•  valid rotation quaternions have unit length!

q = qw2 + qx2 + qy2 + qz2 = 1


Two Types of Quaternions!

•  vector quaternions represent 3D points or vectors u=(ux,uy,uz)


can have arbitrary length!

qu = 0 + i u x + j u y + k uz
!

•  valid rotation quaternions have unit length!

q = qw2 + qx2 + qy2 + qz2 = 1


Quaternion Algebra!
•  quaternion addition:!
!
!
(
q + p = ( qw + pw ) + i ( qx + px ) + j qy + py + k ( qz + pz ) )
•  quaternion multiplication:!
(
qp = qw + iqx + jqy + kqz )( p w + ipx + jpy + kpz )
= (q p − q p − q p − q p ) +
w w x x y y z z

i (q p + q p + q p − q p ) +
w x x w y z z y

j (q p − q p + q p + q p ) +
w y x z y w z x

k (q p + q p − q p + q p ) +
w z x y y x z w
Quaternion Algebra!

•  quaternion conjugate:! q* = qw − iqx − jqy − kqz


!
q*
−1
•  quaternion inverse:! q = 2
q

•  rotation of vector quaternion qu by q :! q'u = qqu q −1


•  inverse rotation:! qu = q −1q'u q

•  successive rotations by q1 then q2 : ! q'u = q2 q1 qu q1−1 q2−1


Quaternion Algebra!

•  detailed derivations and reference of general quaternion


algebra and rotations with quaternions in course notes!

•  please read course notes for more details!!


Quaternion-based!
6-DOF Orientation Tracking!
Quaternion-based Orientation Tracking!

1.  3-axis gyro integration!

2.  computing the tilt correction quaternion!

3.  applying a complementary filter!


Gyro Integration with Quaternions!
(0)
•  start with initial quaternion: ! q = 1+ i0 + j0 + k0

•  convert 3-axis gyro measurements ω! = (ω! x , ω! y , ω! z ) to


instantaneous rotation quaternion as!
⎛ ω! ⎞
qΔ = q ⎜ Δt ω! ,
ω! ⎟⎠
avoid division by 0!!

angle! rotation
!
! axis!

•  integrate as! qω(t+Δt ) = q(t )qΔ


Gyro Integration with Quaternions!
(t+Δt )
•  integrated gyro rotation quaternion qω represents rotation
from body to world frame, i.e.!
( world ) (t+Δt ) (body ) (t+Δt )−1
qu = qω qu qω

(t )
•  last estimate q is either from gyro-only (for dead reckoning)
or from last complementary filter!

•  integrate as! qω(t+Δt ) = q(t )qΔ


Tilt Correction with Quaternions!
•  assume accelerometer measures gravity vector in body
(
(sensor) coordinates! a! = a! , a! , a!
x y z )
•  transform vector quaternion of a! into current estimation of
world space as!
( world ) (t+Δt ) ( body ) (t+Δt )−1
qa = qω qa qω

(body )
qa = 0 + ia! x + ja! y + ka! z
Tilt Correction with Quaternions!
•  assume accelerometer measures gravity vector in body
(
(sensor) coordinates! a! = a! , a! , a!
x y z )
•  transform vector quaternion of a! into current estimation of
world space as!
( world ) (t+Δt ) ( body ) (t+Δt )−1
qa = qω qa qω

•  if gyro quaternion is correct, then accelerometer world vector


points up, i.e.! ( world )
qa = 0 + i0 + j 9.81+ k0
Tilt Correction with Quaternions!
•  gyro quaternion likely includes drift!
•  accelerometer measurements are noisy and also include
forces other than gravity, so it’s unlikely that accelerometer
world vector actually points up!

•  if gyro quaternion is correct, then accelerometer world vector


points up, i.e.! ( world )
qa = 0 + i0 + j 9.81+ k0
!
Tilt Correction with Quaternions!
( world )
solution: compute tilt correction quaternion that would rotate qa
into up direction!

( world )
how? get normalized vector part of vector quaternion! qa

⎛ q( world ) qa( world ) qa( world ) ⎞


v = ⎜ ( world
ax

y
, , z

⎜⎝ qa ) qa( world ) qa( world ) ⎟⎠


!
Tilt Correction with Quaternions!
(
world )
solution: compute tilt correction quaternion that would rotate qa
into up direction!
⎛ n ⎞
qt = q ⎜ φ , ⎟
⎝ n ⎠
⎛ vx ⎞ ⎛ ⎞
0
⎜ ⎟ ⎜
⎜ vy ⎟ i ⎜ 1
⎟ = cos (φ ) ⇒

( )
φ = cos −1 vy
⎜ v ⎟ ⎝ 0 ⎠
⎝ z ⎠
⎛ vx ⎞ ⎛ 0 ⎞ ⎛ −vz ⎞
⎜ ⎟ ⎟ =⎜ 0 ⎟
n=⎜ vy ⎟ × ⎜ 1
⎜ ⎟ ⎜ ⎟
⎜ ⎟
vz ⎠ ⎝ 0 ⎠ ⎜⎝ vx ⎟⎠

Complementary Filter with Quaternions!

•  complementary filter: rotate into gyro world space first, then


rotate “a bit” into the direction of the tilt correction quaternion!

⎛ n ⎞ (t+Δt )
qc (t+Δt )
= q ⎜ (1− α )φ , ⎟ qω 0 ≤α ≤1
⎝ n ⎠
−1
( world )
•  rotation of any vector quaternion is then ! qu = qc(t+Δt )qu( body )qc(t+Δt )
Integration into Graphics Pipeline!
(t+Δt )
•  compute qc via quaternion complementary filter first !

•  stream from microcontroller to PC!

•  convert to 4x4 rotation matrix (see course notes)! qc(t+Δt ) ⇒ Rc

•  set view matrix to M view = Rc−1 to rotate the world in front of the
virtual camera !
Head and Neck Model!

y θx θz
y
lh
ln IMU!

ln
−z x
pitch around base of neck!! roll around base of neck!!
Head and Neck Model!

•  why? there is not always positional tracking! this gives some


motion parallax!
•  can extend to torso, and using other kinematic constraints!

•  integrate into pipeline as!

M view = T ( 0,−ln ,−lh ) ⋅ R ⋅T ( 0,ln ,lh ) ⋅T ( −eye )


Must read: course notes on IMUs!!

You might also like