Quaternion
library written in Rust.
This provides basic operations on Quaternion and conversions to and from several attitude representations as generic functions (Supports f32 & f64).
Add this to your Cargo.toml
:
toml
[dependencies]
quaternion-core = "0.2"
Interconversion with 24 different Euler angles (12 each of Intrinsic
and Extrinsic
) is possible!!
Cargo.toml
:
```toml [dependencies.quaternion-core] version = "0.2"
```
fma
featureThis library uses the muladd method mainly to improve the performance, but by default it is replace with a unfused multiply-add (s*a + b
) . If you wish to use muladd method, enable the fma
feature.
If your CPU does not support FMA instructions, or if you use libm
(running in no_std environment), enabling the fma
feature may cause slowdown of computation speed. Also, due to rounding error, results of s.mul_add(a, b)
and s*a + b
will not match perfectly.
simd
featureAttension!! : This feature may have bugs and should not be enabled at first.
By enabling this feature, the SIMD implementation using the std::arch module can be used in some functions.
Currently (version="0.2.0"
) only x86
and x86_64
architectures are supported.
To enable this feature, CPU must support these instruction sets:
SSE, SSE2, SSE3, SSE4.1, AVX, FMA
Also, specify the -C target-cpu
flag to the compiler as follows:
console
$ RUSTFLAGS='-C target-cpu=native' cargo build
libm
feature and default-feature = false
These options allow for use in the no_std
environment.
In this case, mathematical functions (e.g. sin, cos, sqrt ...) are provided by libm
.
src/main.rs
:
```rust use quaternion_core as quat;
const PI: f64 = std::f64::consts::PI; const EPSILON: f64 = 1e-14;
fn main() { // Point let r = [2.0, 2.0, 0.0];
// 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);
let result = quat::point_rotation(q, r);
// Check if the calculation is correct.
let diff = quat::sub_vec([0.0, 2.0, -2.0], result);
for val in diff {
assert!( val.abs() < EPSILON );
}
} ```
Licensed under either of Apache License, Version 2.0 or MIT License at your option.
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.