Formula Student Autonomous Systems
The code for the main driverless system
Loading...
Searching...
No Matches
nearest_neighbor.cpp
Go to the documentation of this file.
2
3#include <queue>
4#include <tuple>
5
8
10 bool operator()(const std::tuple<double, unsigned int, unsigned int>& a,
11 const std::tuple<double, unsigned int, unsigned int>& b) const {
12 return std::get<0>(a) > std::get<0>(b);
13 }
14};
15
16Eigen::VectorXi NearestNeighbor::associate(const Eigen::VectorXd& landmarks,
17 const Eigen::VectorXd& observations,
18 const Eigen::MatrixXd& covariance,
19 const Eigen::VectorXd& observation_confidences) const {
20 const int num_observations = observations.size() / 2;
21 const int num_landmarks = landmarks.size() / 2;
22
23 Eigen::VectorXi associations =
24 Eigen::VectorXi::Constant(num_observations, -1); // Default: new landmark
25
26 std::priority_queue<std::tuple<double, unsigned int, unsigned int>,
27 std::vector<std::tuple<double, unsigned int, unsigned int>>, TripleComparator>
28 distances;
29
30 double euclidean_distance;
31 for (int i = 0; i < num_observations; ++i) {
32 if (observation_confidences(i) < this->_params_.new_landmark_confidence_gate) {
33 associations(i) = -2;
34 continue;
35 }
36 for (int j = 0; j < num_landmarks; ++j) {
37 euclidean_distance = std::hypot(observations(2 * i) - landmarks(2 * j),
38 observations(2 * i + 1) - landmarks(2 * j + 1));
39 if (euclidean_distance < this->_params_.association_gate) {
40 distances.emplace(euclidean_distance, i, j);
41 }
42 }
43 }
44
45 std::set<unsigned int> associated_landmarks;
46 std::tuple<double, unsigned int, unsigned int> current_tuple;
47 while (!distances.empty()) {
48 current_tuple = distances.top();
49 distances.pop();
50
51 if (associated_landmarks.find(std::get<2>(current_tuple)) == associated_landmarks.end() &&
52 associations(std::get<1>(current_tuple)) == -1) {
53 associations(std::get<1>(current_tuple)) = 2 * std::get<2>(current_tuple);
54 associated_landmarks.insert(std::get<2>(current_tuple));
55 }
56 }
57
58 return associations;
59}
Data Association Method class, used to match observations to landmarks in the map.
DataAssociationParameters _params_
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.
NearestNeighbor(const DataAssociationParameters &params)
bool operator()(const std::tuple< double, unsigned int, unsigned int > &a, const std::tuple< double, unsigned int, unsigned int > &b) const