robot_description_builder/joint/smartjointbuilder/smartparams/
calibration.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 calibration element.
8pub trait CalibrationAllowed {}
9
10/// A type to significy that no [`Calibration`](joint_data::CalibrationData) was specified.
11#[derive(Debug, Default, Clone)]
12pub struct NoCalibration;
13impl smart_joint_datatraits::CalibrationDataType for NoCalibration {}
14
15#[derive(Debug, Default, Clone)]
16pub struct WithCalibration {
17	rising: Option<f32>,
18	falling: Option<f32>,
19}
20
21impl From<WithCalibration> for joint_data::CalibrationData {
22	fn from(value: WithCalibration) -> Self {
23		Self {
24			rising: value.rising,
25			falling: value.falling,
26		}
27	}
28}
29
30impl smart_joint_datatraits::CalibrationDataType for WithCalibration {
31	fn simplify(&self, joint_builder: &mut JointBuilder) {
32		joint_builder.with_calibration_data(self.clone().into());
33	}
34}
35
36impl<Type, Axis, Dynamics, Limit, Mimic, SafetyController>
37	SmartJointBuilder<Type, Axis, NoCalibration, Dynamics, Limit, Mimic, SafetyController>
38where
39	Type: CalibrationAllowed,
40	Axis: smart_joint_datatraits::AxisDataType,
41	Dynamics: smart_joint_datatraits::DynamicsDataType,
42	Limit: smart_joint_datatraits::LimitDataType,
43	Mimic: smart_joint_datatraits::MimicDataType,
44	SafetyController: smart_joint_datatraits::SafetyControllerDataType,
45{
46	pub fn with_calibration(
47		self,
48	) -> SmartJointBuilder<Type, Axis, WithCalibration, Dynamics, 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: WithCalibration::default(),
55			dynamics: self.dynamics,
56			limit: self.limit,
57			mimic: self.mimic,
58			safety_controller: self.safety_controller,
59		}
60	}
61}
62
63impl<Type, Axis, Dynamics, Limit, Mimic, SafetyController>
64	SmartJointBuilder<Type, Axis, WithCalibration, Dynamics, Limit, Mimic, SafetyController>
65where
66	Type: CalibrationAllowed,
67	Axis: smart_joint_datatraits::AxisDataType,
68	Dynamics: smart_joint_datatraits::DynamicsDataType,
69	Limit: smart_joint_datatraits::LimitDataType,
70	Mimic: smart_joint_datatraits::MimicDataType,
71	SafetyController: smart_joint_datatraits::SafetyControllerDataType,
72{
73	pub fn set_rising_calibration(mut self, rising: f32) -> Self {
74		self.calibration.rising = Some(rising);
75		self
76	}
77
78	pub fn rising_calibration(&self) -> Option<f32> {
79		self.calibration.rising
80	}
81
82	pub fn set_falling_calibration(mut self, falling: f32) -> Self {
83		self.calibration.falling = Some(falling);
84		self
85	}
86
87	pub fn falling_calibration(&self) -> Option<f32> {
88		self.calibration.falling
89	}
90}