# liealg
## Lie group and Lie algebra in rust
## introduction
*liealg* is a library for computing Lie algebra and Lie group in 3D space(SO3 and SE3).
### domain
*liealg* is mainly used in robot kinematics and other related area. If you want to do some general Lie group and Lie algebra calculations, it is better not to use this library.
## get started
add dependency in your `Cargo.toml`:
```toml
[dependencies]
liealg = "0.1.1"
```
or use `cargo add`:
```bash
cargo add liealg
```
## design
entities in *liealg* are related as follows:
```mermaid
graph TD;
A[Vec3]-->|hat|B[so3];
B-->|vee|A;
B-->|exp|C[SO3];
C-->|log|B;
C-->|adjoint|D[AdjSO3];
E[Vec6]-->|hat|F[se3];
F-->|vee|E;
F-->|exp|J[SE3];
J-->|log|F;
J-->|adjoint|K[AdjSE3];
```
and SO3 and SE3 can multiply matrices, take inverse and 3D point.
## usage
### SO3
```rust
use liealg::prelude::*;
use liealg::{Vec3, Point};
// construct Vec3
let v = Vec3::new(0., 0., 1.) * FRAC_PI_2;
// hat convert Vec3 to so3
let so3 = v.hat();
// exp convert so3 to SO3
let rot = so3.exp();
// SO3 mat_mul
let _ = rot.mat_mul(&other);
// SO3 inverse
let rot_inv = rot.inv();
// SO3 act on 3D point
let point = Point::new(1., 2., 3.);
let _ = rot.act(&point);
```
### SE3
```rust
use liealg::prelude::*;
use liealg::{Vec3, Point};
// construct Vec6
let v = Vec6::new([0., 0., 1], [0., -1., 0.]) * FRAC_PI_2;
// hat convert Vec6 to se3
let se3 = v.hat();
// exp convert se3 to SE3
let t = se3.exp();
// SE3 mat_mul
let _ = t.mat_mul(&other);
// SE3 inverse
let inv = rot.inv();
// SE3 act on 3D point
let point = Point::new(1., 2., 3.);
let _ = rot.act(&point);
```