39 #include <gtest/gtest.h>
45 TEST(OrientationToolsTests, test_bad_penultimate_pose)
50 std::vector<geometry_msgs::PoseStamped> path;
51 for (
size_t i = 0; i < 10; ++i)
53 geometry_msgs::PoseStamped pose;
54 pose.pose.position.x = i * 0.05;
55 pose.pose.position.y = 0.0;
56 pose.pose.orientation.w = 1.0;
61 path.back().pose.position.x = 0.378;
62 path.back().pose.position.y = 0.02;
65 double final_yaw = 0.15;
66 path.back().pose.orientation.z = sin(final_yaw / 2.0);
67 path.back().pose.orientation.w = cos(final_yaw / 2.0);
74 EXPECT_EQ(0.0, path.back().pose.orientation.x);
75 EXPECT_EQ(0.0, path.back().pose.orientation.y);
76 EXPECT_FLOAT_EQ(0.15,
tf2::getYaw(path.back().pose.orientation));
79 for (
size_t i = 0; i < 8; ++i)
81 EXPECT_EQ(0.0, path[i].pose.orientation.x);
82 EXPECT_EQ(0.0, path[i].pose.orientation.y);
83 EXPECT_FLOAT_EQ(0.0,
tf2::getYaw(path[i].pose.orientation));
87 EXPECT_EQ(0.0, path[8].pose.orientation.x);
88 EXPECT_EQ(0.0, path[8].pose.orientation.y);
89 EXPECT_FLOAT_EQ(2.4037776,
tf2::getYaw(path[8].pose.orientation));
92 std::vector<geometry_msgs::PoseStamped> filtered_path;
96 EXPECT_EQ(9,
static_cast<int>(filtered_path.size()));
99 EXPECT_EQ(0.0, filtered_path.back().pose.orientation.x);
100 EXPECT_EQ(0.0, filtered_path.back().pose.orientation.y);
101 EXPECT_FLOAT_EQ(0.15,
tf2::getYaw(filtered_path.back().pose.orientation));
104 for (
size_t i = 0; i < 7; ++i)
106 EXPECT_EQ(0.0, filtered_path[i].pose.orientation.x);
107 EXPECT_EQ(0.0, filtered_path[i].pose.orientation.y);
108 EXPECT_FLOAT_EQ(0.0,
tf2::getYaw(filtered_path[i].pose.orientation));
112 EXPECT_EQ(0.0, filtered_path[7].pose.orientation.x);
113 EXPECT_EQ(0.0, filtered_path[7].pose.orientation.y);
114 EXPECT_FLOAT_EQ(0.62024951,
tf2::getYaw(filtered_path[7].pose.orientation));
117 TEST(OrientationToolsTests, test_bad_initial_pose)
122 std::vector<geometry_msgs::PoseStamped> path;
123 for (
size_t i = 0; i < 10; ++i)
125 geometry_msgs::PoseStamped pose;
126 pose.pose.position.x = i * 0.05;
127 pose.pose.position.y = 0.0;
128 pose.pose.orientation.w = 1.0;
129 path.push_back(pose);
133 path.front().pose.position.x = 0.051;
134 path.front().pose.position.y = 0.01;
137 double final_yaw = -0.12;
138 path.back().pose.orientation.z = sin(final_yaw / 2.0);
139 path.back().pose.orientation.w = cos(final_yaw / 2.0);
146 EXPECT_EQ(0.0, path.back().pose.orientation.x);
147 EXPECT_EQ(0.0, path.back().pose.orientation.y);
148 EXPECT_FLOAT_EQ(-0.12,
tf2::getYaw(path.back().pose.orientation));
151 EXPECT_EQ(0.0, path.front().pose.orientation.x);
152 EXPECT_EQ(0.0, path.front().pose.orientation.y);
153 EXPECT_FLOAT_EQ(-1.670465,
tf2::getYaw(path.front().pose.orientation));
156 for (
size_t i = 1; i < 9; ++i)
158 EXPECT_EQ(0.0, path[i].pose.orientation.x);
159 EXPECT_EQ(0.0, path[i].pose.orientation.y);
160 EXPECT_FLOAT_EQ(0.0,
tf2::getYaw(path[i].pose.orientation));
164 std::vector<geometry_msgs::PoseStamped> filtered_path;
168 EXPECT_EQ(9,
static_cast<int>(filtered_path.size()));
171 EXPECT_EQ(0.0, filtered_path.front().pose.orientation.x);
172 EXPECT_EQ(0.0, filtered_path.front().pose.orientation.y);
173 EXPECT_FLOAT_EQ(-0.2013171,
tf2::getYaw(filtered_path.front().pose.orientation));
176 for (
size_t i = 1; i < 8; ++i)
178 EXPECT_EQ(0.0, filtered_path[i].pose.orientation.x);
179 EXPECT_EQ(0.0, filtered_path[i].pose.orientation.y);
180 EXPECT_FLOAT_EQ(0.0,
tf2::getYaw(filtered_path[i].pose.orientation));
184 EXPECT_EQ(0.0, filtered_path.back().pose.orientation.x);
185 EXPECT_EQ(0.0, filtered_path.back().pose.orientation.y);
186 EXPECT_FLOAT_EQ(-0.12,
tf2::getYaw(filtered_path.back().pose.orientation));
189 TEST(OrientationToolsTests, test_zigzag)
193 std::vector<geometry_msgs::PoseStamped> path;
194 for (
size_t i = 0; i < 20; ++i)
196 geometry_msgs::PoseStamped pose;
197 pose.pose.position.x = i * 0.05;
200 pose.pose.position.y = 0.15;
204 pose.pose.position.y = 0.0;
206 pose.pose.orientation.w = 1.0;
207 path.push_back(pose);
214 std::vector<geometry_msgs::PoseStamped> filtered_path;
218 EXPECT_EQ(6,
static_cast<int>(filtered_path.size()));
221 for (
size_t i = 1; i < filtered_path.size(); ++i)
223 double dx = filtered_path[i].pose.position.x - filtered_path[i-1].pose.position.x;
224 double dy = filtered_path[i].pose.position.y - filtered_path[i-1].pose.position.y;
225 EXPECT_TRUE(std::hypot(dx, dy) < 0.25);
229 TEST(OrientationToolsTests, test_yaw_gap_tolerance)
232 std::vector<geometry_msgs::PoseStamped> path;
235 geometry_msgs::PoseStamped pose;
236 pose.pose.position.x = 0.0;
237 pose.pose.position.y = 0.0;
238 pose.pose.orientation.w = 1.0;
239 path.push_back(pose);
242 pose.pose.position.x = -0.05;
243 pose.pose.position.y = -0.01;
244 path.push_back(pose);
247 for (
size_t i = 0; i < 8; ++i)
249 pose.pose.position.x = -0.1;
250 pose.pose.position.y = -0.01 + i * 0.05;
251 path.push_back(pose);
256 double final_yaw = 1.0;
257 path.back().pose.orientation.z = sin(final_yaw / 2.0);
258 path.back().pose.orientation.w = cos(final_yaw / 2.0);
265 EXPECT_EQ(0.0, path.back().pose.orientation.x);
266 EXPECT_EQ(0.0, path.back().pose.orientation.y);
267 EXPECT_FLOAT_EQ(1.0,
tf2::getYaw(path.back().pose.orientation));
270 EXPECT_EQ(0.0, path.front().pose.orientation.x);
271 EXPECT_EQ(0.0, path.front().pose.orientation.y);
272 EXPECT_FLOAT_EQ(-2.9441972,
tf2::getYaw(path.front().pose.orientation));
275 EXPECT_EQ(0.0, path[1].pose.orientation.x);
276 EXPECT_EQ(0.0, path[1].pose.orientation.y);
277 EXPECT_FLOAT_EQ(3.1415927,
tf2::getYaw(path[1].pose.orientation));
280 for (
size_t i = 2; i < 9; ++i)
282 EXPECT_EQ(0.0, path[i].pose.orientation.x);
283 EXPECT_EQ(0.0, path[i].pose.orientation.y);
284 EXPECT_FLOAT_EQ(1.5707964,
tf2::getYaw(path[i].pose.orientation));
288 std::vector<geometry_msgs::PoseStamped> filtered_path;
291 EXPECT_EQ(3,
static_cast<int>(filtered_path.size()));
296 EXPECT_EQ(7,
static_cast<int>(filtered_path.size()));
299 int main(
int argc,
char** argv)
301 testing::InitGoogleTest(&argc, argv);
302 return RUN_ALL_TESTS();