robot_description_builder/joint/smartjointbuilder/smartparams/
dynamics.rs

1use crate::joint::{
2	joint_data,
3	jointbuilder::JointBuilder,
4	smartjointbuilder::{smart_joint_datatraits, SmartJointBuilder},
5};
6
7/// A trait to label a `SmartJointType` that is allowed to have a dynamics data.
8pub trait DynamicsAllowed {}
9
10/// A type to significy that no [`Dynamics`](joint_data::DynamicsData) was specified.
11#[derive(Debug, Default, Clone)]
12pub struct NoDynamics;
13impl smart_joint_datatraits::DynamicsDataType for NoDynamics {}
14
15#[derive(Debug, Default, Clone)]
16pub struct WithDynamics {
17	damping: Option<f32>,
18	friction: Option<f32>,
19}
20
21impl From<WithDynamics> for joint_data::DynamicsData {
22	fn from(value: WithDynamics) -> Self {
23		Self {
24			damping: value.damping,
25			friction: value.friction,
26		}
27	}
28}
29
30impl smart_joint_datatraits::DynamicsDataType for WithDynamics {
31	fn simplify(&self, joint_builder: &mut JointBuilder) {
32		joint_builder.with_dynamics_data(self.clone().into());
33	}
34}
35
36impl<Type, Axis, Calibration, Limit, Mimic, SafetyController>
37	SmartJointBuilder<Type, Axis, Calibration, NoDynamics, Limit, Mimic, SafetyController>
38where
39	Type: DynamicsAllowed,
40	Axis: smart_joint_datatraits::AxisDataType,
41	Calibration: smart_joint_datatraits::CalibrationDataType,
42	Limit: smart_joint_datatraits::LimitDataType,
43	Mimic: smart_joint_datatraits::MimicDataType,
44	SafetyController: smart_joint_datatraits::SafetyControllerDataType,
45{
46	pub fn with_dynamics(
47		self,
48	) -> SmartJointBuilder<Type, Axis, Calibration, WithDynamics, Limit, Mimic, SafetyController> {
49		SmartJointBuilder {
50			name: self.name,
51			joint_type: self.joint_type,
52			transform: self.transform,
53			axis: self.axis,
54			calibration: self.calibration,
55			dynamics: WithDynamics::default(),
56			limit: self.limit,
57			mimic: self.mimic,
58			safety_controller: self.safety_controller,
59		}
60	}
61}
62
63impl<Type, Axis, Calibration, Limit, Mimic, SafetyController>
64	SmartJointBuilder<Type, Axis, Calibration, WithDynamics, Limit, Mimic, SafetyController>
65where
66	Type: DynamicsAllowed,
67	Axis: smart_joint_datatraits::AxisDataType,
68	Calibration: smart_joint_datatraits::CalibrationDataType,
69	Limit: smart_joint_datatraits::LimitDataType,
70	Mimic: smart_joint_datatraits::MimicDataType,
71	SafetyController: smart_joint_datatraits::SafetyControllerDataType,
72{
73	pub fn set_damping(mut self, damping: f32) -> Self {
74		self.dynamics.damping = Some(damping);
75		self
76	}
77
78	pub fn damping(&self) -> Option<f32> {
79		self.dynamics.damping
80	}
81
82	pub fn set_friction(mut self, friction: f32) -> Self {
83		self.dynamics.friction = Some(friction);
84		self
85	}
86
87	pub fn friction(&self) -> Option<f32> {
88		self.dynamics.friction
89	}
90}