#quaternions #vector-math #vector

no-std quaternion-core

Provides quaternion operations and interconversion with several attitude representations

12 unstable releases (4 breaking)

0.5.0 Nov 30, 2023
0.4.2 Jun 2, 2023
0.4.0 Feb 4, 2023
0.3.5 Dec 25, 2022
0.3.4 Jul 27, 2022

#67 in Math

Download history 63/week @ 2023-12-12 18/week @ 2023-12-19 3/week @ 2024-01-09 15/week @ 2024-01-16 40/week @ 2024-01-23 165/week @ 2024-01-30 257/week @ 2024-02-06 373/week @ 2024-02-13 381/week @ 2024-02-20 550/week @ 2024-02-27 443/week @ 2024-03-05 425/week @ 2024-03-12 607/week @ 2024-03-19 392/week @ 2024-03-26

1,922 downloads per month
Used in quaternion-wrapper

MIT/Apache

83KB
1K SLoC

quaternion-core

Latest version Documentation Minimum rustc License

Quaternion library written in Rust.

This provides Quaternion operations and interconversion with several attitude representations as generic functions (supports f32 & f64).

Additionally, it also works in a no_std environment!

Usage

Add this to your Cargo.toml:

[dependencies]
quaternion-core = "0.5"

For use in a no_std environment:

[dependencies.quaternion-core]
version = "0.5"
default-features = false
features = ["libm"]

Conversion

Conversion

Interconversion with 24 different euler angles (12 each of Intrinsic and Extrinsic) is possible!!

Other interconversions with axis/angle and rotation vector are also possible.

Features

fma

When this feature is enabled, the mul_add method will be used internally as much as possible. That is, (s * a) + b will be expanded as s.mul_add(a, b) at compile time.

This crate uses the mul_add method mainly to improve calculation speed, but if the CPU does not support the FMA (Fused Multiply-Add) instruction or if the libm feature is enabled, then the calculation is performed by the software implementation. In this case, it may be rather slower than if the fma feature is not enabled.

libm

If you set default-features=false (do not import std), you must enable this feature.

In this case, mathematical functions (e.g. sin, cos, sqrt ...) are provided by libm crate.

norm-sqrt

When this feature is enabled, the default norm(a) implementation is compiled with dot(a, a).sqrt() instead.

By default, the norm(a) function is implemented in such a way that overflow and underflow are less likely to occur than with dot(a, a).sqrt(). However, if extremely large values are not input and underflow is not that much of a concern, dot(a, a).sqrt() is sufficient (and dot(a, a).sqrt() is faster than the default implementation in most cases).

serde-serialize

When this feature is enabled, RotationSequence and RotationType will both implement serde::Serialize and serde::Deserialize.

Example

src/main.rs:

use quaternion_core as quat;

const PI: f64 = std::f64::consts::PI;
const EPSILON: f64 = 1e-12;

fn main() {
    // Generates a quaternion representing the
    // rotation of π/2[rad] around the y-axis.
    let q = quat::from_axis_angle([0.0, 1.0, 0.0], PI/2.0);

    // Rotate the point.
    let r = quat::point_rotation(q, [2.0, 2.0, 0.0]);

    // Check if the calculation is correct.
    let diff = quat::sub([0.0, 2.0, -2.0], r);
    for val in diff {
        assert!( val.abs() < EPSILON );
    }
}

Releases

Release notes are available in RELEASES.md.

License

Licensed under either of Apache License, Version 2.0 or MIT License at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Dependencies

~98–390KB