TR-mbed 1.0
Loading...
Searching...
No Matches
PIDTuner.h
Go to the documentation of this file.
1#ifndef TR_EMBEDDED_PIDTUNER_H
2#define TR_EMBEDDED_PIDTUNER_H
3#include "../motor/DJIMotor.h"
4#include <random>
5#include <chrono>
6#include <vector>
7
8using fitnessFunction = std::function<double(double)>;
9
11 double kP = 0;
12 double kI = 0;
13 double kD = 0;
14
17
18 void dumpPIDs() const{
19 printf("kP: %lf kI: %lf kD: %lf\n", kP, kI, kD);
20 }
21
22 void dumpIntegrals() const{
23 printf("IAE: %lf ISE: %lf\n", meanIntegralAbsError, meanIntegralSqError);
24 }
25
26 void dumpData() const{
27 printf("kP: %lf kI: %lf kD: %lf\n", kP, kI, kD);
28 printf("IAE: %lf ISE: %lf\n\n", meanIntegralAbsError, meanIntegralSqError);
29 }
30};
31
32struct PIDRanges{
33 double kPMin;
34 double kPMax;
35 double kIMin;
36 double kIMax;
37 double kDMin;
38 double kDMax;
39};
40
41class PIDTuner {
42public:
43 PIDTuner(DJIMotor &motor_, PIDDataSet population[], size_t populationSize, PIDRanges ranges = {0, 30, 0, 10, 0, 1000});
44
45 /*
46 * getFitness can be any function that converts the integralAbsError to fitness
47 * e.g., a/x, a^-x, a - x
48 */
49 void tune(unsigned long time_s, size_t iterations, size_t generations, std::vector<PIDDataSet> &best, double mutationRate = 0.01, fitnessFunction getFitness = [](double integral){return 1 / integral;});
50
51 ~PIDTuner() = default;
52
53 double getRandomNumber(double min, double max);
54
55private:
56 DJIMotor &motor;
57 fitnessFunction getFitness;
58
59 size_t populationSize;
60 PIDDataSet *population;
61
62 double mutationRate;
63
64 std::random_device device;
65 std::mt19937 mt;
66
67 void randomizePosition();
68 void getProbabilities(double probabilities[]);
69 PIDDataSet crossover(PIDDataSet &parent1, PIDDataSet &parent2);
70 PIDDataSet select(const double probabilities[]);
71 void mutate(PIDDataSet &child);
72 void nextGeneration();
73};
74
75
76
77#endif //TR_EMBEDDED_PIDTUNER_H
std::function< double(double)> fitnessFunction
Definition PIDTuner.h:8
Definition DJIMotor.h:54
Definition PIDTuner.h:41
~PIDTuner()=default
void tune(unsigned long time_s, size_t iterations, size_t generations, std::vector< PIDDataSet > &best, double mutationRate=0.01, fitnessFunction getFitness=[](double integral){return 1/integral;})
Definition PIDTuner.cpp:18
double getRandomNumber(double min, double max)
Definition PIDTuner.cpp:85
#define min(a, b)
Definition datatypes.h:19
#define max(a, b)
Definition datatypes.h:20
Definition PIDTuner.h:10
void dumpPIDs() const
Definition PIDTuner.h:18
double kD
Definition PIDTuner.h:13
double kP
Definition PIDTuner.h:11
double kI
Definition PIDTuner.h:12
void dumpData() const
Definition PIDTuner.h:26
double meanIntegralAbsError
Definition PIDTuner.h:15
double meanIntegralSqError
Definition PIDTuner.h:16
void dumpIntegrals() const
Definition PIDTuner.h:22
Definition PIDTuner.h:32
double kPMax
Definition PIDTuner.h:34
double kIMin
Definition PIDTuner.h:35
double kDMax
Definition PIDTuner.h:38
double kPMin
Definition PIDTuner.h:33
double kDMin
Definition PIDTuner.h:37
double kIMax
Definition PIDTuner.h:36