Fang-Robotics-MCB
Fang Robotics Team Codebase
Loading...
Searching...
No Matches
dual_cascade_motor.hpp
Go to the documentation of this file.
1#pragma once
2
6
8
10
11#include <memory>
12
13namespace fang::motor
14{
22 template
23 <
24 typename Output,
25 typename Control,
26 typename Intermediate,
27 typename Time = Seconds,
28 typename MainError = Control,
29 typename IntermediateError = Intermediate
30 >
31 class DualCascadeMotor : virtual public system::ISystem
32 {
33 public:
38 <
39 Control,
40 Intermediate,
41 Output,
42 Time,
43 MainError,
44 IntermediateError
45 >;
47
49 const Config& config,
50 std::unique_ptr<ControlledMotor> motor,
51 std::unique_ptr<ControlTelemetry> controlTelemetry,
52 std::unique_ptr<IntermediateTelemetry> intermediateTelemetry
53 ):
54 pid_{config},
55 motor_{std::move(motor)},
56 controlTelemetry_{std::move(controlTelemetry)},
57 intermediateTelemetry_{std::move(intermediateTelemetry)}
58 {
59 }
60
61 void initialize() override
62 {
63 motor_->initialize();
64 }
65
66 void update() override
67 {
68 syncMotorToPid();
69 motor_->update();
70 }
71
76 void update(const Time& delta)
77 {
78 const Output kOutput
79 {
80 pid_.runController(
81 controlTelemetry_->getData(),
82 intermediateTelemetry_->getData(),
83 delta
84 )
85 };
86 motor_->setTargetOutput(kOutput);
87 motor_->update();
88 }
89
90 void setTarget(const Control& control)
91 {
92 pid_.setTarget(control);
93 }
94
95 private:
96 Pid pid_;
97 std::unique_ptr<ControlledMotor> motor_;
98 std::unique_ptr<ControlTelemetry> controlTelemetry_;
99 std::unique_ptr<IntermediateTelemetry> intermediateTelemetry_;
100
101 void syncMotorToPid()
102 {
103 const Output kOutput
104 {
105 pid_.runController(
106 controlTelemetry_->getData(),
107 intermediateTelemetry_->getData()
108 )
109 };
110 motor_->setTargetOutput(kOutput);
111 }
112 };
113}
Definition dual_cascade_motor.hpp:32
telemetry::ITelemetry< Intermediate > IntermediateTelemetry
Definition dual_cascade_motor.hpp:36
void setTarget(const Control &control)
Definition dual_cascade_motor.hpp:90
DualCascadeMotor(const Config &config, std::unique_ptr< ControlledMotor > motor, std::unique_ptr< ControlTelemetry > controlTelemetry, std::unique_ptr< IntermediateTelemetry > intermediateTelemetry)
Definition dual_cascade_motor.hpp:48
IOutputMotor< Output > ControlledMotor
Definition dual_cascade_motor.hpp:34
void update(const Time &delta)
Definition dual_cascade_motor.hpp:76
void initialize() override
Definition dual_cascade_motor.hpp:61
trap::algorithms::DualCascadePid< Control, Intermediate, Output, Time, MainError, IntermediateError > Pid
Definition dual_cascade_motor.hpp:45
void update() override
Definition dual_cascade_motor.hpp:66
telemetry::ITelemetry< Control > ControlTelemetry
Definition dual_cascade_motor.hpp:35
Definition dual_cascade_pid.hpp:37
void setTarget(const MainType &mainTarget)
Definition dual_cascade_pid.hpp:119
OutputType runController(const MainType &mainCurrent, const IntermediateType &intermediateCurrent)
Definition dual_cascade_pid.hpp:64
Definition pwm_info.hpp:4
Definition directionality.hpp:6
rail::motor::IOutputMotor< Output > IOutputMotor
Definition ioutput_motor.hpp:7
rail::system::ISystem ISystem
Definition isystem.hpp:5
rail::telemetry::ITelemetry< DataType > ITelemetry
Definition itelemetry.hpp:8
Definition brushlessutils.cpp:4
Definition dual_cascade_pid.hpp:42
units::time::second_t Seconds
Definition units_alias.hpp:11