00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
#ifndef __INVERT3CHANNELCONTROLLER_H
00029
#define __INVERT3CHANNELCONTROLLER_H
00030
00031
#include "invertcontroller.h"
00032
00033
#include <cassert>
00034
#include <math.h>
00035
00036
00037
00038
00039
00040
00041
00042
00043 template <
int NUMBER_CHANNELS,
int BUFFER_SIZE=2>
class Invert3ChannelController :
public InvertController {
00044
00045
public:
00046
00047
00048
00049
00050
00051
00052
00053
00054 virtual void step(const sensor*, motor*);
00055
00056
00057 virtual void stepNoLearning(const sensor*, motor*);
00058 */
00059
00060
00061
00062
public:
00063 double A[NUMBER_CHANNELS][NUMBER_CHANNELS];
00064 double C[NUMBER_CHANNELS][NUMBER_CHANNELS];
00065 double h[NUMBER_CHANNELS];
00066
00067 double x_buffer[BUFFER_SIZE][NUMBER_CHANNELS];
00068 double y_buffer[BUFFER_SIZE][NUMBER_CHANNELS];
00069
00070 double xsi4E[NUMBER_CHANNELS];
00071 double xsi4Model[NUMBER_CHANNELS];
00072
00073 int t;
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 virtual void learn(double *x_delay, double *y_delay);
00086
00087
00088 virtual void learnModel(double *x_actual, double *y_effective);
00089
00090
00091
00092 virtual void calculateDelayedValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], int number_steps_of_delay_, double *target);
00093
00094 virtual void calculateSmoothValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], int number_steps_for_averaging_, double *target);
00095
00096
00097 virtual void calculateControllerValues(double *x_smooth, double *y);
00098
00099 // put new value in ring buffer
00100 virtual void putInBuffer(double buffer[BUFFER_SIZE][NUMBER_CHANNELS], double *values);
00101
00102 */
00103
00104 virtual double g(
double z)
00105 {
00106
return tanh(z);
00107 };
00108
00109
00110
00111
00112 virtual double g_s(
double z)
00113 {
00114
return 1.0 - tanh(z) * tanh(z);
00115 };
00116
00117
00118
00119
00120 virtual double squash(
double z)
00121 {
00122
return 0.1 * tanh(10.0 * z);
00123 };
00124
00125
00126
00127
00128 Invert3ChannelController(){
00129
00130
t=0;
00131
00132
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00133 {
00134
h[i] = 0.0;
00135
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00136 {
00137
if (i == j)
00138 {
00139
A[i][j] = 1.0;
00140
C[i][j] = 0.1;
00141 }
00142
else
00143 {
00144
A[i][j] = 0.0;
00145
C[i][j] = 0.0;
00146 }
00147 }
00148 }
00149
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00150 {
00151
for (
int k = 0; k < BUFFER_SIZE; k++)
00152 {
00153
x_buffer[k][i] = 0;
00154
y_buffer[k][i] = 0;
00155 }
00156 }
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167 };
00168
00169
00170 virtual void step(
const sensor* x_,
int sensornumber,
00171
motor* y_,
int motornumber) {
00172
double x_smooth[NUMBER_CHANNELS];
00173
double x_effective[NUMBER_CHANNELS];
00174
double y_effective[NUMBER_CHANNELS];
00175
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00176 {
00177 x_smooth[i] = 0.0;
00178 x_effective[i] = 0.0;
00179 y_effective[i] = 0.0;
00180 }
00181
00182
00183
putInBuffer(
x_buffer, x_);
00184
00185
00186
calculateSmoothValues(
x_buffer, stepnumber4avg, x_smooth);
00187
00188
00189
calculateControllerValues(x_smooth, y_);
00190
00191
00192
putInBuffer(
y_buffer, y_);
00193
00194
00195
calculateDelayedValues(
x_buffer, stepnumber4delay, x_effective);
00196
calculateDelayedValues(
y_buffer, stepnumber4delay, y_effective);
00197
00198
00199
learn(x_, x_effective, y_effective);
00200
00201
00202
learnModel(x_, y_effective);
00203
00204
00205
t++;
00206 };
00207
00208
00209
00210 virtual void stepNoLearning(
const sensor* x_,
int sensornumber,
00211
motor* y_,
int motornumber){
00212
double x_smooth[NUMBER_CHANNELS];
00213
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00214 {
00215 x_smooth[i] = 0.0;
00216 }
00217
00218
00219
00220
putInBuffer(
x_buffer, x_);
00221
00222
00223
calculateSmoothValues(
x_buffer, stepnumber4avg, x_smooth);
00224
00225
00226
calculateControllerValues(x_smooth, y_);
00227
00228
00229
putInBuffer(
y_buffer, y_);
00230
00231
00232
t++;
00233 };
00234
00235
00236
protected:
00237 virtual void inverseMatrix(
double Q[NUMBER_CHANNELS][NUMBER_CHANNELS],
double Q_1[NUMBER_CHANNELS][NUMBER_CHANNELS]){
00238
00239
00240
00241 assert(NUMBER_CHANNELS<4);
00242
if (NUMBER_CHANNELS==2){
00243
00244
double det = Q[0][0] * Q[1][1] - Q[0][1] * Q[1][0];
00245 Q_1[0][0] = Q[1][1] / det;
00246 Q_1[1][1] = Q[0][0] / det;
00247 Q_1[0][1] = -Q[0][1] / det;
00248 Q_1[1][0] = -Q[1][0] / det;
00249
00250 }
00251
00252
00253
if (NUMBER_CHANNELS==3){
00254
00255
double Q_adjoint[NUMBER_CHANNELS][NUMBER_CHANNELS] ;
00256
double detQ=0 ;
00257
00258
00259 Q_adjoint[0][0]=Q[1][1]*Q[2][2]-Q[1][2]*Q[2][1] ;
00260 Q_adjoint[0][1]=(Q[1][2]*Q[2][0]-Q[1][0]*Q[2][2]) ;
00261 Q_adjoint[0][2]=Q[1][0]*Q[2][1]-Q[1][1]*Q[2][0] ;
00262 Q_adjoint[1][0]=(Q[2][1]*Q[0][2]-Q[0][1]*Q[2][2]) ;
00263 Q_adjoint[1][1]=Q[0][0]*Q[2][2]-Q[0][2]*Q[2][0] ;
00264 Q_adjoint[1][2]=(Q[0][1]*Q[2][0]-Q[0][0]*Q[2][1]) ;
00265 Q_adjoint[2][0]=Q[0][1]*Q[1][2]-Q[1][1]*Q[0][2] ;
00266 Q_adjoint[2][1]=(Q[1][0]*Q[0][2]-Q[0][0]*Q[1][2]) ;
00267 Q_adjoint[2][2]=Q[0][0]*Q[1][1]-Q[0][1]*Q[1][0] ;
00268 detQ=Q[0][0]*Q_adjoint[0][0]+Q[0][1]*Q_adjoint[0][1]+Q[0][2]*Q_adjoint[0][2] ;
00269
for(
int i=0; i<NUMBER_CHANNELS; i++){
00270
for(
int j=0; j<NUMBER_CHANNELS; j++) {
00271 Q_1[i][j]=(Q_adjoint[j][i])/detQ ;
00272 }
00273 }
00274 }
00275 };
00276
00277
00278 virtual double calculateE(
const double *x_,
const double *x_delay,
const double *y_delay) {
00279
double L[NUMBER_CHANNELS][NUMBER_CHANNELS];
00280
double Q[NUMBER_CHANNELS][NUMBER_CHANNELS];
00281
double Q_1[NUMBER_CHANNELS][NUMBER_CHANNELS];
00282
double z[NUMBER_CHANNELS];
00283
00284
00285
00286
00287
00288
00289
00290
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00291 {
00292 z[i] =
h[i];
00293
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00294 {
00295 z[i] +=
C[i][j] * x_delay[j];
00296 }
00297 }
00298
00299
00300
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00301 {
00302
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00303 {
00304 L[i][j] = 0.0;
00305
for (
int k = 0; k < NUMBER_CHANNELS; k++)
00306 {
00307 L[i][j] +=
A[i][k] *
g_s(z[k]) *
C[k][j];
00308 }
00309 }
00310 }
00311
00312
00313
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00314 {
00315
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00316 {
00317 Q[i][j] = 0.0;
00318
for (
int k = 0; k < NUMBER_CHANNELS; k++)
00319 {
00320 Q[i][j] += L[i][k] * L[j][k];
00321 }
00322
if (i == j)
00323 Q[i][j] += rho / NUMBER_CHANNELS;
00324 }
00325 }
00326
00327
00328
inverseMatrix(Q, Q_1);
00329
00330
00331
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00332 {
00333
xsi4E[i] = x_[i];
00334
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00335 {
00336
xsi4E[i] -=
A[i][j] * y_delay[j];
00337
00338
00339 }
00340 }
00341
double E = 0;
00342
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00343 {
00344
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00345 {
00346 E +=
xsi4E[i] * Q_1[i][j] * xsi4E[j];
00347 }
00348 }
00349
00350
double E_s=0;
00351
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00352 {
00353
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00354 {
00355 E_s += (
A[i][j]*
g(z[j]) - x_[i]) * (A[i][j]*
g(z[j]) - x_[i]);
00356 }
00357 }
00358
00359 E=(1-m)*E+ m*E_s;
00360
return (E);
00361
00362 };
00363
00364
00365 virtual void learn(
const double *x_,
const double *x_delay,
const double *y_delay)
00366 {
00367
00368
double C_update[NUMBER_CHANNELS][NUMBER_CHANNELS];
00369
double h_update[NUMBER_CHANNELS];
00370
00371
double E_0 =
calculateE(x_,x_delay, y_delay);
00372
00373
00374
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00375 {
00376
h[i] += delta;
00377 h_update[i] = -eps * (
calculateE(x_,x_delay, y_delay) - E_0) / delta;
00378
h[i] -= delta;
00379
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00380 {
00381
C[i][j] += delta;
00382 C_update[i][j] = -eps * (
calculateE(x_,x_delay, y_delay) - E_0) / delta;
00383
C[i][j] -= delta;
00384
00385
00386
00387 }
00388 }
00389
00390
00391
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00392 {
00393
h[i] +=
squash(h_update[i]);
00394
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00395 {
00396
C[i][j] +=
squash(C_update[i][j]);
00397
00398 }
00399 }
00400 };
00401
00402
00403 virtual void learnModel(
const double *x_actual,
double *y_effective){
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
for(
int i=0; i<NUMBER_CHANNELS; i++){
00414
xsi4Model[i]=x_actual[i];
00415
for(
int j=0; j<NUMBER_CHANNELS; j++){
00416
xsi4Model[i]-=
A[i][j]*y_effective[j];
00417 }
00418 }
00419
00420
for(
int i=0; i<NUMBER_CHANNELS; i++){
00421
for (
int j=0; j<NUMBER_CHANNELS; j++){
00422
A[i][j]+=
squash( (factor_a*eps*0.2) *
xsi4Model[i] * y_effective[j]) ;
00423 }
00424 }
00425 };
00426
00427
00428
00429
00430
00431
00432 virtual void calculateDelayedValues(
double source[BUFFER_SIZE][NUMBER_CHANNELS], paramval number_steps_of_delay_,
double *target)
00433 {
00434
00435 assert ((
int)number_steps_of_delay_ < BUFFER_SIZE);
00436
00437
00438
00439
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00440 {
00441 target[i] = source[(
t - (
int)number_steps_of_delay_ + BUFFER_SIZE) % BUFFER_SIZE][i];
00442 }
00443 };
00444
00445 virtual void calculateSmoothValues(
double source[BUFFER_SIZE][NUMBER_CHANNELS], paramval number_steps_for_averaging_,
double *target)
00446 {
00447
00448 assert ((
int)number_steps_for_averaging_ <= BUFFER_SIZE);
00449
00450
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00451 {
00452 target[i] = 0.0;
00453
for (
int k = 0; k < (
int)number_steps_for_averaging_; k++)
00454 {
00455 target[i] += source[(
t - k + BUFFER_SIZE) % BUFFER_SIZE][i]/ (
double) (number_steps_for_averaging_);
00456 }
00457 }
00458 };
00459
00460
00461
00462
00463 virtual void calculateControllerValues(
double *x_smooth,
double *y)
00464 {
00465
double z[NUMBER_CHANNELS];
00466
00467
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00468 {
00469 z[i] =
h[i];
00470
for (
int j = 0; j < NUMBER_CHANNELS; j++)
00471 {
00472 z[i] +=
C[i][j] * x_smooth[j];
00473 }
00474 y[i] =
g(z[i]);
00475 }
00476 };
00477
00478
00479
00480 virtual void putInBuffer(
double buffer[BUFFER_SIZE][NUMBER_CHANNELS],
const double *values){
00481
for (
int i = 0; i < NUMBER_CHANNELS; i++)
00482 {
00483 buffer[(
t+BUFFER_SIZE)% BUFFER_SIZE][i] = values[i];
00484 }
00485 };
00486
00487
00488
00489 virtual int getInternalParamNames(paramkey*& keylist){
00490 keylist=(paramkey*)malloc(
sizeof(paramkey)*10);
00491 keylist[0]=
"C00";
00492 keylist[1]=
"C01";
00493 keylist[2]=
"C10";
00494 keylist[3]=
"C11";
00495 keylist[4]=
"H0";
00496 keylist[5]=
"H1";
00497 keylist[6]=
"A00";
00498 keylist[7]=
"A01";
00499 keylist[8]=
"A10";
00500 keylist[9]=
"A11";
00501
return 10;
00502 }
00503
00504 virtual int getInternalParams(paramval* vallist,
int length) {
00505
if(length < 10)
return 0;
00506 vallist[0]=
C[0][0];
00507 vallist[1]=C[0][1];
00508 vallist[2]=C[1][0];
00509 vallist[3]=C[1][1];
00510 vallist[4]=
h[0];
00511 vallist[5]=h[1];
00512 vallist[6]=
A[0][0];
00513 vallist[7]=A[0][1];
00514 vallist[8]=A[1][0];
00515 vallist[9]=A[1][1];
00516
return 10;
00517 }
00518
00519
00520 };
00521
00522 AbstractController*
getController(
int sensornumber,
int motornumber,
00523
int param1,
double param2)
00524 {
00525
if(param1 < 2) param1 = 2;
00526
return new Invert3ChannelController<2, 4>;
00527 }
00528
00529
00530
00531
#endif