21 #ifndef __INVERT3CHANNELCONTROLLER_H
22 #define __INVERT3CHANNELCONTROLLER_H
47 virtual void step(const sensor*, motor*);
50 virtual void stepNoLearning(const sensor*, motor*);
56 double A[NUMBER_CHANNELS][NUMBER_CHANNELS];
57 double C[NUMBER_CHANNELS][NUMBER_CHANNELS];
58 double h[NUMBER_CHANNELS];
78 virtual void learn(double *x_delay, double *y_delay);
81 virtual void learnModel(double *x_actual, double *y_effective);
85 virtual void calculateDelayedValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], int number_steps_of_delay_, double *target);
87 virtual void calculateSmoothValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], int number_steps_for_averaging_, double *target);
90 virtual void calculateControllerValues(double *x_smooth, double *y);
92 // put new value in ring buffer
93 virtual void putInBuffer(double buffer[BUFFER_SIZE][NUMBER_CHANNELS], double *values);
97 virtual double g(
double z)
105 virtual double g_s(
double z)
107 return 1.0 - tanh(z) * tanh(z);
115 return 0.1 * tanh(10.0 * z);
125 for (
int i = 0; i < NUMBER_CHANNELS; i++)
128 for (
int j = 0; j < NUMBER_CHANNELS; j++)
142 for (
int i = 0; i < NUMBER_CHANNELS; i++)
164 motor* y_,
int motornumber) {
165 double x_smooth[NUMBER_CHANNELS];
166 double x_effective[NUMBER_CHANNELS];
167 double y_effective[NUMBER_CHANNELS];
168 for (
int i = 0; i < NUMBER_CHANNELS; i++)
171 x_effective[i] = 0.0;
172 y_effective[i] = 0.0;
192 learn(x_, x_effective, y_effective);
204 motor* y_,
int motornumber){
205 double x_smooth[NUMBER_CHANNELS];
206 for (
int i = 0; i < NUMBER_CHANNELS; i++)
230 virtual void inverseMatrix(
double Q[NUMBER_CHANNELS][NUMBER_CHANNELS],
double Q_1[NUMBER_CHANNELS][NUMBER_CHANNELS]){
234 assert(NUMBER_CHANNELS<4);
235 if (NUMBER_CHANNELS==2){
237 double det = Q[0][0] * Q[1][1] - Q[0][1] * Q[1][0];
238 Q_1[0][0] = Q[1][1] / det;
239 Q_1[1][1] = Q[0][0] / det;
240 Q_1[0][1] = -Q[0][1] / det;
241 Q_1[1][0] = -Q[1][0] / det;
246 if (NUMBER_CHANNELS==3){
248 double Q_adjoint[NUMBER_CHANNELS][NUMBER_CHANNELS] ;
252 Q_adjoint[0][0]=Q[1][1]*Q[2][2]-Q[1][2]*Q[2][1] ;
253 Q_adjoint[0][1]=(Q[1][2]*Q[2][0]-Q[1][0]*Q[2][2]) ;
254 Q_adjoint[0][2]=Q[1][0]*Q[2][1]-Q[1][1]*Q[2][0] ;
255 Q_adjoint[1][0]=(Q[2][1]*Q[0][2]-Q[0][1]*Q[2][2]) ;
256 Q_adjoint[1][1]=Q[0][0]*Q[2][2]-Q[0][2]*Q[2][0] ;
257 Q_adjoint[1][2]=(Q[0][1]*Q[2][0]-Q[0][0]*Q[2][1]) ;
258 Q_adjoint[2][0]=Q[0][1]*Q[1][2]-Q[1][1]*Q[0][2] ;
259 Q_adjoint[2][1]=(Q[1][0]*Q[0][2]-Q[0][0]*Q[1][2]) ;
260 Q_adjoint[2][2]=Q[0][0]*Q[1][1]-Q[0][1]*Q[1][0] ;
261 detQ=Q[0][0]*Q_adjoint[0][0]+Q[0][1]*Q_adjoint[0][1]+Q[0][2]*Q_adjoint[0][2] ;
262 for(
int i=0; i<NUMBER_CHANNELS; i++){
263 for(
int j=0; j<NUMBER_CHANNELS; j++) {
264 Q_1[i][j]=(Q_adjoint[j][i])/detQ ;
271 virtual double calculateE(
const double *x_,
const double *x_delay,
const double *y_delay) {
272 double L[NUMBER_CHANNELS][NUMBER_CHANNELS];
273 double Q[NUMBER_CHANNELS][NUMBER_CHANNELS];
274 double Q_1[NUMBER_CHANNELS][NUMBER_CHANNELS];
275 double z[NUMBER_CHANNELS];
283 for (
int i = 0; i < NUMBER_CHANNELS; i++)
286 for (
int j = 0; j < NUMBER_CHANNELS; j++)
288 z[i] +=
C[i][j] * x_delay[j];
293 for (
int i = 0; i < NUMBER_CHANNELS; i++)
295 for (
int j = 0; j < NUMBER_CHANNELS; j++)
298 for (
int k = 0; k < NUMBER_CHANNELS; k++)
300 L[i][j] +=
A[i][k] *
g_s(z[k]) *
C[k][j];
306 for (
int i = 0; i < NUMBER_CHANNELS; i++)
308 for (
int j = 0; j < NUMBER_CHANNELS; j++)
311 for (
int k = 0; k < NUMBER_CHANNELS; k++)
313 Q[i][j] += L[i][k] * L[j][k];
316 Q[i][j] +=
rho / NUMBER_CHANNELS;
324 for (
int i = 0; i < NUMBER_CHANNELS; i++)
327 for (
int j = 0; j < NUMBER_CHANNELS; j++)
329 xsi4E[i] -=
A[i][j] * y_delay[j];
335 for (
int i = 0; i < NUMBER_CHANNELS; i++)
337 for (
int j = 0; j < NUMBER_CHANNELS; j++)
344 for (
int i = 0; i < NUMBER_CHANNELS; i++)
346 for (
int j = 0; j < NUMBER_CHANNELS; j++)
348 E_s += (
A[i][j]*
g(z[j]) - x_[i]) * (
A[i][j]*
g(z[j]) - x_[i]);
358 virtual void learn(
const double *x_,
const double *x_delay,
const double *y_delay)
361 double C_update[NUMBER_CHANNELS][NUMBER_CHANNELS];
362 double h_update[NUMBER_CHANNELS];
367 for (
int i = 0; i < NUMBER_CHANNELS; i++)
372 for (
int j = 0; j < NUMBER_CHANNELS; j++)
384 for (
int i = 0; i < NUMBER_CHANNELS; i++)
387 for (
int j = 0; j < NUMBER_CHANNELS; j++)
389 C[i][j] +=
squash(C_update[i][j]);
396 virtual void learnModel(
const double *x_actual,
double *y_effective){
406 for(
int i=0; i<NUMBER_CHANNELS; i++){
408 for(
int j=0; j<NUMBER_CHANNELS; j++){
413 for(
int i=0; i<NUMBER_CHANNELS; i++){
414 for (
int j=0; j<NUMBER_CHANNELS; j++){
428 assert ((
int)number_steps_of_delay_ <
BUFFER_SIZE);
432 for (
int i = 0; i < NUMBER_CHANNELS; i++)
441 assert ((
int)number_steps_for_averaging_ <=
BUFFER_SIZE);
443 for (
int i = 0; i < NUMBER_CHANNELS; i++)
446 for (
int k = 0; k < (int)number_steps_for_averaging_; k++)
458 double z[NUMBER_CHANNELS];
460 for (
int i = 0; i < NUMBER_CHANNELS; i++)
463 for (
int j = 0; j < NUMBER_CHANNELS; j++)
465 z[i] +=
C[i][j] * x_smooth[j];
474 for (
int i = 0; i < NUMBER_CHANNELS; i++)
498 if(length < 10)
return 0;
516 int param1,
double param2)
518 if(param1 < 2) param1 = 2;
virtual void calculateDelayedValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], paramval number_steps_of_delay_, double *target)
calculate delayed values
Definition: invert3channelcontroller.h:425
std::string paramkey
Definition: configurable.h:85
Abstract class for robot controller (with some basic functionality).
Definition: abstractcontroller.h:46
virtual double squash(double z)
squashing function, to protect against to large weight updates
Definition: invert3channelcontroller.h:113
virtual void learn(const double *x_, const double *x_delay, const double *y_delay)
Definition: invert3channelcontroller.h:358
virtual void step(const sensor *x_, int sensornumber, motor *y_, int motornumber)
performs one step (includes learning). Calulates motor commands from sensor inputs.
Definition: invert3channelcontroller.h:163
Invert3ChannelController()
Definition: invert3channelcontroller.h:121
double xsi4Model[NUMBER_CHANNELS]
Definition: invert3channelcontroller.h:64
virtual double calculateE(const double *x_, const double *x_delay, const double *y_delay)
Definition: invert3channelcontroller.h:271
virtual void stepNoLearning(const sensor *x_, int sensornumber, motor *y_, int motornumber)
performs one step without learning. Calulates motor commands from sensor inputs.
Definition: invert3channelcontroller.h:203
virtual void calculateControllerValues(double *x_smooth, double *y)
calculate controller ouptus
Definition: invert3channelcontroller.h:456
virtual void learnModel(const double *x_actual, double *y_effective)
Definition: invert3channelcontroller.h:396
double sensor
Definition: abstractcontroller.h:48
double paramval
Definition: configurable.h:88
paramval rho
Definition: invertcontroller.h:51
virtual void inverseMatrix(double Q[NUMBER_CHANNELS][NUMBER_CHANNELS], double Q_1[NUMBER_CHANNELS][NUMBER_CHANNELS])
Definition: invert3channelcontroller.h:230
virtual int getInternalParams(paramval *vallist, int length)
Definition: invert3channelcontroller.h:497
paramval eps
Definition: invertcontroller.h:50
double A[NUMBER_CHANNELS][NUMBER_CHANNELS]
model matrix
Definition: invert3channelcontroller.h:56
virtual void calculateSmoothValues(double source[BUFFER_SIZE][NUMBER_CHANNELS], paramval number_steps_for_averaging_, double *target)
Definition: invert3channelcontroller.h:438
AbstractController * getController(int sensornumber, int motornumber, int param1, double param2)
Definition: invert3channelcontroller.h:515
int t
number of steps, needed for ringbuffer x_buffer
Definition: invert3channelcontroller.h:66
paramval delta
Definition: invertcontroller.h:58
double h[NUMBER_CHANNELS]
bias vector
Definition: invert3channelcontroller.h:58
double C[NUMBER_CHANNELS][NUMBER_CHANNELS]
controller matrix
Definition: invert3channelcontroller.h:57
double y_buffer[BUFFER_SIZE][NUMBER_CHANNELS]
buffer for output values, y[tbuffersize]=actual value(if already calculated!), y[(t-1+buffersize)buff...
Definition: invert3channelcontroller.h:61
virtual void putInBuffer(double buffer[BUFFER_SIZE][NUMBER_CHANNELS], const double *values)
Definition: invert3channelcontroller.h:473
virtual int getInternalParamNames(paramkey *&keylist)
Definition: invert3channelcontroller.h:482
class for robot controller that use naglaa's direct matrix inversion for n channels (simple one layer...
Definition: invert3channelcontroller.h:36
double x_buffer[BUFFER_SIZE][NUMBER_CHANNELS]
buffer for input values, x[tbuffersize]=actual value, x[(t-1+buffersize)buffersize]=x(t-1) ...
Definition: invert3channelcontroller.h:60
double xsi4E[NUMBER_CHANNELS]
Definition: invert3channelcontroller.h:63
double motor
Definition: abstractcontroller.h:49
Abstract class (interface) for robot controller that use direct matrix inversion and simple one layer...
Definition: invertcontroller.h:33
virtual double g_s(double z)
Definition: invert3channelcontroller.h:105
paramval factor_a
Definition: invertcontroller.h:55
virtual double g(double z)
neuron transfer function
Definition: invert3channelcontroller.h:97
#define BUFFER_SIZE
Definition: use_java_controller.h:46