Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
maximum_likelihood_md.cpp
Go to the documentation of this file.
2
3#include <cmath>
4#include <limits>
5#include <vector>
6
7#define INFINITESIMAL 1e-9
8
10 const Eigen::VectorXd& landmarks, const Eigen::VectorXd& observations,
11 const Eigen::MatrixXd& covariance, const Eigen::VectorXd& observation_confidences) const {
12 const int num_observations = observations.size() / 2;
13 const int num_landmarks = landmarks.size() / 2;
14 Eigen::VectorXi associations =
15 Eigen::VectorXi::Constant(num_observations, -2); // Default: not associated (-2)
16
17 for (int i = 0; i < num_observations; ++i) {
18 Eigen::Vector2d obs;
19 obs << observations(2 * i), observations(2 * i + 1);
20
21 double best_cost = std::numeric_limits<double>::max();
22 int best_landmark_index = -1;
23
24 for (int j = 0; j < num_landmarks; j++) {
25 // Innovation: difference between actual and predicted observation
26 Eigen::Vector2d innovation = obs - landmarks.segment(2 * j, 2);
27
28 Eigen::Matrix2d innovation_covariance =
29 covariance.block(2 * j, 2 * j, 2, 2) + this->observation_noise_covariance_matrix_;
30 // Guard against non-invertible innovation_covariance
31 double det = innovation_covariance.determinant();
32 if (std::abs(det) <= INFINITESIMAL) {
33 RCLCPP_WARN(rclcpp::get_logger("data_association"),
34 "Non-invertible innovation covariance matrix for landmark at : [%f, %f]",
35 landmarks(2 * j), landmarks(2 * j + 1));
36 continue;
37 }
38 double normalized_innovation_squared =
39 innovation.transpose() * innovation_covariance.inverse() * innovation;
40
41 // Check if this landmark is a good candidate for association
42 if (normalized_innovation_squared < best_cost) {
43 best_cost = normalized_innovation_squared;
44 best_landmark_index = 2 * j;
45 }
46 }
47
48 if (best_cost < this->_params_.association_gate) {
49 associations(i) = best_landmark_index;
50 } else if (observation_confidences[i] > this->_params_.new_landmark_confidence_gate) {
51 associations(i) = -1; // New landmark
52 }
53 }
54
55 return associations;
56}
DataAssociationParameters _params_
Eigen::Matrix2d observation_noise_covariance_matrix_
Eigen::VectorXi associate(const Eigen::VectorXd &landmarks, const Eigen::VectorXd &observations, const Eigen::MatrixXd &covariance, const Eigen::VectorXd &observation_confidences) const override
This function associates the landmarks with the observations.
#define INFINITESIMAL