use crate::math::{DVec, SpatialTransform};
#[derive(Debug, Clone)]
pub struct State {
pub q: DVec,
pub v: DVec,
pub ctrl: DVec,
pub time: f64,
pub body_xform: Vec<SpatialTransform>,
pub qfrc_external: DVec,
}
impl State {
pub fn new(nq: usize, nv: usize, nbodies: usize) -> Self {
Self {
q: DVec::zeros(nq),
v: DVec::zeros(nv),
ctrl: DVec::zeros(nv),
time: 0.0,
body_xform: vec![SpatialTransform::identity(); nbodies],
qfrc_external: DVec::zeros(nv),
}
}
pub fn kinetic_energy(&self, mass_matrix: &crate::math::DMat) -> f64 {
0.5 * self.v.dot(&(mass_matrix * &self.v))
}
}