13TEST(DATA_ASSOCIATION_MODEL, NEW_LANDMARK) {
15 float max_landmark_distance = 15.0f;
18 Eigen::VectorXf state_vector(8);
19 state_vector << 0, 0, 0, 0, 0, 0, 1, 1;
21 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
23 std::vector<common_lib::structures::Cone> perception_map = {
26 std::vector<int> matched_ids;
27 std::vector<Eigen::Vector2f> matched_cone_positions;
28 std::vector<Eigen::Vector2f> new_features;
30 Eigen::MatrixXf observation_noise_covariance_matrix = Eigen::MatrixXf::Identity(2, 2);
34 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
35 matched_ids, matched_cone_positions, new_features,
38 ASSERT_EQ(new_features.size(), 1);
39 ASSERT_EQ(new_features[0](0), 10);
40 ASSERT_EQ(new_features[0](1), 10);
46TEST(DATA_ASSOCIATION_MODEL, PERFECT_MATCH) {
48 float max_landmark_distance = 15.0f;
51 Eigen::VectorXf state_vector(8);
52 state_vector << 0, 0, 0, 0, 0, 0, 3, 4;
54 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
56 std::vector<common_lib::structures::Cone> perception_map = {
59 std::vector<int> matched_ids;
60 std::vector<Eigen::Vector2f> matched_cone_positions;
61 std::vector<Eigen::Vector2f> new_features;
63 Eigen::MatrixXf observation_noise_covariance_matrix = Eigen::MatrixXf::Identity(2, 2);
67 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
68 matched_ids, matched_cone_positions, new_features,
72 ASSERT_EQ(matched_ids.size(), 1);
73 ASSERT_EQ(matched_cone_positions.size(), 1);
74 ASSERT_EQ(new_features.size(), 0);
76 ASSERT_EQ(matched_ids[0],
78 ASSERT_FLOAT_EQ(matched_cone_positions[0](0), 3.0);
79 ASSERT_FLOAT_EQ(matched_cone_positions[0](1), 4.0);
85TEST(DATA_ASSOCIATION_MODEL, NEAR_MATCH) {
87 float max_landmark_distance = 15.0f;
90 Eigen::VectorXf state_vector(8);
91 state_vector << 0, 0, 0, 0, 0, 0, 3.1, 4.1;
93 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
95 std::vector<common_lib::structures::Cone> perception_map = {
98 std::vector<int> matched_ids;
99 std::vector<Eigen::Vector2f> matched_cone_positions;
100 std::vector<Eigen::Vector2f> new_features;
102 Eigen::MatrixXf observation_noise_covariance_matrix = Eigen::MatrixXf::Identity(2, 2);
106 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
107 matched_ids, matched_cone_positions, new_features,
111 ASSERT_EQ(matched_ids.size(), 1);
112 ASSERT_EQ(matched_cone_positions.size(), 1);
113 ASSERT_EQ(new_features.size(), 0);
115 ASSERT_EQ(matched_ids[0],
117 ASSERT_NEAR(matched_cone_positions[0](0), 3.0, 0.1);
118 ASSERT_NEAR(matched_cone_positions[0](1), 4.0, 0.1);
124TEST(DATA_ASSOCIATION_MODEL, MISMATCH_NOT_NEW) {
126 float max_landmark_distance = 15.0f;
129 Eigen::VectorXf state_vector(8);
130 state_vector << 0, 0, 0, 0, 0, 0, 7, 8;
132 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
134 std::vector<common_lib::structures::Cone> perception_map = {
137 std::vector<int> matched_ids;
138 std::vector<Eigen::Vector2f> matched_cone_positions;
139 std::vector<Eigen::Vector2f> new_features;
141 Eigen::MatrixXf observation_noise_covariance_matrix = Eigen::MatrixXf::Identity(2, 2);
145 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
146 matched_ids, matched_cone_positions, new_features,
151 ASSERT_EQ(matched_ids.size(), 0);
152 ASSERT_EQ(matched_cone_positions.size(), 0);
153 ASSERT_EQ(new_features.size(), 0);
158TEST(DATA_ASSOCIATION_MODEL, VALID_MATCH_ZERO_DELTA) {
160 float max_landmark_distance = 15.0f;
163 Eigen::VectorXf state_vector(8);
164 state_vector << 0, 0, 0, 0, 0, 0, 3, 4;
166 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
168 std::vector<common_lib::structures::Cone> perception_map = {
171 std::vector<int> matched_ids;
172 std::vector<Eigen::Vector2f> matched_cone_positions;
173 std::vector<Eigen::Vector2f> new_features;
176 Eigen::MatrixXf observation_noise_covariance_matrix = Eigen::MatrixXf::Zero(2, 2);
180 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
181 matched_ids, matched_cone_positions, new_features,
185 ASSERT_EQ(matched_ids.size(), 1);
186 ASSERT_EQ(matched_cone_positions.size(), 1);
187 ASSERT_EQ(new_features.size(), 0);
189 ASSERT_EQ(matched_ids[0],
191 ASSERT_FLOAT_EQ(matched_cone_positions[0](0), 3.0);
192 ASSERT_FLOAT_EQ(matched_cone_positions[0](1), 4.0);
198TEST(DATA_ASSOCIATION_MODEL, VALID_MATCH_MODERATE_NOISE) {
200 float max_landmark_distance = 15.0f;
203 Eigen::VectorXf state_vector(8);
204 state_vector << 0, 0, 0, 0, 0, 0, 3, 4;
206 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
208 std::vector<common_lib::structures::Cone> perception_map = {
211 std::vector<int> matched_ids;
212 std::vector<Eigen::Vector2f> matched_cone_positions;
213 std::vector<Eigen::Vector2f> new_features;
216 Eigen::MatrixXf observation_noise_covariance_matrix = 0.1 * Eigen::MatrixXf::Identity(2, 2);
220 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
221 matched_ids, matched_cone_positions, new_features,
225 ASSERT_EQ(matched_ids.size(), 1);
226 ASSERT_EQ(matched_cone_positions.size(), 1);
227 ASSERT_EQ(new_features.size(), 0);
229 ASSERT_EQ(matched_ids[0],
231 ASSERT_NEAR(matched_cone_positions[0](0), 3.1, 0.1);
232 ASSERT_NEAR(matched_cone_positions[0](1), 4.1, 0.1);
237TEST(DATA_ASSOCIATION_MODEL, VALID_MATCH_INCREASING_NOISE) {
239 float max_landmark_distance = 15.0f;
242 Eigen::VectorXf state_vector(8);
243 state_vector << 0, 0, 0, 0, 0, 0, 3, 4;
245 Eigen::MatrixXf covariance_matrix = Eigen::MatrixXf::Identity(8, 8);
247 std::vector<common_lib::structures::Cone> perception_map = {
250 std::vector<int> matched_ids;
251 std::vector<Eigen::Vector2f> matched_cone_positions;
252 std::vector<Eigen::Vector2f> new_features;
255 Eigen::MatrixXf low_noise_covariance_matrix = 0.1 * Eigen::MatrixXf::Identity(2, 2);
259 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
260 matched_ids, matched_cone_positions, new_features,
264 ASSERT_EQ(matched_ids.size(), 0);
265 ASSERT_EQ(matched_cone_positions.size(), 0);
269 matched_cone_positions.clear();
270 new_features.clear();
273 Eigen::MatrixXf high_noise_covariance_matrix = 10.0 * Eigen::MatrixXf::Identity(2, 2);
277 data_association_model.
associate_n_filter(perception_map, state_vector, covariance_matrix,
278 matched_ids, matched_cone_positions, new_features,
282 ASSERT_EQ(matched_ids.size(), 1);
283 ASSERT_EQ(matched_cone_positions.size(), 1);
285 ASSERT_EQ(matched_ids[0], 6);
290TEST(DATA_ASSOCIATION_MODEL, INVALID_PARAMETERS) {
292 float invalid_max_landmark_distance = 0.5f;
293 float valid_max_landmark_distance = 15.0f;
294 float invalid_association_gate = -1.0f;
295 float invalid_new_landmark_gate = -1.0f;
299 EXPECT_THROW({
MaxLikelihood data_association_model(invalid_max_landmark_distance); },
300 std::invalid_argument);
304 EXPECT_THROW({
MaxLikelihood data_association_model(valid_max_landmark_distance); },
305 std::invalid_argument);
310 EXPECT_THROW({
MaxLikelihood data_association_model(valid_max_landmark_distance); },
311 std::invalid_argument);
int associate_n_filter(const std::vector< common_lib::structures::Cone > &perception_map, Eigen::VectorXf &_x_vector_, Eigen::MatrixXf &_p_matrix_, std::vector< int > &matched_ids, std::vector< Eigen::Vector2f > &matched_cone_positions, std::vector< Eigen::Vector2f > &new_features, ObservationModel *observation_model) const override
normalized distance gate (closest unmatched landmark)