M5Unit-IMU 0.0.2 git rev:e5b00aa
Loading...
Searching...
No Matches
axis_order.hpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2026 M5Stack Technology CO LTD
3 *
4 * SPDX-License-Identifier: MIT
5 */
10#ifndef M5_UNIT_IMU_IMU_AXIS_ORDER_HPP
11#define M5_UNIT_IMU_IMU_AXIS_ORDER_HPP
12
13#include <cstdint>
14
15namespace m5 {
16namespace imu {
17
23enum class AxisPermutation : uint8_t {
24 XYZ,
25 XZY,
26 YXZ,
27 YZX,
28 ZXY,
29 ZYX,
30};
31
43struct AxisOrder {
44 AxisPermutation permutation{AxisPermutation::XYZ};
45 bool invert_x{false};
46 bool invert_y{false};
47 bool invert_z{false};
48
53 inline void apply(float (&v)[3]) const
54 {
55 const float src[3] = {v[0], v[1], v[2]};
56 switch (permutation) {
57 case AxisPermutation::XYZ:
58 v[0] = src[0];
59 v[1] = src[1];
60 v[2] = src[2];
61 break;
62 case AxisPermutation::XZY:
63 v[0] = src[0];
64 v[1] = src[2];
65 v[2] = src[1];
66 break;
67 case AxisPermutation::YXZ:
68 v[0] = src[1];
69 v[1] = src[0];
70 v[2] = src[2];
71 break;
72 case AxisPermutation::YZX:
73 v[0] = src[1];
74 v[1] = src[2];
75 v[2] = src[0];
76 break;
77 case AxisPermutation::ZXY:
78 v[0] = src[2];
79 v[1] = src[0];
80 v[2] = src[1];
81 break;
82 case AxisPermutation::ZYX:
83 v[0] = src[2];
84 v[1] = src[1];
85 v[2] = src[0];
86 break;
87 }
88 if (invert_x) {
89 v[0] = -v[0];
90 }
91 if (invert_y) {
92 v[1] = -v[1];
93 }
94 if (invert_z) {
95 v[2] = -v[2];
96 }
97 }
98};
99
105inline const uint8_t* axis_permutation_indices(const AxisPermutation p)
106{
107 static const uint8_t table[6][3] = {
108 {0, 1, 2}, // XYZ
109 {0, 2, 1}, // XZY
110 {1, 0, 2}, // YXZ
111 {1, 2, 0}, // YZX
112 {2, 0, 1}, // ZXY
113 {2, 1, 0}, // ZYX
114 };
115 return table[static_cast<uint8_t>(p)];
116}
117
123inline AxisPermutation permutation_from_indices(const uint8_t (&p)[3])
124{
125 const uint8_t code = static_cast<uint8_t>((p[0] << 4) | (p[1] << 2) | p[2]);
126 switch (code) {
127 case (0 << 4) | (1 << 2) | 2:
128 return AxisPermutation::XYZ;
129 case (0 << 4) | (2 << 2) | 1:
130 return AxisPermutation::XZY;
131 case (1 << 4) | (0 << 2) | 2:
132 return AxisPermutation::YXZ;
133 case (1 << 4) | (2 << 2) | 0:
134 return AxisPermutation::YZX;
135 case (2 << 4) | (0 << 2) | 1:
136 return AxisPermutation::ZXY;
137 case (2 << 4) | (1 << 2) | 0:
138 return AxisPermutation::ZYX;
139 default:
140 return AxisPermutation::XYZ;
141 }
142}
143
153inline AxisOrder compose(const AxisOrder& first, const AxisOrder& second)
154{
155 const uint8_t* pa = axis_permutation_indices(first.permutation);
156 const uint8_t* pb = axis_permutation_indices(second.permutation);
157 const bool inv_a[3] = {first.invert_x, first.invert_y, first.invert_z};
158 const bool inv_b[3] = {second.invert_x, second.invert_y, second.invert_z};
159
160 uint8_t pc[3]{};
161 bool inv_c[3]{};
162 for (int i = 0; i < 3; ++i) {
163 pc[i] = pa[pb[i]];
164 inv_c[i] = inv_b[i] != inv_a[pb[i]];
165 }
166 AxisOrder result;
168 result.invert_x = inv_c[0];
169 result.invert_y = inv_c[1];
170 result.invert_z = inv_c[2];
171 return result;
172}
173
174} // namespace imu
175} // namespace m5
176#endif
AxisOrder compose(const AxisOrder &first, const AxisOrder &second)
Compose two axis orders into one.
Definition axis_order.hpp:153
AxisPermutation permutation_from_indices(const uint8_t(&p)[3])
Map a source-axis index triplet back to an AxisPermutation.
Definition axis_order.hpp:123
const uint8_t * axis_permutation_indices(const AxisPermutation p)
Source-axis index feeding each output slot, for a given permutation.
Definition axis_order.hpp:105
AxisPermutation
Which raw axis feeds each output slot, read left-to-right.
Definition axis_order.hpp:23
@ ZXY
output = (Z, X, Y)
@ YXZ
output = (Y, X, Z)
@ ZYX
output = (Z, Y, X)
@ XZY
output = (X, Z, Y)
@ YZX
output = (Y, Z, X)
@ XYZ
Identity: output = (X, Y, Z)
Top level namespace of M5Stack.
Definition ahrs_controller.cpp:26
Chip-frame-to-body-frame axis remap: a permutation plus a per-output-axis sign flip.
Definition axis_order.hpp:43
bool invert_y
Negate output Y after permutation.
Definition axis_order.hpp:46
AxisPermutation permutation
Axis permutation.
Definition axis_order.hpp:44
bool invert_z
Negate output Z after permutation.
Definition axis_order.hpp:47
void apply(float(&v)[3]) const
Apply this permutation and sign flip to a physical-unit XYZ triplet, in place.
Definition axis_order.hpp:53
bool invert_x
Negate output X after permutation.
Definition axis_order.hpp:45