pub struct AxisMap {
pub x: Axis,
pub y: Axis,
pub z: Axis,
}Expand description
Which sensor axis each board axis reads.
use oxstack_drivers::axes::{Axis, AxisMap};
// Sensor rotated 90° clockwise on the board: board +X is sensor −Y.
let map = AxisMap { x: Axis::NegY, y: Axis::PosX, z: Axis::PosZ };
assert_eq!(map.apply([1.0, 0.0, 0.0]), [0.0, 1.0, 0.0]);
assert!(map.is_right_handed());Fields§
§x: AxisThe sensor axis the board’s +X reads.
y: AxisThe sensor axis the board’s +Y reads.
z: AxisThe sensor axis the board’s +Z reads.
Implementations§
Source§impl AxisMap
impl AxisMap
Sourcepub const fn apply(&self, v: [f32; 3]) -> [f32; 3]
pub const fn apply(&self, v: [f32; 3]) -> [f32; 3]
Translates a sensor-frame vector into the board frame.
Sourcepub const fn is_permutation(&self) -> bool
pub const fn is_permutation(&self) -> bool
Whether every sensor axis is used exactly once.
Sourcepub const fn is_right_handed(&self) -> bool
pub const fn is_right_handed(&self) -> bool
Whether the map is a rotation (determinant +1) rather than a reflection. A sensor soldered flat on a board always gives a rotation; a reflection means one pose was misread.
Sourcepub fn from_gravity(
x_up: [f32; 3],
y_up: [f32; 3],
z_up: [f32; 3],
) -> Result<AxisMap, GravityError>
pub fn from_gravity( x_up: [f32; 3], y_up: [f32; 3], z_up: [f32; 3], ) -> Result<AxisMap, GravityError>
Works the map out from gravity. Each argument is one resting accelerometer reading (in g, sensor frame) with the named board axis pointing straight up, so that it reads about +1 g:
x_up: board stood on its left edge (+X up),y_up: board stood on its bottom edge (+Y up),z_up: board lying flat, face up (+Z up).
use oxstack_drivers::axes::{Axis, AxisMap};
let map = AxisMap::from_gravity(
[0.02, -0.98, 0.05], // +X up: sensor −Y reads gravity
[0.99, 0.01, -0.03], // +Y up: sensor +X
[-0.04, 0.0, 1.01], // +Z up: sensor +Z
)
.unwrap();
assert_eq!(map, AxisMap { x: Axis::NegY, y: Axis::PosX, z: Axis::PosZ });Trait Implementations§
impl Copy for AxisMap
impl Eq for AxisMap
impl StructuralPartialEq for AxisMap
Auto Trait Implementations§
impl Freeze for AxisMap
impl RefUnwindSafe for AxisMap
impl Send for AxisMap
impl Sync for AxisMap
impl Unpin for AxisMap
impl UnsafeUnpin for AxisMap
impl UnwindSafe for AxisMap
Blanket Implementations§
§impl<T> Any for Twhere
T: 'static + ?Sized,
impl<T> Any for Twhere
T: 'static + ?Sized,
§impl<T> Borrow<T> for Twhere
T: ?Sized,
impl<T> Borrow<T> for Twhere
T: ?Sized,
§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
Source§impl<T> CheckedAs for T
impl<T> CheckedAs for T
Source§fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
fn checked_as<Dst>(self) -> Option<Dst>where
T: CheckedCast<Dst>,
Casts the value.
Source§impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
impl<Src, Dst> CheckedCastFrom<Src> for Dstwhere
Src: CheckedCast<Dst>,
Source§fn checked_cast_from(src: Src) -> Option<Dst>
fn checked_cast_from(src: Src) -> Option<Dst>
Casts the value.
§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§unsafe fn clone_to_uninit(&self, dest: *mut u8)
unsafe fn clone_to_uninit(&self, dest: *mut u8)
🔬This is a nightly-only experimental API. (
clone_to_uninit)§impl<T, U> Into<U> for Twhere
U: From<T>,
impl<T, U> Into<U> for Twhere
U: From<T>,
Source§impl<T> OverflowingAs for T
impl<T> OverflowingAs for T
Source§fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
fn overflowing_as<Dst>(self) -> (Dst, bool)where
T: OverflowingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
impl<Src, Dst> OverflowingCastFrom<Src> for Dstwhere
Src: OverflowingCast<Dst>,
Source§fn overflowing_cast_from(src: Src) -> (Dst, bool)
fn overflowing_cast_from(src: Src) -> (Dst, bool)
Casts the value.
Source§impl<T> SaturatingAs for T
impl<T> SaturatingAs for T
Source§fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
fn saturating_as<Dst>(self) -> Dstwhere
T: SaturatingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
impl<Src, Dst> SaturatingCastFrom<Src> for Dstwhere
Src: SaturatingCast<Dst>,
Source§fn saturating_cast_from(src: Src) -> Dst
fn saturating_cast_from(src: Src) -> Dst
Casts the value.
§impl<T> ToOwned for Twhere
T: Clone,
impl<T> ToOwned for Twhere
T: Clone,
§impl<T, U> TryFrom<U> for Twhere
U: Into<T>,
impl<T, U> TryFrom<U> for Twhere
U: Into<T>,
§impl<T, U> TryInto<U> for Twhere
U: TryFrom<T>,
impl<T, U> TryInto<U> for Twhere
U: TryFrom<T>,
Source§impl<T> UnwrappedAs for T
impl<T> UnwrappedAs for T
Source§fn unwrapped_as<Dst>(self) -> Dstwhere
T: UnwrappedCast<Dst>,
fn unwrapped_as<Dst>(self) -> Dstwhere
T: UnwrappedCast<Dst>,
Casts the value.
Source§impl<Src, Dst> UnwrappedCastFrom<Src> for Dstwhere
Src: UnwrappedCast<Dst>,
impl<Src, Dst> UnwrappedCastFrom<Src> for Dstwhere
Src: UnwrappedCast<Dst>,
Source§fn unwrapped_cast_from(src: Src) -> Dst
fn unwrapped_cast_from(src: Src) -> Dst
Casts the value.
Source§impl<T> WrappingAs for T
impl<T> WrappingAs for T
Source§fn wrapping_as<Dst>(self) -> Dstwhere
T: WrappingCast<Dst>,
fn wrapping_as<Dst>(self) -> Dstwhere
T: WrappingCast<Dst>,
Casts the value.
Source§impl<Src, Dst> WrappingCastFrom<Src> for Dstwhere
Src: WrappingCast<Dst>,
impl<Src, Dst> WrappingCastFrom<Src> for Dstwhere
Src: WrappingCast<Dst>,
Source§fn wrapping_cast_from(src: Src) -> Dst
fn wrapping_cast_from(src: Src) -> Dst
Casts the value.