00001 /*************************************************************************** 00002 * Copyright (C) 2005-2011 LpzRobots development team * 00003 * Georg Martius <georg dot martius at web dot de> * 00004 * Frank Guettler <guettler at informatik dot uni-leipzig dot de * 00005 * Frank Hesse <frank at nld dot ds dot mpg dot de> * 00006 * Ralf Der <ralfder at mis dot mpg dot de> * 00007 * * 00008 * This program is free software; you can redistribute it and/or modify * 00009 * it under the terms of the GNU General Public License as published by * 00010 * the Free Software Foundation; either version 2 of the License, or * 00011 * (at your option) any later version. * 00012 * * 00013 * This program is distributed in the hope that it will be useful, * 00014 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 00015 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * 00016 * GNU General Public License for more details. * 00017 * * 00018 * You should have received a copy of the GNU General Public License * 00019 * along with this program; if not, write to the * 00020 * Free Software Foundation, Inc., * 00021 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * 00022 * * 00023 ***************************************************************************/ 00024 #ifndef __FEEDBACKWIRING_H 00025 #define __FEEDBACKWIRING_H 00026 00027 #include "abstractwiring.h" 00028 #include "matrix.h" 00029 00030 /** Implements essentionally a one to one wiring with feedback connections. 00031 The feedback connections from output to input are parameterised 00032 with a feedback strength. 00033 It is possible to generate virtual motors for context sensors. 00034 00035 In order to change the feedback strength after initialisation 00036 use the following code 00037 \code 00038 matrix::Matrix rs = wiring->getFeedbackRatio(); 00039 double c=ratio; 00040 rs.toMapP(&c,constant); 00041 wiring->setFeedbackRatio(rs); 00042 \endcode 00043 */ 00044 class FeedbackWiring :public AbstractWiring{ 00045 public: 00046 typedef enum {Motor=1, Context=2, All=3} Mode; 00047 00048 /** constructor 00049 @param noise NoiseGenerator that is used for adding noise to sensor values 00050 @param mode Motor|Context|All: Motor: motor outputs send feedback; 00051 Context: virtual motor outputs for each context sensor with feedback 00052 @param feedbackratio default ratio used to feed back the output to the input, 00053 meaning \f[ x_t = 0.1*x_t + 0.9*y_{t-1} \f] 00054 */ 00055 FeedbackWiring(NoiseGenerator* noise, Mode mode = Context,double feedbackratio=0.9, const std::string& name = "FeedBackWiring"); 00056 virtual ~FeedbackWiring(); 00057 00058 protected: 00059 virtual bool initIntern(); 00060 00061 virtual bool wireSensorsIntern(const sensor* rsensors, int rsensornumber, 00062 sensor* csensors, int csensornumber, 00063 double noise); 00064 00065 virtual bool wireMotorsIntern(motor* rmotors, int rmotornumber, 00066 const motor* cmotors, int cmotornumber); 00067 00068 public: 00069 00070 virtual std::list<iparamkey> getInternalParamNames() const; 00071 virtual std::list<iparamval> getInternalParams() const; 00072 00073 /// return the feedback ratio vector 00074 virtual matrix::Matrix getFeedbackRatio() const; 00075 /** sets the feedback ratio vector. 00076 The size of the vector must be at least as large as getFeedbackRatio()*/ 00077 virtual void setFeedbackRatio(const matrix::Matrix&); 00078 00079 protected: 00080 00081 Mode mode; 00082 double defaultfeedbackratio; 00083 matrix::Matrix feedbackratio; 00084 /// array that stored the values of the motors 00085 motor *motors; 00086 int vmotornumber; 00087 00088 }; 00089 00090 #endif