Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "wiimote/stat_vector_3d.h"
00025
00026 #include "ros/ros.h"
00027
00028 #include <numeric>
00029 #include <functional>
00030 #include <algorithm>
00031 #include <math.h>
00032
00033
00034 StatVector3d::StatVector3d()
00035 {
00036 count_ = 0;
00037 }
00038
00039 StatVector3d::StatVector3d(int x, int y, int z)
00040 {
00041 count_ = 0;
00042
00043 addData(x, y, z);
00044 }
00045
00046 void StatVector3d::clear()
00047 {
00048 x_.clear();
00049 y_.clear();
00050 z_.clear();
00051
00052 count_ = 0;
00053 }
00054
00055 int StatVector3d::size()
00056 {
00057 return count_;
00058 }
00059
00060 void StatVector3d::addData(int x, int y, int z)
00061 {
00062 ++count_;
00063
00064 x_.push_back(x);
00065 y_.push_back(y);
00066 z_.push_back(z);
00067 }
00068
00069 TVectorDouble StatVector3d::getMeanRaw()
00070 {
00071 TVectorDouble result;
00072
00073 if (x_.size() < 1)
00074 {
00075 ROS_ERROR("StatVector3d:: Not enough data points for calculations!");
00076 ros::Exception("Not enough data points for calculations");
00077
00078 return result;
00079 }
00080
00081 double x_sum = std::accumulate(std::begin(x_), std::end(x_), 0.0);
00082 result.push_back(x_sum / x_.size());
00083
00084 double y_sum = std::accumulate(std::begin(y_), std::end(y_), 0.0);
00085 result.push_back(y_sum / y_.size());
00086
00087 double z_sum = std::accumulate(std::begin(z_), std::end(z_), 0.0);
00088 result.push_back(z_sum / z_.size());
00089
00090 return result;
00091 }
00092
00093 TVectorDouble StatVector3d::getMeanScaled(double scale)
00094 {
00095 TVectorDouble mean = getMeanRaw();
00096
00097 std::transform(mean.begin(), mean.end(), mean.begin(),
00098 std::bind1st(std::multiplies<double>(), scale));
00099
00100 return mean;
00101 }
00102
00103 TVectorDouble StatVector3d::getVarianceRaw()
00104 {
00105 TVectorDouble result;
00106
00107 TVectorDouble mean = getMeanRaw();
00108
00109 if (x_.size() < 2)
00110 {
00111 ROS_ERROR("StatVector3d:: Not enough data points for calculations!");
00112 ros::Exception("Not enough data points for calculations");
00113
00114 return result;
00115 }
00116
00117 double accum = 0.0;
00118 std::for_each(std::begin(x_), std::end(x_), [&](const double d)
00119 {
00120 accum += (d - mean.at(0)) * (d - mean.at(0));
00121 });
00122
00123 result.push_back(accum / (x_.size()-1));
00124
00125 accum = 0.0;
00126 std::for_each(std::begin(y_), std::end(y_), [&](const double d)
00127 {
00128 accum += (d - mean.at(1)) * (d - mean.at(1));
00129 });
00130
00131 result.push_back(accum / (y_.size()-1));
00132
00133 accum = 0.0;
00134 std::for_each(std::begin(z_), std::end(z_), [&](const double d)
00135 {
00136 accum += (d - mean.at(2)) * (d - mean.at(2));
00137 });
00138
00139 result.push_back(accum / (z_.size()-1));
00140
00141 return result;
00142 }
00143
00144 TVectorDouble StatVector3d::getVarianceScaled(double scale)
00145 {
00146 TVectorDouble variance = getVarianceRaw();
00147
00148 std::transform(variance.begin(), variance.end(), variance.begin(),
00149 std::bind1st(std::multiplies<double>(), scale));
00150
00151 return variance;
00152 }
00153
00154 TVectorDouble StatVector3d::getStandardDeviationRaw()
00155 {
00156 TVectorDouble result;
00157
00158 TVectorDouble variance = getVarianceRaw();
00159
00160 result.push_back(sqrt(variance.at(0)));
00161 result.push_back(sqrt(variance.at(1)));
00162 result.push_back(sqrt(variance.at(2)));
00163
00164 return result;
00165 }
00166
00167 TVectorDouble StatVector3d::getStandardDeviationScaled(double scale)
00168 {
00169 TVectorDouble stddev = getStandardDeviationRaw();
00170
00171 std::transform(stddev.begin(), stddev.end(), stddev.begin(),
00172 std::bind1st(std::multiplies<double>(), scale));
00173
00174 return stddev;
00175 }