API
 
Loading...
Searching...
No Matches
ar_controller.cpp
Go to the documentation of this file.
1#include "ar_controller.hpp"
2
3namespace DDSPC
4{
5
6PredictiveController::PredictiveController(int num_actuators, int num_history, int num_future, realT gain=0.25, realT gamma=1.0, realT initial_regularization=0.015, realT initial_covariance=1e5){
7 // Settable properties
8 _num_modes = num_actuators;
9 _num_history = num_history;
10 _num_future = num_future;
11 _gain = gain;
12 _delta_max = 0.5;
13 _regularization = initial_regularization;
14
15 // Derived properties
19
20 // Data buffers
21 buffer_size = find_next_power_of_2(2 * (num_history + num_future));
22
25 measurement_buffer.setZero();
26
27 command_head = 0;
29 command_buffer.setZero();
30
31 // The learner
32 rls = new RecursiveLeastSquares(num_predictors, num_features, gamma, initial_covariance);
33
34 // Initializing the controller
35 controller.resize(_num_modes, (2 * num_history - 1) * _num_modes);
36 controller.setZero();
37
38 integrator.resize(_num_modes, (2 * num_history - 1) * _num_modes);
39 integrator.setZero();
40
41 for(int i=0; i < _num_modes; i++){
42 int index = (_num_history - 1) * _num_modes + i;
43 integrator(i, index) = -_gain;
44 }
45
46 // Set the regularization matrix
49
52
53 for(int i = 0; i<num_correlations; i++){
54 regularization_matrix_01(i, i) = initial_regularization;
55 regularization_matrix_02(i, i) = initial_regularization;
56 }
57
59};
60
61
65
67 controller.resize(_num_modes, (2 * _num_history - 1) * _num_modes);
68 controller.setZero();
69
70 rls->reset();
71}
72
75 for(int i = 0; i<num_correlations; i++){
76 regularization_matrix_02(i, i) = new_regularization;
77 }
79 }else{
80 for(int i = 0; i<num_correlations; i++){
81 regularization_matrix_01(i, i) = new_regularization;
82 }
84 }
86}
87
89 Matrix future_vec;
90 future_vec.resize(_num_future * _num_modes, 1);
91
92 for(int i=0; i<_num_future; i++){
93 auto dat = measurement_buffer.row((measurement_head - i - 1) & (buffer_size - 1));
94 for(int j=0; j < _num_modes; j++){
95 future_vec(i * _num_modes + j, 0) = dat(j, 0);
96 }
97 }
98
99 return future_vec;
100}
101
103 Matrix past_vec;
104 past_vec.resize(_num_history * _num_modes, 1);
105
106 // This is a smarter way to ravel the data!
107 // VectorXd B(Map<VectorXd>(A.data(), A.cols()*A.rows()));
108 for(int i=0; i<_num_history; i++){
109 auto dat = measurement_buffer.row((measurement_head - i - _num_future - 1) & (buffer_size - 1));
110 for(int j=0; j < _num_modes; j++){
111 past_vec(i * _num_modes + j, 0) = dat(j, 0);
112 }
113 }
114
115 return past_vec;
116}
117
119 Matrix future_vec;
120 if(true){
121 future_vec.resize((_num_future - skip_cmds) * _num_modes, 1);
122
123 for(int i=0; i < (_num_future - skip_cmds); i++){
124 int offset = skip_cmds * _num_modes;
125 auto dat = command_buffer.row((command_head - i - 1 - offset) & (buffer_size - 1));
126 for(int j=0; j < _num_modes; j++){
127 future_vec(i * _num_modes + j, 0) = dat(j, 0);
128 }
129 }
130 }else{
131 future_vec.resize(_num_future * _num_modes, 1);
132
133 for(int i=0; i<_num_future; i++){
134 auto dat = command_buffer.row((command_head - i - 1) & (buffer_size - 1));
135 for(int j=0; j < _num_modes; j++){
136 future_vec(i * _num_modes + j, 0) = dat(j, 0);
137 }
138 }
139 }
140
141 return future_vec;
142}
143
145 Matrix past_vec;
146 past_vec.resize(_num_history * _num_modes, 1);
147
148 for(int i=0; i<_num_history; i++){
149 auto dat = command_buffer.row((command_head - i - _num_future - 1) & (buffer_size - 1));
150 for(int j=0; j < _num_modes; j++){
151 past_vec(i * _num_modes + j) = dat(j, 0);
152 }
153 }
154
155 return past_vec;
156}
157
159 Matrix past_vec;
160 past_vec.resize(num_steps * _num_modes, 1);
161
162 for(int i=0; i<num_steps; i++){
163 auto dat = measurement_buffer.row((measurement_head - i - 1) & (buffer_size - 1));
164 for(int j=0; j < _num_modes; j++){
165 past_vec(i * _num_modes + j) = dat(j, 0);
166 }
167 }
168
169 return past_vec;
170}
171
173 Matrix past_vec;
174 past_vec.resize(num_steps * _num_modes, 1);
175
176 for(int i=0; i<num_steps; i++){
177 auto dat = command_buffer.row((command_head - i - 1) & (buffer_size - 1));
178 for(int j=0; j < _num_modes; j++){
179 past_vec(i * _num_modes + j) = dat(j, 0);
180 }
181 }
182
183 return past_vec;
184}
185
187 Matrix future_cmd = get_command_future(1);
188 Matrix past_cmd = get_command_past();
189 Matrix future_measurement = get_measurement_future();
190 Matrix past_measurement = get_measurement_past();
191
192 Matrix prediction_vector;
193 prediction_vector.resize(past_measurement.rows() + past_cmd.rows() + future_cmd.rows(), 1);
194 prediction_vector << future_cmd, past_cmd, past_measurement;
195
196 rls->update(&prediction_vector, &future_measurement);
197}
198
201 Matrix H11 = H.block(0, 0, num_correlations, num_correlations);
202 Matrix H21 = H.block(0, num_correlations, num_correlations, H.cols() - num_correlations);
203
207 }else{
209 }
210
212 }
213
214 Matrix full_controller = -1 * (H11 + H11.maxCoeff() * (*regularization_matrix)).inverse() * H21;
215 controller = full_controller.block(full_controller.rows() - _num_modes, 0, _num_modes, full_controller.cols());
216}
217
219 measurement_buffer.row(measurement_head & (buffer_size-1)) = new_measurement;
221
222 Matrix past_command = get_current_command_past(_num_history - 1);
224
225 Matrix past_vec;
226 past_vec.resize(2 * _num_history - 1, 1);
227 past_vec << past_command, past_measurement;
228
229 Matrix new_delta = (controller + integrator) * past_vec + exploration_noise;
230
231 if(false){
232 for(int i=0; i<_num_modes; i++){
233 if( new_delta(i,0) > _delta_max )
234 new_delta(i, 0) = _delta_max;
235
236 if( new_delta(i,0) < -_delta_max )
237 new_delta(i, 0) = -_delta_max;
238 }
239 }
240
241 command_buffer.row(command_head & (buffer_size - 1)) = new_delta;
242 command_head++;
243
244 return new_delta;
245}
246
247}
PredictiveController(int num_actuators, int num_history, int num_future, realT gain, realT gamma, realT initial_regularization, realT initial_covariance)
void set_regularization(realT new_regularization)
Matrix get_command_future(int skip_cmds)
Matrix calculate_command(Matrix new_measurement, Matrix exploration_noise)
RecursiveLeastSquares * rls
Matrix get_current_measurement_past(int num_steps)
Matrix get_current_command_past(int num_steps)
void update(eigenImage< realT > *x, eigenImage< realT > *y)
Eigen::Matrix< realT, Eigen::Dynamic, Eigen::Dynamic > Matrix
Definition utils.hpp:12
static uint64_t find_next_power_of_2(int sample)
Definition utils.hpp:20
float realT
Definition utils.hpp:11