8 const Eigen::VectorXd& landmarks,
const Eigen::VectorXd& observations,
9 const Eigen::MatrixXd& covariance,
const Eigen::VectorXd& observation_confidences)
const {
10 const int num_observations = observations.size() / 2;
11 const int num_landmarks = landmarks.size() / 2;
12 Eigen::VectorXi associations =
13 Eigen::VectorXi::Constant(num_observations, -2);
15 for (
int i = 0; i < num_observations; i++) {
17 obs << observations(2 * i), observations(2 * i + 1);
19 double best_cost = std::numeric_limits<double>::max();
20 int best_landmark_index = -1;
22 for (
int j = 0; j < num_landmarks; j++) {
24 Eigen::Vector2d innovation = obs - landmarks.segment(2 * j, 2);
26 Eigen::Matrix2d innovation_covariance =
30 double det = innovation_covariance.determinant();
32 RCLCPP_WARN(rclcpp::get_logger(
"data_association"),
33 "Non-invertible innovation covariance matrix for landmark at: [%f, %f]",
34 landmarks(2 * j), landmarks(2 * j + 1));
37 if (det < 1e-9) det = 1e-9;
39 double normalized_innovation_squared =
40 innovation.transpose() * innovation_covariance.inverse() * innovation;
41 double cost = normalized_innovation_squared + std::log(det);
45 best_landmark_index = 2 * j;
49 if (best_landmark_index != -1) {
50 associations(i) = best_landmark_index;
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.