API
 
Loading...
Searching...
No Matches
testPredCtrl.cpp
Go to the documentation of this file.
1#define EIGEN_DONT_PARALLELIZE
2#include "testPredCtrl.hpp"
3#include "ar_controller.hpp"
4
5#include <random>
6#include <cmath>
7
8#include <vector>
9#include <algorithm>
10#include <numeric>
11#include <chrono>
12
13double variance(double data[], int size, int num_skip=0){
14 double mean = 0.0;
15 for(int i=num_skip; i<size; i++){
16 mean += data[i];
17 }
18 mean /= (size - num_skip);
19 std::cout << "Mean: " << mean << std::endl;
20
21 double var = 0.0;
22 for(int i=num_skip; i<size; i++){
23 var += (data[i] - mean) * (data[i] - mean);
24 }
25
26 return var / (size - num_skip);
27}
28
29double standard_dev(double data[], int size, int num_skip=0){
30 return std::sqrt(variance(data, size, num_skip));
31}
32
33void write_to_file(std::string filename, double data[], int size){
34 std::ofstream out(filename);
35 for(int i=0; i<size; i++){
36 out << data[i];
37 if(i < (size - 1))
38 out << ',';
39 }
40}
41
42int main(int argc, char **argv){
43 std::default_random_engine generator;
44 std::normal_distribution<DDSPC::realT> distribution(0, 1.0);
45
46 int num_steps = 10000;
47 DDSPC::realT x[num_steps] = {0.0};
48 DDSPC::realT err[num_steps] = {0.0};
49 DDSPC::realT signal[num_steps] = {0.0};
50
51 DDSPC::realT err_pc[num_steps] = {0.0};
52 DDSPC::realT signal_pc[num_steps] = {0.0};
53
54 for(int i=0; i<num_steps; i++){
55 x[i] = std::sin(2 * 3.14 * 20.0 * i / 1000.0);
56 }
57
58 DDSPC::realT gain = 0.5;
59 DDSPC::realT gamma = 1.001;
60 DDSPC::realT initial_regularization = 100.0;
61 int num_history = 50;
62 int num_future = 10;
63 int num_actuators = 1;
64
65 DDSPC::Matrix measurement;
66 measurement.resize(num_actuators,1);
67
68 DDSPC::Matrix exploration_noise;
69 exploration_noise.resize(num_actuators,1);
70
71 DDSPC::PredictiveController controller = DDSPC::PredictiveController(num_actuators, num_history, num_future, gain, gamma, initial_regularization, 1.0e5);
72
73 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
74 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
75
76 double command_calc = 0.0;
77 double update_system = 0.0;
78 double update_controller = 0.0;
79 for(int i=0; i < (num_steps - 1); i++){
80 if(i == 250)
81 controller.set_regularization(1.0);
82 if(i == 500)
83 controller.set_regularization(0.1);
84
85 if(i < 500){
86 exploration_noise(0,0) = 0.1 * distribution(generator);
87 }else{
88 exploration_noise(0,0) = 0.0;
89 }
90
91 err[i] = x[i] + signal[i];
92 signal[i+1] = signal[i] - gain * err[i] + exploration_noise(0, 0);
93
94 err_pc[i] = x[i] + signal_pc[i];
95 measurement(0,0) = err_pc[i];
96
97 begin = std::chrono::steady_clock::now();
98 DDSPC::Matrix new_command = controller.calculate_command(measurement, exploration_noise);
99 end = std::chrono::steady_clock::now();
100 command_calc += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
101
102 signal_pc[i + 1] = signal_pc[i] + new_command(0,0);
103
104 if((i+1) > (num_future + num_history)){
105 begin = std::chrono::steady_clock::now();
106 controller.update_system();
107 end = std::chrono::steady_clock::now();
108 update_system += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
109
110 begin = std::chrono::steady_clock::now();
111 controller.update_controller();
112 end = std::chrono::steady_clock::now();
113 update_controller += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
114 }
115 }
116
117 std::cout << command_calc / num_steps / 1000.0 << " " << update_system / num_steps / 1000.0 << " " << update_controller / num_steps / 1000.0 << std::endl;
118
119 std::cout<< standard_dev(x, num_steps, 500) << std::endl;
120 std::cout<< standard_dev(err, num_steps, 500) << std::endl;
121 std::cout<< standard_dev(err_pc, num_steps, 500) << std::endl;
122
123 write_to_file("x.csv", x, num_steps);
124 write_to_file("err.csv", err, num_steps);
125 write_to_file("err_pc.csv", err_pc, num_steps);
126
127 return 0;
128
129}
void set_regularization(realT new_regularization)
Matrix calculate_command(Matrix new_measurement, Matrix exploration_noise)
int main()
Eigen::Matrix< realT, Eigen::Dynamic, Eigen::Dynamic > Matrix
Definition utils.hpp:12
float realT
Definition utils.hpp:11
void write_to_file(std::string filename, double data[], int size)
double variance(double data[], int size, int num_skip=0)
double standard_dev(double data[], int size, int num_skip=0)