dynamics_joint/
joint_data.rs1use crate::{
4 continuous::JointDataContinuous, fixed::JointDataFixed, joint::JointWrapper,
5 prismatic::JointDataPrismatic, revolute::JointDataRevolute,
6};
7use dynamics_spatial::{configuration::Configuration, motion::SpatialMotion, se3::SE3};
8
9#[derive(Clone, Debug)]
10enum JointDataImpl {
16 Continuous(JointDataContinuous),
17 Prismatic(JointDataPrismatic),
18 Revolute(JointDataRevolute),
19 Fixed(JointDataFixed),
20}
21
22#[derive(Clone, Debug)]
23pub struct JointDataWrapper {
29 inner: JointDataImpl,
30}
31
32pub trait JointData {
34 fn get_joint_q(&self) -> &Configuration;
36
37 fn get_joint_v(&self) -> &Configuration;
39
40 fn get_joint_placement(&self) -> SE3;
42
43 fn update(
45 &mut self,
46 joint_model: &JointWrapper,
47 joint_q: &Configuration,
48 joint_v: Option<&Configuration>,
49 );
50
51 fn get_joint_velocity(&self) -> &SpatialMotion;
53}
54
55impl JointDataWrapper {
56 pub fn continuous(joint_data: JointDataContinuous) -> Self {
58 JointDataWrapper {
59 inner: JointDataImpl::Continuous(joint_data),
60 }
61 }
62
63 pub fn prismatic(joint_data: JointDataPrismatic) -> Self {
65 JointDataWrapper {
66 inner: JointDataImpl::Prismatic(joint_data),
67 }
68 }
69
70 pub fn revolute(joint_data: JointDataRevolute) -> Self {
72 JointDataWrapper {
73 inner: JointDataImpl::Revolute(joint_data),
74 }
75 }
76
77 pub fn fixed(joint_data: JointDataFixed) -> Self {
79 JointDataWrapper {
80 inner: JointDataImpl::Fixed(joint_data),
81 }
82 }
83}
84
85impl JointData for JointDataWrapper {
87 fn get_joint_q(&self) -> &Configuration {
88 match &self.inner {
89 JointDataImpl::Continuous(joint_data) => joint_data.get_joint_q(),
90 JointDataImpl::Prismatic(joint_data) => joint_data.get_joint_q(),
91 JointDataImpl::Revolute(joint_data) => joint_data.get_joint_q(),
92 JointDataImpl::Fixed(joint_data) => joint_data.get_joint_q(),
93 }
94 }
95
96 fn get_joint_v(&self) -> &Configuration {
97 match &self.inner {
98 JointDataImpl::Continuous(joint_data) => joint_data.get_joint_v(),
99 JointDataImpl::Prismatic(joint_data) => joint_data.get_joint_v(),
100 JointDataImpl::Revolute(joint_data) => joint_data.get_joint_v(),
101 JointDataImpl::Fixed(joint_data) => joint_data.get_joint_v(),
102 }
103 }
104
105 fn get_joint_placement(&self) -> SE3 {
106 match &self.inner {
107 JointDataImpl::Continuous(joint_data) => joint_data.get_joint_placement(),
108 JointDataImpl::Prismatic(joint_data) => joint_data.get_joint_placement(),
109 JointDataImpl::Revolute(joint_data) => joint_data.get_joint_placement(),
110 JointDataImpl::Fixed(joint_data) => joint_data.get_joint_placement(),
111 }
112 }
113
114 fn update(
115 &mut self,
116 joint_model: &JointWrapper,
117 joint_q: &Configuration,
118 joint_v: Option<&Configuration>,
119 ) {
120 match &mut self.inner {
121 JointDataImpl::Continuous(joint_data) => {
122 joint_data.update(joint_model, joint_q, joint_v)
123 }
124 JointDataImpl::Prismatic(joint_data) => {
125 joint_data.update(joint_model, joint_q, joint_v)
126 }
127 JointDataImpl::Revolute(joint_data) => joint_data.update(joint_model, joint_q, joint_v),
128 JointDataImpl::Fixed(joint_data) => joint_data.update(joint_model, joint_q, joint_v),
129 }
130 }
131
132 fn get_joint_velocity(&self) -> &SpatialMotion {
133 match &self.inner {
134 JointDataImpl::Continuous(joint_data) => joint_data.get_joint_velocity(),
135 JointDataImpl::Prismatic(joint_data) => joint_data.get_joint_velocity(),
136 JointDataImpl::Revolute(joint_data) => joint_data.get_joint_velocity(),
137 JointDataImpl::Fixed(joint_data) => joint_data.get_joint_velocity(),
138 }
139 }
140}