imu_fusion/
fusion_matrix_impl.rs1use core::ops;
2use crate::{FusionMatrix, FusionQuaternion, FusionVector};
3
4impl FusionMatrix {
5 pub fn new(xx: f32, xy: f32, xz: f32, yx: f32, yy: f32, yz: f32, zx: f32, zy: f32, zz: f32) -> Self {
6 Self {
7 xx,
8 xy,
9 xz,
10 yx,
11 yy,
12 yz,
13 zx,
14 zy,
15 zz,
16 }
17 }
18
19
20 pub fn identity() -> Self {
21 const VALUE: FusionMatrix =
22 FusionMatrix {
23 xx: 1.0f32,
24 xy: 0.0f32,
25 xz: 0.0f32,
26 yx: 0.0f32,
27 yy: 1.0f32,
28 yz: 0.0f32,
29 zx: 0.0f32,
30 zy: 0.0f32,
31 zz: 1.0f32,
32 };
33 VALUE
34 }
35}
36
37impl ops::Mul<FusionVector> for FusionMatrix {
38 type Output = FusionVector;
39 fn mul(self, rhs: FusionVector) -> Self::Output {
40 FusionVector {
41 x: self.xx * rhs.x + self.xy * rhs.y + self.xz * rhs.z,
42 y: self.yx * rhs.x + self.yy * rhs.y + self.yz * rhs.z,
43 z: self.zx * rhs.x + self.zy * rhs.y + self.zz * rhs.z,
44 }
45 }
46}
47
48impl From<FusionQuaternion> for FusionMatrix {
49 fn from(q: FusionQuaternion) -> Self {
50 let qwqw = q.w * q.w;
51 let qwqx = q.w * q.x;
52 let qwqy = q.w * q.y;
53 let qwqz = q.w * q.z;
54 let qxqx = q.x * q.x;
55 let qxqy = q.x * q.y;
56 let qxqz = q.x * q.z;
57 let qyqy = q.y * q.y;
58 let qyqz = q.y * q.z;
59 let qzqz = q.z * q.z;
60 Self {
61 xx: 2.0f32 * (qwqw - 0.5f32 + qxqx),
62 xy: 2.0f32 * (qxqy - qwqz),
63 xz: 2.0f32 * (qxqz + qwqy),
64 yx: 2.0f32 * (qxqy + qwqz),
65 yy: 2.0f32 * (qwqw - 0.5f32 + qyqy),
66 yz: 2.0f32 * (qyqz - qwqx),
67 zx: 2.0f32 * (qxqz - qwqy),
68 zy: 2.0f32 * (qyqz + qwqx),
69 zz: 2.0f32 * (qwqw - 0.5f32 + qzqz),
70 }
71 }
72}