Skip to content

Commit ea06d2f

Browse files
SteveMacenskiLinusTxtonomy
authored andcommitted
Update Smac Planner for rounding to closest bin rather than flooring (ros-navigation#4636)
1 parent 0f8fda3 commit ea06d2f

File tree

3 files changed

+10
-11
lines changed

3 files changed

+10
-11
lines changed

nav2_smac_planner/src/node_hybrid.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -250,8 +250,8 @@ MotionPoses HybridMotionTable::getProjections(const NodeHybrid * node)
250250

251251
unsigned int HybridMotionTable::getClosestAngularBin(const double & theta)
252252
{
253-
return static_cast<unsigned int>(floor(theta / static_cast<double>(bin_size))) %
254-
num_angle_quantization;
253+
auto bin = static_cast<unsigned int>(round(static_cast<float>(theta) / bin_size));
254+
return bin < num_angle_quantization ? bin : 0u;
255255
}
256256

257257
float HybridMotionTable::getAngleFromBin(const unsigned int & bin_idx)

nav2_smac_planner/src/smac_planner_hybrid.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,31 +294,30 @@ nav_msgs::msg::Path SmacPlannerHybrid::createPlan(
294294
if (!costmap->worldToMap(start.pose.position.x, start.pose.position.y, mx, my)) {
295295
throw std::runtime_error("Start pose is out of costmap!");
296296
}
297-
double orientation_bin = tf2::getYaw(start.pose.orientation) / _angle_bin_size;
297+
298+
double orientation_bin = std::round(tf2::getYaw(start.pose.orientation) / _angle_bin_size);
298299
while (orientation_bin < 0.0) {
299300
orientation_bin += static_cast<float>(_angle_quantizations);
300301
}
301302
// This is needed to handle precision issues
302303
if (orientation_bin >= static_cast<float>(_angle_quantizations)) {
303304
orientation_bin -= static_cast<float>(_angle_quantizations);
304305
}
305-
unsigned int orientation_bin_id = static_cast<unsigned int>(floor(orientation_bin));
306-
_a_star->setStart(mx, my, orientation_bin_id);
306+
_a_star->setStart(mx, my, static_cast<unsigned int>(orientation_bin));
307307

308308
// Set goal point, in A* bin search coordinates
309309
if (!costmap->worldToMap(goal.pose.position.x, goal.pose.position.y, mx, my)) {
310310
throw std::runtime_error("Goal pose is out of costmap!");
311311
}
312-
orientation_bin = tf2::getYaw(goal.pose.orientation) / _angle_bin_size;
312+
orientation_bin = std::round(tf2::getYaw(goal.pose.orientation) / _angle_bin_size);
313313
while (orientation_bin < 0.0) {
314314
orientation_bin += static_cast<float>(_angle_quantizations);
315315
}
316316
// This is needed to handle precision issues
317317
if (orientation_bin >= static_cast<float>(_angle_quantizations)) {
318318
orientation_bin -= static_cast<float>(_angle_quantizations);
319319
}
320-
orientation_bin_id = static_cast<unsigned int>(floor(orientation_bin));
321-
_a_star->setGoal(mx, my, orientation_bin_id);
320+
_a_star->setGoal(mx, my, static_cast<unsigned int>(orientation_bin));
322321

323322
// Setup message
324323
nav_msgs::msg::Path plan;

nav2_smac_planner/test/test_nodehybrid.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ TEST(NodeHybridTest, basic_get_closest_angular_bin_test)
323323
{
324324
motion_table.bin_size = M_PI;
325325
motion_table.num_angle_quantization = 2;
326-
double test_theta = M_PI;
326+
double test_theta = M_PI / 2.0 - 0.000001;
327327
unsigned int expected_angular_bin = 0;
328328
unsigned int calculated_angular_bin = motion_table.getClosestAngularBin(test_theta);
329329
EXPECT_EQ(expected_angular_bin, calculated_angular_bin);
@@ -341,8 +341,8 @@ TEST(NodeHybridTest, basic_get_closest_angular_bin_test)
341341
{
342342
motion_table.bin_size = 0.0872664675;
343343
motion_table.num_angle_quantization = 72;
344-
double test_theta = 6.28318526567925;
345-
unsigned int expected_angular_bin = 71;
344+
double test_theta = 6.28317530718; // 0.0001 less than 2 pi
345+
unsigned int expected_angular_bin = 0; // should be closer to wrap around
346346
unsigned int calculated_angular_bin = motion_table.getClosestAngularBin(test_theta);
347347
EXPECT_EQ(expected_angular_bin, calculated_angular_bin);
348348
}

0 commit comments

Comments
 (0)