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);
17 for (
int i = 0; i < num_observations; ++i) {
19 obs << observations(2 * i), observations(2 * i + 1);
21 double best_cost = std::numeric_limits<double>::max();
22 int best_landmark_index = -1;
24 for (
int j = 0; j < num_landmarks; j++) {
26 Eigen::Vector2d innovation = obs - landmarks.segment(2 * j, 2);
28 Eigen::Matrix2d innovation_covariance =
31 double det = innovation_covariance.determinant();
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));
38 double normalized_innovation_squared =
39 innovation.transpose() * innovation_covariance.inverse() * innovation;
42 if (normalized_innovation_squared < best_cost) {
43 best_cost = normalized_innovation_squared;
44 best_landmark_index = 2 * j;
49 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.