Go to the documentation of this file.00001
00018 #include <MathHelpers/linearApproximator.h>
00019 #ifndef Q_MOC_RUN
00020 #include <ros/ros.h>
00021 #endif
00022
00023 ApproximationResult LinearApproximator::calculateApproximation(Eigen::Vector2d * functionPoints, int startIndex, int endIndex, Eigen::Vector2d centerOffset)
00024 {
00025 double X = 0, Y = 0, Z = 0;
00026 double alpha;
00027 for (int i = startIndex; i < endIndex; i++)
00028 {
00029 Eigen::Vector2d it = functionPoints[i];
00030 X += (it[0] - centerOffset[0]) * (it[0] - centerOffset[0]);
00031 Y += (it[1] - centerOffset[1]) * (it[1] - centerOffset[1]);
00032 Z += (it[0] - centerOffset[0]) * (it[1] - centerOffset[1]);
00033 }
00034 if (X == Y)
00035 {
00036 if (Z > 0)
00037 {
00038 alpha = M_PI / 4.0;
00039 }
00040 else
00041 {
00042 alpha = M_PI * 3.0 / 4.0;
00043 }
00044 }
00045 else
00046 {
00047 if (Y - X < 0)
00048 {
00049 alpha = - atan(2.0 * Z / (Y - X)) * 0.5;
00050
00051 }
00052 else
00053 {
00054
00055
00056 alpha = M_PI / 2.0 - atan(2.0 * Z / (Y - X)) * 0.5;
00057 }
00058 if (alpha < M_PI/2.0)
00059 {
00060 alpha += M_PI;
00061 }
00062 }
00063
00064 double variance = 0;
00065 double maxLength = 0;
00066 for (int i = startIndex; i < endIndex; i++)
00067 {
00068 Eigen::Vector2d it = functionPoints[i];
00069 variance += pow(sin(alpha) * (it[0] - centerOffset[0]) - cos(alpha) * (it[1] - centerOffset[1]), 2.0);
00070 maxLength = std::max(maxLength, std::abs(cos(alpha) * (it[0] - centerOffset[0]) + sin(alpha) * (it[1] - centerOffset[1])));
00071 }
00072 variance /= (double)functionPoints->size();
00073 ApproximationResult result;
00074 result.approximatedVector = Eigen::Vector2d(cos(alpha) * maxLength, sin(alpha) * maxLength);
00075 result.angle = alpha;
00076 result.variance = variance;
00077 return result;
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130