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
33
34float variance(float data[], int size, int num_skip=0){
35 float mean = 0.0;
36 for(int i=num_skip; i<size; i++){
37 mean += data[i];
38 }
39 mean /= (size - num_skip);
40 std::cout << "Mean: " << mean << std::endl;
41
42 float var = 0.0;
43 for(int i=num_skip; i<size; i++){
44 var += (data[i] - mean) * (data[i] - mean);
45 }
46
47 return var / (size - num_skip);
48}
49
50float standard_dev(float data[], int size, int num_skip=0){
51 return std::sqrt(variance(data, size, num_skip));
52}
53
54void write_to_file(std::string filename, double data[], int size){
55 std::ofstream out(filename);
56 for(int i=0; i<size; i++){
57 out << data[i];
58 if(i < (size - 1))
59 out << ',';
60 }
61}
62
63
64void write_to_file(std::string filename, float data[], int size){
65 std::ofstream out(filename);
66 for(int i=0; i<size; i++){
67 out << data[i];
68 if(i < (size - 1))
69 out << ',';
70 }
71}
72
73int main(int argc, char **argv){
74 std::default_random_engine generator;
75 std::normal_distribution<DDSPC::realT> distribution(0, 1.0);
76
77 int num_steps = 10000;
78 DDSPC::realT x[num_steps] = {0.0};
79 DDSPC::realT err[num_steps] = {0.0};
80 DDSPC::realT signal[num_steps] = {0.0};
81
82 DDSPC::realT err_pc[num_steps] = {0.0};
83 DDSPC::realT signal_pc[num_steps] = {0.0};
84
85 for(int i=0; i<num_steps; i++){
86 x[i] = std::sin(2 * 3.14 * 20.0 * i / 1000.0);
87 }
88
89 DDSPC::realT gain = 0.5;
90 DDSPC::realT gamma = 1.001;
91 DDSPC::realT initial_regularization = 100.0;
92 int num_history = 50;
93 int num_future = 10;
94 int num_actuators = 1;
95
96 DDSPC::Matrix measurement;
97 measurement.resize(num_actuators,1);
98
99 DDSPC::Matrix exploration_noise;
100 exploration_noise.resize(num_actuators,1);
101
102 DDSPC::PredictiveController controller = DDSPC::PredictiveController(num_actuators, num_history, num_future, gain, gamma, initial_regularization, 1.0e5);
103
104 std::chrono::steady_clock::time_point begin = std::chrono::steady_clock::now();
105 std::chrono::steady_clock::time_point end = std::chrono::steady_clock::now();
106
107 double command_calc = 0.0;
108 double update_system = 0.0;
109 double update_controller = 0.0;
110 for(int i=0; i < (num_steps - 1); i++){
111 if(i == 250)
112 controller.set_regularization(1.0);
113 if(i == 500)
114 controller.set_regularization(0.1);
115
116 if(i < 500){
117 exploration_noise(0,0) = 0.1 * distribution(generator);
118 }else{
119 exploration_noise(0,0) = 0.0;
120 }
121
122 err[i] = x[i] + signal[i];
123 signal[i+1] = signal[i] - gain * err[i] + exploration_noise(0, 0);
124
125 err_pc[i] = x[i] + signal_pc[i];
126 measurement(0,0) = err_pc[i];
127
128 begin = std::chrono::steady_clock::now();
129 DDSPC::Matrix new_command = controller.calculate_command(measurement, exploration_noise);
130 end = std::chrono::steady_clock::now();
131 command_calc += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
132
133 signal_pc[i + 1] = signal_pc[i] + new_command(0,0);
134
135 if((i+1) > (num_future + num_history)){
136 begin = std::chrono::steady_clock::now();
137 controller.update_system();
138 end = std::chrono::steady_clock::now();
139 update_system += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
140
141 begin = std::chrono::steady_clock::now();
142 controller.update_controller();
143 end = std::chrono::steady_clock::now();
144 update_controller += std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin).count();
145 }
146 }
147
148 std::cout << command_calc / num_steps / 1000.0 << " " << update_system / num_steps / 1000.0 << " " << update_controller / num_steps / 1000.0 << std::endl;
149
150 std::cout<< standard_dev(x, num_steps, 500) << std::endl;
151 std::cout<< standard_dev(err, num_steps, 500) << std::endl;
152 std::cout<< standard_dev(err_pc, num_steps, 500) << std::endl;
153
154 write_to_file("x.csv", x, num_steps);
155 write_to_file("err.csv", err, num_steps);
156 write_to_file("err_pc.csv", err_pc, num_steps);
157
158 return 0;
159
160}
void set_regularization(realT new_regularization)
Matrix calculate_command(Matrix new_measurement, Matrix exploration_noise)
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)