19TEST(EKF_SLAM, LINEAR_MOVEMENT_INTEGRITY_TEST) {
21 std::shared_ptr<common_lib::structures::VehicleState> vehicle_state =
22 std::make_shared<common_lib::structures::VehicleState>();
23 std::shared_ptr<MotionUpdate> motion_update = std::make_shared<MotionUpdate>();
24 std::shared_ptr<std::vector<common_lib::structures::Cone>> track_map =
25 std::make_shared<std::vector<common_lib::structures::Cone>>();
26 std::shared_ptr<std::vector<common_lib::structures::Cone>> initial_map =
27 std::make_shared<std::vector<common_lib::structures::Cone>>();
28 std::shared_ptr<std::vector<common_lib::structures::Cone>> predicted_map =
29 std::make_shared<std::vector<common_lib::structures::Cone>>();
30 motion_update->last_update = rclcpp::Clock().now();
32 Eigen::Matrix2f q_matrix = Eigen::Matrix2f::Zero();
33 q_matrix(0, 0) =
static_cast<float>(0.1);
34 q_matrix(1, 1) =
static_cast<float>(0.1);
35 Eigen::MatrixXf r_matrix = Eigen::MatrixXf::Zero(6, 6);
36 r_matrix(0, 0) =
static_cast<float>(0.1);
37 r_matrix(1, 1) =
static_cast<float>(0.1);
38 r_matrix(2, 2) =
static_cast<float>(0.1);
39 r_matrix(3, 3) =
static_cast<float>(0.1);
40 r_matrix(4, 4) =
static_cast<float>(0.1);
41 r_matrix(5, 5) =
static_cast<float>(0.1);
42 std::shared_ptr<MotionModel> motion_model = std::make_shared<ImuVelocityModel>(r_matrix);
43 std::shared_ptr<ObservationModel> observation_model =
44 std::make_shared<ObservationModel>(q_matrix);
45 std::shared_ptr<DataAssociationModel> data_association_model =
46 std::make_shared<MaxLikelihood>(20.0);
49 initial_map->push_back(
51 common_lib::competition_logic::Color::LARGE_ORANGE, 1.0));
52 initial_map->push_back(
54 common_lib::competition_logic::Color::LARGE_ORANGE, 1.0));
62 common_lib::competition_logic::Color::BLUE,
65 common_lib::competition_logic::Color::BLUE,
88 std::shared_ptr<ExtendedKalmanFilter> ekf =
89 std::make_shared<ExtendedKalmanFilter>(observation_model, data_association_model);
90 ekf->add_motion_model(
"imu", motion_model);
92 for (
int i = -1; i < 10; i++) {
94 motion_update->rotational_velocity = 0;
95 motion_update->last_update = rclcpp::Clock().now();
96 int delta_t =
static_cast<int>(
97 (motion_update->last_update.seconds() - ekf->get_last_update().seconds()) * 1000);
98 double delta_x =
static_cast<double>(i * delta_t) / 1000;
99 ekf->prediction_step(*motion_update,
"imu");
101 if (i == -1)
continue;
103 predicted_map->clear();
104 predicted_map->push_back(
106 common_lib::competition_logic::Color::LARGE_ORANGE, 1.0));
107 predicted_map->push_back(
109 common_lib::competition_logic::Color::LARGE_ORANGE, 1.0));
110 predicted_map->push_back(
112 common_lib::competition_logic::Color::BLUE, 1.0));
113 predicted_map->push_back(
115 common_lib::competition_logic::Color::BLUE, 1.0));
116 predicted_map->push_back(
118 common_lib::competition_logic::Color::BLUE, 1.0));
119 predicted_map->push_back(
121 common_lib::competition_logic::Color::BLUE, 1.0));
122 predicted_map->push_back(
124 common_lib::competition_logic::Color::BLUE, 1.0));
125 predicted_map->push_back(
127 common_lib::competition_logic::Color::BLUE, 1.0));
128 predicted_map->push_back(
130 common_lib::competition_logic::Color::BLUE, 1.0));
131 predicted_map->push_back(
133 common_lib::competition_logic::Color::BLUE, 1.0));
134 predicted_map->push_back(
136 common_lib::competition_logic::Color::ORANGE, 1.0));
137 predicted_map->push_back(
139 common_lib::competition_logic::Color::ORANGE, 1.0));
140 predicted_map->push_back(
142 common_lib::competition_logic::Color::ORANGE, 1.0));
143 predicted_map->push_back(
145 common_lib::competition_logic::Color::ORANGE, 1.0));
146 predicted_map->push_back(
148 common_lib::competition_logic::Color::ORANGE, 1.0));
149 predicted_map->push_back(
151 common_lib::competition_logic::Color::ORANGE, 1.0));
152 predicted_map->push_back(
154 common_lib::competition_logic::Color::ORANGE, 1.0));
155 ekf->correction_step(*predicted_map);
156 ekf->update(vehicle_state, track_map);
158 int orange_count = 0;
160 int big_orange_count = 0;
162 if (cone.color == common_lib::competition_logic::Color::ORANGE) {
164 }
else if (cone.color == common_lib::competition_logic::Color::BLUE) {
166 }
else if (cone.color == common_lib::competition_logic::Color::LARGE_ORANGE) {
169 EXPECT_GE(cone.position.x, -1);
170 EXPECT_NEAR(cone.position.y, 2, 9);
176 EXPECT_GE(track_map->size(),
static_cast<unsigned long int>(6));
177 EXPECT_LE(track_map->size(),
static_cast<unsigned long int>(22));
179 EXPECT_GE(vehicle_state->pose.position.x, -0.5);
180 EXPECT_LE(vehicle_state->pose.position.x, 20);
181 std::this_thread::sleep_for(std::chrono::milliseconds(500));
183 EXPECT_GE(track_map->size(),
static_cast<unsigned long int>(12));
184 EXPECT_LE(track_map->size(),
static_cast<unsigned long int>(22));
185 EXPECT_GE(vehicle_state->pose.position.x, -0.5);
186 EXPECT_LE(vehicle_state->pose.position.x, 22);