multibody_dynamics/
math_functions.rs1#![allow(non_snake_case)]
2#![allow(dead_code)]
3extern crate nalgebra as na;
4
5use na::{Dyn, Isometry3, Matrix3, Matrix6, OMatrix, OVector, SMatrix, Vector3, Vector6};
6
7pub fn Ad_inv(h: &Isometry3<f64>) -> Matrix6<f64> {
8 let mut Ad_h_inv = Matrix6::zeros();
9 let h_inv = h.inverse().to_homogeneous();
12 let R_inv = h_inv.fixed_view::<3, 3>(0, 0);
13 let p: Vector3<f64> = h_inv.fixed_view::<3, 1>(0, 3).into();
14
15 Ad_h_inv.fixed_view_mut::<3, 3>(0, 0).copy_from(&R_inv);
16
17 Ad_h_inv
18 .fixed_view_mut::<3, 3>(0, 3)
19 .copy_from(&(skew(&p) * R_inv));
20 Ad_h_inv.fixed_view_mut::<3, 3>(3, 3).copy_from(&R_inv);
21 Ad_h_inv
22}
23
24pub fn Ad(h: &Isometry3<f64>) -> Matrix6<f64> {
25 let mut Ad_h = Matrix6::zeros();
26 let h = h.to_homogeneous();
27 let R = h.fixed_view::<3, 3>(0, 0);
28 let p: Vector3<f64> = h.fixed_view::<3, 1>(0, 3).into();
29
30 Ad_h.fixed_view_mut::<3, 3>(0, 0).copy_from(&R);
31
32 Ad_h.fixed_view_mut::<3, 3>(0, 3).copy_from(&(skew(&p) * R));
33 Ad_h.fixed_view_mut::<3, 3>(3, 3).copy_from(&R);
34 Ad_h
35}
36
37pub fn skew<T: na::RealField + Copy>(v: &Vector3<T>) -> Matrix3<T> {
38 let mut skew = Matrix3::<T>::zeros();
39 skew[(0, 1)] = -v[2];
40 skew[(0, 2)] = v[1];
41 skew[(1, 0)] = v[2];
42 skew[(1, 2)] = -v[0];
43 skew[(2, 0)] = -v[1];
44 skew[(2, 1)] = v[0];
45 skew
46}
47
48pub fn ad_se3(v: &Vector6<f64>) -> SMatrix<f64, 6, 6> {
49 let mut ad = SMatrix::<f64, 6, 6>::zeros();
50 let lin_vel = v.fixed_view::<3, 1>(0, 0).into();
51 let ang_vel = v.fixed_view::<3, 1>(3, 0).into();
52
53 ad.fixed_view_mut::<3, 3>(0, 0).copy_from(&skew(&ang_vel));
54 ad.fixed_view_mut::<3, 3>(0, 3).copy_from(&skew(&lin_vel));
55 ad.fixed_view_mut::<3, 3>(3, 3).copy_from(&skew(&ang_vel));
56
57 ad
58}
59
60pub fn ad_se3_dyn(v: &OVector<f64, Dyn>) -> OMatrix<f64, Dyn, Dyn> {
61 let mut ad = OMatrix::<f64, Dyn, Dyn>::zeros(6, 6);
62 let lin_vel = v.rows(0, 3).into();
66 let ang_vel = v.rows(3, 3).into();
67
68 ad.view_mut((0, 0), (3, 3)).copy_from(&skew_dyn(&ang_vel));
72 ad.view_mut((0, 3), (3, 3)).copy_from(&skew_dyn(&lin_vel));
73 ad.view_mut((3, 3), (3, 3)).copy_from(&skew_dyn(&ang_vel));
74
75 ad
76}
77
78fn skew_dyn(v: &OVector<f64, Dyn>) -> Matrix3<f64> {
79 let mut skew = Matrix3::zeros();
80 skew[(0, 1)] = -v[2];
81 skew[(0, 2)] = v[1];
82 skew[(1, 0)] = v[2];
83 skew[(1, 2)] = -v[0];
84 skew[(2, 0)] = -v[1];
85 skew[(2, 1)] = v[0];
86 skew
87}
88
89pub fn comp_rb_mass_matrix(m: f64, r: &Vector3<f64>, inertia_mat: &Matrix3<f64>) -> Matrix6<f64> {
90 let mut mass_matrix = Matrix6::zeros();
91 let skew_r = skew(r);
92
93 mass_matrix
94 .fixed_view_mut::<3, 3>(0, 0)
95 .copy_from(&(m * Matrix3::identity()));
96 mass_matrix
97 .fixed_view_mut::<3, 3>(0, 3)
98 .copy_from(&(-m * skew_r));
99 mass_matrix
100 .fixed_view_mut::<3, 3>(3, 0)
101 .copy_from(&(m * skew_r));
102 mass_matrix
103 .fixed_view_mut::<3, 3>(3, 3)
104 .copy_from(inertia_mat);
105 mass_matrix
106}