Fang-Robotics-MCB
Fang Robotics Team Codebase
Loading...
Searching...
No Matches
dual_modded_pid.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "modded_pid.hpp"
5
6namespace trap::algorithms
7{
27template
28<
29 typename MainType,
30 typename IntermediateType,
31 typename OutputType,
32 typename TimeType,
33 typename MainError = MainType,
34 typename IntermediateError = IntermediateType
35>
37{
38public:
43
49
51 const Config& config,
52 std::unique_ptr<MainModder> mainModder = std::make_unique<NullPidModder<IntermediateType>>(),
53 std::unique_ptr<IntermediateModder> intermediateModder = std::make_unique<NullPidModder<OutputType>>()
54 )
55 :
56 mainPid_{config.mainPidConfig},
57 intermediatePid_{config.intermediatePidConfig},
58 mainModder_(std::move(mainModder)),
59 intermediateModder_(std::move(intermediateModder))
60 {
61 }
62
71 OutputType runController(const MainType& mainCurrent, const IntermediateType& intermediateCurrent)
72 {
73 const TimeType kDeltaTime{static_cast<TimeType>(runControllerTimer_.getDurationAndReset())};
74 return runController(mainCurrent, intermediateCurrent, kDeltaTime);
75 }
76
81 OutputType runController(
82 const MainType& mainCurrent,
83 const IntermediateType& intermediateCurrent,
84 const TimeType& deltaTime
85 )
86 {
87 const MainType kMainError{
88 MainError{mainTarget_}
89 - MainError{mainCurrent}
90 };
91
92 const IntermediateType kIntermediateTarget{
93 mainPid_.runController(
94 kMainError,
95 deltaTime
96 )
97 };
98
99 const IntermediateType kModdedIntermediateTarget{mainModder_->getModdedOutput(kIntermediateTarget)};
100
101 const IntermediateType kIntermediateError{
102 IntermediateError{kModdedIntermediateTarget}
103 - IntermediateError{intermediateCurrent}
104 };
105
106 const OutputType kOutput{
107 intermediatePid_.runController(
108 kIntermediateError,
109 deltaTime
110 )
111 };
112
113 const OutputType kModdedOutput{intermediateModder_->getModdedOutput(kOutput)};
114
115 return kModdedOutput;
116 }
117
118 void setTarget(const MainType& mainTarget)
119 {
120 mainTarget_ = mainTarget;
121 }
122private:
123 MainPid mainPid_;
124 IntermediatePid intermediatePid_;
125
126 std::unique_ptr<MainModder> mainModder_;
127 std::unique_ptr<IntermediateModder> intermediateModder_;
128
129 MainType mainTarget_{};
130 fang::chrono::SimpleTimer runControllerTimer_{};
131};
132}
Definition simple_timer.hpp:12
Microseconds getDurationAndReset()
Definition simple_timer.cpp:20
Definition dual_modded_pid.hpp:37
ModdedPid< IntermediateType, OutputType, TimeType > IntermediatePid
Definition dual_modded_pid.hpp:40
void setTarget(const MainType &mainTarget)
Definition dual_modded_pid.hpp:118
OutputType runController(const MainType &mainCurrent, const IntermediateType &intermediateCurrent)
Definition dual_modded_pid.hpp:71
DualModdedPid(const Config &config, std::unique_ptr< MainModder > mainModder=std::make_unique< NullPidModder< IntermediateType > >(), std::unique_ptr< IntermediateModder > intermediateModder=std::make_unique< NullPidModder< OutputType > >())
Definition dual_modded_pid.hpp:50
ModdedPid< MainType, IntermediateType, TimeType > MainPid
Definition dual_modded_pid.hpp:39
OutputType runController(const MainType &mainCurrent, const IntermediateType &intermediateCurrent, const TimeType &deltaTime)
Definition dual_modded_pid.hpp:81
Definition ipid_modder.hpp:14
ControlType runController(ErrorType error)
Definition modded_pid.hpp:32
Definition ipid_modder.hpp:28
Definition pwm_info.hpp:4
Definition dimensional_smooth_pid.hpp:10
Definition smooth_pid.hpp:36
Definition dual_modded_pid.hpp:45
IntermediatePid::Config intermediatePidConfig
Definition dual_modded_pid.hpp:47
MainPid::Config mainPidConfig
Definition dual_modded_pid.hpp:46