29 int nNumberSigmaPoints = 2 * nNumberDimensions + 1;
30 Eigen::MatrixXd sigmaPoints(nNumberDimensions, nNumberSigmaPoints);
31 Eigen::VectorXd w_m(nNumberSigmaPoints);
32 Eigen::VectorXd w_c(nNumberSigmaPoints);
35 float fLamda = m_fAlpha * m_fAlpha * (nNumberDimensions - m_fKappa) - nNumberDimensions;
38 sigmaPoints.block(0, 0, sigmaPoints.rows(), 1) = gaussian.
getMean();
39 w_m(0) = fLamda / (nNumberDimensions + fLamda);
40 w_c(0) = fLamda / (nNumberDimensions + fLamda) + (1 - m_fAlpha * m_fAlpha + m_fBeta);
43 Eigen::MatrixXd diff(nNumberDimensions, nNumberDimensions);
44 diff = (nNumberDimensions + fLamda) * gaussian.
getCovariance();
47 diff = squareRoot(diff);
50 Eigen::VectorXd point1(nNumberDimensions);
51 Eigen::VectorXd point2(nNumberDimensions);
55 for (
int i = 0; i < nNumberDimensions; i++)
58 point1 = gaussian.
getMean() + diff.block(i, 0, 1, diff.cols()).transpose();
59 point2 = gaussian.
getMean() - diff.block(i, 0, 1, diff.cols()).transpose();
60 sigmaPoints.block(0, 2 * i + 1, sigmaPoints.rows(), 1) = point1;
61 sigmaPoints.block(0, 2 * i + 2, sigmaPoints.rows(), 1) = point2;
64 fWeight = 1.0f / (2 * (nNumberDimensions + fLamda));
65 w_m(2 * i + 1) = fWeight;
66 w_m(2 * i + 2) = fWeight;
67 w_c(2 * i + 1) = fWeight;
68 w_c(2 * i + 2) = fWeight;
80 Gaussian result(processedSigmaPoints.rows());
83 for (
int i = 0; i < m_weights_c.rows(); i++)
87 processedSigmaPoints.block(0, i, processedSigmaPoints.rows(), 1));
95 for (
int i = 0; i < m_weights_c.rows(); i++)
99 m_weights_c(i) * ((processedSigmaPoints.block(0, i, processedSigmaPoints.rows(), 1) -
101 ((processedSigmaPoints.block(0, i, processedSigmaPoints.rows(), 1) -
110 UnscentedTransform::squareRoot(Eigen::MatrixXd
input)
112 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> es(
input);
114 Eigen::MatrixXd sqrtA = es.operatorSqrt();