Fang-Robotics-MCB
Fang Robotics Team Codebase
Loading...
Searching...
No Matches
dual_cascade_pid.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "smooth_pid.hpp"
5
6namespace trap::algorithms
7{
27 template
28 <
29 typename MainType,
30 typename IntermediateType,
31 typename OutputType,
32 typename TimeType,
33 typename MainError = MainType,
34 typename IntermediateError = IntermediateType
35 >
37 {
38 public:
48
50 :
51 mainPid_{config.mainPidConfig, config.mainPidInitialValue},
52 intermediatePid_{config.intermediatePidConfig, config.intermediatePidInitialValue}
53 {
54 }
55
64 OutputType runController(const MainType& mainCurrent, const IntermediateType& intermediateCurrent)
65 {
66 const TimeType kDeltaTime{static_cast<TimeType>(runControllerTimer_.getDurationAndReset())};
67 return runController(mainCurrent, intermediateCurrent, kDeltaTime);
68 }
69
74 OutputType runController(
75 const MainType& mainCurrent,
76 const IntermediateType& intermediateCurrent,
77 const TimeType& deltaTime
78 )
79 {
80 const MainType kMainError{
81 MainError{mainTarget_}
82 - MainError{mainCurrent}
83 };
84
85 static MainType mainError{};
86 mainError = kMainError;
87
88 const IntermediateType kIntermediateTarget{
89 mainPid_.runController(
90 kMainError,
91 deltaTime
92 )
93 };
94
95 static IntermediateType intermediateTarget{};
96 intermediateTarget = kIntermediateTarget;
97
98 const IntermediateType kIntermediateError{
99 IntermediateError{kIntermediateTarget}
100 - IntermediateError{intermediateCurrent}
101 };
102
103 static IntermediateType intermediateError{};
104 intermediateError = kIntermediateError;
105
106 const OutputType kOutput{
107 intermediatePid_.runController(
108 kIntermediateError,
109 deltaTime
110 )
111 };
112
113 static OutputType output{};
114 output = kOutput;
115
116 return kOutput;
117 }
118
119 void setTarget(const MainType& mainTarget)
120 {
121 mainTarget_ = mainTarget;
122 }
123 private:
124 MainPid mainPid_;
125 IntermediatePid intermediatePid_;
126
127 MainType mainTarget_{};
128 fang::chrono::SimpleTimer runControllerTimer_{};
129 };
130}
Definition simple_timer.hpp:12
Microseconds getDurationAndReset()
Definition simple_timer.cpp:20
Definition dual_cascade_pid.hpp:37
DualCascadePid(const Config &config)
Definition dual_cascade_pid.hpp:49
OutputType runController(const MainType &mainCurrent, const IntermediateType &intermediateCurrent, const TimeType &deltaTime)
Definition dual_cascade_pid.hpp:74
SmoothPid< MainType, IntermediateType, TimeType > MainPid
Definition dual_cascade_pid.hpp:39
void setTarget(const MainType &mainTarget)
Definition dual_cascade_pid.hpp:119
SmoothPid< IntermediateType, OutputType, TimeType > IntermediatePid
Definition dual_cascade_pid.hpp:40
OutputType runController(const MainType &mainCurrent, const IntermediateType &intermediateCurrent)
Definition dual_cascade_pid.hpp:64
ControlType runController(ErrorType error)
Definition smooth_pid.hpp:37
Definition pwm_info.hpp:4
Definition dimensional_smooth_pid.hpp:10
Definition smooth_pid.hpp:36
Definition dual_cascade_pid.hpp:42
IntermediateType intermediatePidInitialValue
Definition dual_cascade_pid.hpp:46
MainType mainPidInitialValue
Definition dual_cascade_pid.hpp:45
IntermediatePid::Config intermediatePidConfig
Definition dual_cascade_pid.hpp:44
MainPid::Config mainPidConfig
Definition dual_cascade_pid.hpp:43