00001 /** 00002 * @file BaseModel.cpp 00003 * 00004 * @author <a href="mailto:stefanuhrig@gmx.net">Stefan Uhrig</a> 00005 */ 00006 //------------------------------------------------------------------------------ 00007 #include "BaseModel.h" 00008 #include "Tools/FieldDimensions.h" 00009 #include "Tools/Debugging/Debugging.h" 00010 #include <math.h> 00011 #include <string.h> 00012 //------------------------------------------------------------------------------ 00013 double KalmanProcessModelBase::pi = 3.1415926535897932384626433832795; 00014 double KalmanProcessModelBase::pi2 = 2*3.1415926535897932384626433832795; 00015 double KalmanProcessModelBase::dFieldDiagonalLength = 00016 1.2*sqrt((2.0*xPosOpponentGoal)*(2.0*xPosOpponentGoal) + 00017 (2.0*yPosLeftFlags)*(2.0*yPosLeftFlags)); 00018 //------------------------------------------------------------------------------ 00019 KalmanBallState::KalmanBallState() : x(0.0), y(0.0), vx(0.0), vy(0.0) 00020 { 00021 } 00022 //------------------------------------------------------------------------------ 00023 KalmanUpdateResult::KalmanUpdateResult() : liklihood(0.0) 00024 { 00025 } 00026 //------------------------------------------------------------------------------ 00027 KalmanPredictResult::KalmanPredictResult() : liklihood(0.0) 00028 { 00029 } 00030 //------------------------------------------------------------------------------ 00031 KalmanProcessModelBase::KalmanProcessModelBase() 00032 : bUseModel(true) 00033 { 00034 } 00035 //------------------------------------------------------------------------------ 00036 bool KalmanProcessModelBase::isNonSensePos(double x, double y) const 00037 { 00038 double dist = sqrt(x*x + y*y); 00039 if (dist > dFieldDiagonalLength) 00040 return true; 00041 else 00042 return false; 00043 } 00044 //------------------------------------------------------------------------------ 00045 Out& KalmanProcessModelBase::toStream(Out& stream) const 00046 { 00047 // Write model name 00048 stream << strlen(getModelName()) << getModelName(); 00049 00050 // Write "use" flag 00051 int nUse = bUseModel?1 : 0; 00052 stream << nUse; 00053 00054 // Write dimension of state 00055 int n = getStateDim(); 00056 stream << n; 00057 00058 int i; 00059 double* M = new double[n*n]; 00060 00061 // Write process covariance matrix Q 00062 getQ(M); 00063 for (i = 0; i < n*n; ++i) 00064 stream << M[i]; 00065 00066 // Write measurement covariance matrix R 00067 getR(M); 00068 for (i = 0; i < n*n; ++i) 00069 stream << M[i]; 00070 00071 delete [] M; 00072 return stream; 00073 } 00074 //------------------------------------------------------------------------------ 00075 In& KalmanProcessModelBase::fromStream(In& stream) 00076 { 00077 // Read "use" flag of model 00078 int nUse; 00079 stream >> nUse; 00080 bUseModel = (nUse != 0); 00081 00082 // Read state dimension 00083 int i, n; 00084 stream >> n; 00085 00086 double* M = new double[n*n]; 00087 00088 // Read process covarinace matrix Q 00089 for (i = 0; i < n*n; ++i) 00090 stream >> M[i]; 00091 setQ(M); 00092 00093 // Read measurement covariance matrix R 00094 for (i = 0; i < n*n; ++i) 00095 stream >> M[i]; 00096 setR(M); 00097 00098 delete [] M; 00099 00100 // Reset model because parameters have changed 00101 reset(); 00102 return stream; 00103 } 00104 //------------------------------------------------------------------------------ 00105 void KalmanProcessModelBase::OutputException(const char* pszLoc, 00106 MVException& m) const 00107 { 00108 OUTPUT(idText, text, 00109 getModelName() << ": Exception " 00110 << m.getDescription() << " in " << pszLoc); 00111 } 00112 //------------------------------------------------------------------------------ 00113 00114 /* 00115 * Change log : 00116 * $Log: BaseModel.cpp,v $ 00117 * Revision 1.1 2004/07/14 21:40:15 spranger 00118 * moved kalmanprocessmodel to gt2004processmodel 00119 * 00120 * Revision 1.3 2004/06/15 22:14:09 uhrig 00121 * Tidied up a little bit 00122 * 00123 * Revision 1.2 2004/06/15 21:40:14 uhrig 00124 * Added possibility to disable and enable process models in the Kalman filter. 00125 * 00126 * Revision 1.1.1.1 2004/05/22 17:15:25 cvsadm 00127 * created new repository GT2004_WM 00128 * 00129 * Revision 1.4 2004/04/22 14:28:02 roefer 00130 * .NET errors/warnings removed 00131 * 00132 * Revision 1.3 2004/04/20 14:12:16 uhrig 00133 * - odometry processing corrected 00134 * - fixed position model disabled 00135 * - covariance matrices tuned 00136 * 00137 * Revision 1.2 2004/03/15 12:28:52 risler 00138 * change log added 00139 * 00140 * 00141 */