Skip to content

Commit fb83190

Browse files
feat(lane_change): additional debug markers
Signed-off-by: Muhammad Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent a8364b4 commit fb83190

File tree

5 files changed

+122
-26
lines changed

5 files changed

+122
-26
lines changed

planning/behavior_path_lane_change_module/include/behavior_path_lane_change_module/utils/debug_structs.hpp

+24
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@
2121

2222
#include <geometry_msgs/msg/detail/polygon__struct.hpp>
2323

24+
#include <lanelet2_core/Forward.h>
25+
26+
#include <limits>
2427
#include <string>
2528

2629
namespace behavior_path_planner::data::lane_change
@@ -34,7 +37,17 @@ struct Debug
3437
CollisionCheckDebugMap collision_check_objects_after_approval;
3538
LaneChangeTargetObjects filtered_objects;
3639
geometry_msgs::msg::Polygon execution_area;
40+
geometry_msgs::msg::Pose ego_pose;
41+
lanelet::ConstLanelets current_lanes;
42+
lanelet::ConstLanelets target_lanes;
43+
lanelet::ConstLanelets target_backward_lanes;
3744
double collision_check_object_debug_lifetime{0.0};
45+
double distance_to_end_of_current_lane{std::numeric_limits<double>::max()};
46+
double distance_to_lane_change_finished{std::numeric_limits<double>::max()};
47+
double distance_to_abort_finished{std::numeric_limits<double>::max()};
48+
bool is_able_to_return_to_current_lane{false};
49+
bool is_stuck{false};
50+
bool is_abort{false};
3851

3952
void reset()
4053
{
@@ -44,7 +57,18 @@ struct Debug
4457
filtered_objects.current_lane.clear();
4558
filtered_objects.target_lane.clear();
4659
filtered_objects.other_lane.clear();
60+
execution_area.points.clear();
61+
current_lanes.clear();
62+
target_lanes.clear();
63+
target_backward_lanes.clear();
64+
4765
collision_check_object_debug_lifetime = 0.0;
66+
distance_to_end_of_current_lane = std::numeric_limits<double>::max();
67+
distance_to_lane_change_finished = std::numeric_limits<double>::max();
68+
distance_to_abort_finished = std::numeric_limits<double>::max();
69+
is_able_to_return_to_current_lane = false;
70+
is_stuck = false;
71+
is_abort = false;
4872
}
4973
};
5074
} // namespace behavior_path_planner::data::lane_change

planning/behavior_path_lane_change_module/include/behavior_path_lane_change_module/utils/markers.hpp

+4-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
#include "behavior_path_planner_common/utils/path_safety_checker/path_safety_checker_parameters.hpp"
2121

2222
#include <geometry_msgs/msg/detail/polygon__struct.hpp>
23+
#include <geometry_msgs/msg/detail/pose__struct.hpp>
2324
#include <visualization_msgs/msg/detail/marker_array__struct.hpp>
2425
#include <visualization_msgs/msg/marker_array.hpp>
2526

@@ -42,7 +43,9 @@ MarkerArray showFilteredObjects(
4243
const ExtendedPredictedObjects & target_lane_objects,
4344
const ExtendedPredictedObjects & other_lane_objects, const std::string & ns);
4445
MarkerArray createExecutionArea(const geometry_msgs::msg::Polygon & execution_area);
45-
MarkerArray createDebugMarkerArray(const Debug & debug_data);
46+
MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose);
47+
MarkerArray createDebugMarkerArray(
48+
const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose);
4649

4750
} // namespace marker_utils::lane_change_markers
4851
#endif // BEHAVIOR_PATH_LANE_CHANGE_MODULE__UTILS__MARKERS_HPP_

planning/behavior_path_lane_change_module/src/interface.cpp

+5-2
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,10 @@ void LaneChangeInterface::updateData()
8484
if (isWaitingApproval()) {
8585
module_type_->updateLaneChangeStatus();
8686
}
87-
updateDebugMarker();
8887

8988
module_type_->updateSpecialData();
9089
module_type_->resetStopPose();
90+
updateDebugMarker();
9191
}
9292

9393
void LaneChangeInterface::postProcess()
@@ -97,6 +97,7 @@ void LaneChangeInterface::postProcess()
9797
post_process_safety_status_ =
9898
module_type_->evaluateApprovedPathWithUnsafeHysteresis(safety_status);
9999
}
100+
updateDebugMarker();
100101
}
101102

102103
BehaviorModuleOutput LaneChangeInterface::plan()
@@ -200,6 +201,7 @@ bool LaneChangeInterface::canTransitSuccessState()
200201
auto log_debug_throttled = [&](std::string_view message) -> void {
201202
RCLCPP_DEBUG(getLogger(), "%s", message.data());
202203
};
204+
updateDebugMarker();
203205

204206
if (module_type_->specialExpiredCheck() && isWaitingApproval()) {
205207
log_debug_throttled("Run specialExpiredCheck.");
@@ -229,6 +231,7 @@ bool LaneChangeInterface::canTransitFailureState()
229231
RCLCPP_DEBUG(getLogger(), "%s", message.data());
230232
};
231233

234+
updateDebugMarker();
232235
log_debug_throttled(__func__);
233236

234237
if (module_type_->isAbortState() && !module_type_->hasFinishedAbort()) {
@@ -304,7 +307,7 @@ void LaneChangeInterface::updateDebugMarker() const
304307
return;
305308
}
306309
using marker_utils::lane_change_markers::createDebugMarkerArray;
307-
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData());
310+
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData(), module_type_->getEgoPose());
308311
}
309312

310313
MarkerArray LaneChangeInterface::getModuleVirtualWall()

planning/behavior_path_lane_change_module/src/scene.cpp

+40-17
Original file line numberDiff line numberDiff line change
@@ -559,15 +559,20 @@ bool NormalLaneChange::isNearEndOfCurrentLanes(
559559
const auto lane_change_buffer =
560560
utils::lane_change::calcMinimumLaneChangeLength(*lane_change_parameters_, shift_intervals);
561561

562-
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
562+
const auto distance_to_lane_change_end = std::invoke([&]() {
563+
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
563564

564-
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
565-
distance_to_end = std::min(
566-
distance_to_end,
567-
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
568-
}
565+
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
566+
distance_to_end = std::min(
567+
distance_to_end,
568+
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
569+
}
570+
571+
return std::max(0.0, distance_to_end) - lane_change_buffer;
572+
});
569573

570-
return (std::max(0.0, distance_to_end) - lane_change_buffer) < threshold;
574+
lane_change_debug_.distance_to_end_of_current_lane = distance_to_lane_change_end;
575+
return distance_to_lane_change_end < threshold;
571576
}
572577

573578
bool NormalLaneChange::hasFinishedLaneChange() const
@@ -585,29 +590,34 @@ bool NormalLaneChange::hasFinishedLaneChange() const
585590
}
586591

587592
const auto reach_lane_change_end = dist_to_lane_change_end + finish_judge_buffer < 0.0;
593+
594+
lane_change_debug_.distance_to_lane_change_finished =
595+
dist_to_lane_change_end + finish_judge_buffer;
596+
588597
if (!reach_lane_change_end) {
589598
return false;
590599
}
591600

592601
const auto arc_length = lanelet::utils::getArcCoordinates(status_.target_lanes, current_pose);
593602
const auto reach_target_lane =
594603
std::abs(arc_length.distance) < lane_change_parameters_->finish_judge_lateral_threshold;
595-
if (!reach_target_lane) {
596-
return false;
597-
}
598604

599-
return true;
605+
lane_change_debug_.distance_to_lane_change_finished = arc_length.distance;
606+
607+
return reach_target_lane;
600608
}
601609

602610
bool NormalLaneChange::isAbleToReturnCurrentLane() const
603611
{
604612
if (status_.lane_change_path.path.points.size() < 2) {
613+
lane_change_debug_.is_able_to_return_to_current_lane = false;
605614
return false;
606615
}
607616

608617
if (!utils::isEgoWithinOriginalLane(
609618
status_.current_lanes, getEgoPose(), planner_data_->parameters,
610619
lane_change_parameters_->cancel.overhang_tolerance)) {
620+
lane_change_debug_.is_able_to_return_to_current_lane = false;
611621
return false;
612622
}
613623

@@ -625,12 +635,15 @@ bool NormalLaneChange::isAbleToReturnCurrentLane() const
625635
dist += calcSignedArcLength(status_.lane_change_path.path.points, idx, idx + 1);
626636
if (dist > estimated_travel_dist) {
627637
const auto & estimated_pose = status_.lane_change_path.path.points.at(idx + 1).point.pose;
628-
return utils::isEgoWithinOriginalLane(
638+
auto is_ego_within_original_lane = utils::isEgoWithinOriginalLane(
629639
status_.current_lanes, estimated_pose, planner_data_->parameters,
630640
lane_change_parameters_->cancel.overhang_tolerance);
641+
lane_change_debug_.is_able_to_return_to_current_lane = is_ego_within_original_lane;
642+
return is_ego_within_original_lane;
631643
}
632644
}
633645

646+
lane_change_debug_.is_able_to_return_to_current_lane = true;
634647
return true;
635648
}
636649

@@ -671,17 +684,18 @@ bool NormalLaneChange::isAbleToStopSafely() const
671684
bool NormalLaneChange::hasFinishedAbort() const
672685
{
673686
if (!abort_path_) {
687+
lane_change_debug_.is_abort = true;
674688
return true;
675689
}
676690

677691
const auto distance_to_finish = calcSignedArcLength(
678692
abort_path_->path.points, getEgoPosition(), abort_path_->info.shift_line.end.position);
693+
lane_change_debug_.distance_to_abort_finished = distance_to_finish;
679694

680-
if (distance_to_finish < 0.0) {
681-
return true;
682-
}
695+
const auto has_finished_abort = distance_to_finish < 0.0;
696+
lane_change_debug_.is_abort = has_finished_abort;
683697

684-
return false;
698+
return has_finished_abort;
685699
}
686700

687701
bool NormalLaneChange::isAbortState() const
@@ -698,6 +712,7 @@ bool NormalLaneChange::isAbortState() const
698712
return false;
699713
}
700714

715+
lane_change_debug_.is_abort = true;
701716
return true;
702717
}
703718
int NormalLaneChange::getNumToPreferredLane(const lanelet::ConstLanelet & lane) const
@@ -852,6 +867,10 @@ LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
852867
const auto target_backward_lanes = behavior_path_planner::utils::getBackwardLanelets(
853868
route_handler, target_lanes, current_pose, backward_length);
854869

870+
lane_change_debug_.current_lanes = current_lanes;
871+
lane_change_debug_.target_lanes = target_lanes;
872+
lane_change_debug_.target_backward_lanes = target_backward_lanes;
873+
855874
// filter objects to get target object index
856875
const auto target_obj_index =
857876
filterObject(objects, current_lanes, target_lanes, target_backward_lanes);
@@ -2035,6 +2054,7 @@ bool NormalLaneChange::isVehicleStuck(
20352054
bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lanes) const
20362055
{
20372056
if (current_lanes.empty()) {
2057+
lane_change_debug_.is_stuck = false;
20382058
return false; // can not check
20392059
}
20402060

@@ -2054,7 +2074,10 @@ bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lan
20542074
getCommonParam().base_link2front + DETECTION_DISTANCE_MARGIN;
20552075
RCLCPP_DEBUG(logger_, "max_lane_change_length: %f, max_acc: %f", max_lane_change_length, max_acc);
20562076

2057-
return isVehicleStuck(current_lanes, detection_distance);
2077+
auto is_vehicle_stuck = isVehicleStuck(current_lanes, detection_distance);
2078+
2079+
lane_change_debug_.is_stuck = is_vehicle_stuck;
2080+
return is_vehicle_stuck;
20582081
}
20592082

20602083
void NormalLaneChange::setStopPose(const Pose & stop_pose)

planning/behavior_path_lane_change_module/src/utils/markers.cpp

+49-6
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,18 @@
1717
#include "behavior_path_planner_common/utils/path_shifter/path_shifter.hpp"
1818

1919
#include <behavior_path_lane_change_module/utils/markers.hpp>
20+
#include <lanelet2_extension/visualization/visualization.hpp>
2021
#include <tier4_autoware_utils/ros/marker_helper.hpp>
2122

2223
#include <autoware_auto_perception_msgs/msg/predicted_objects.hpp>
2324
#include <autoware_auto_planning_msgs/msg/path_with_lane_id.hpp>
25+
#include <geometry_msgs/msg/detail/pose__struct.hpp>
2426
#include <visualization_msgs/msg/detail/marker__struct.hpp>
2527
#include <visualization_msgs/msg/detail/marker_array__struct.hpp>
2628

2729
#include <cstdint>
2830
#include <cstdlib>
31+
#include <sstream>
2932
#include <string>
3033
#include <vector>
3134

@@ -122,8 +125,39 @@ MarkerArray showFilteredObjects(
122125
return marker_array;
123126
}
124127

125-
MarkerArray createDebugMarkerArray(const Debug & debug_data)
128+
MarkerArray showExecutionInfo(const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose)
126129
{
130+
auto default_text_marker = [&]() {
131+
return createDefaultMarker(
132+
"map", rclcpp::Clock{RCL_ROS_TIME}.now(), "execution_info", 0, Marker::TEXT_VIEW_FACING,
133+
createMarkerScale(0.5, 0.5, 0.5), colors::white());
134+
};
135+
136+
MarkerArray marker_array;
137+
138+
auto safety_check_info_text = default_text_marker();
139+
safety_check_info_text.pose = ego_pose;
140+
safety_check_info_text.pose.position.z += 4.0;
141+
142+
std::ostringstream ss;
143+
144+
ss << "\nDistToEndOfCurrentLane: " << std::setprecision(5)
145+
<< debug_data.distance_to_end_of_current_lane
146+
<< "\nDistToLaneChangeFinished: " << debug_data.distance_to_lane_change_finished
147+
<< (debug_data.is_stuck ? "\nVehicleStuck" : "")
148+
<< (debug_data.is_able_to_return_to_current_lane ? "\nAbleToReturnToCurrentLane" : "")
149+
<< (debug_data.is_abort ? "\nAborting" : "")
150+
<< "\nDistanceToAbortFinished: " << debug_data.distance_to_abort_finished;
151+
152+
safety_check_info_text.text = ss.str();
153+
marker_array.markers.push_back(safety_check_info_text);
154+
return marker_array;
155+
}
156+
157+
MarkerArray createDebugMarkerArray(
158+
const Debug & debug_data, const geometry_msgs::msg::Pose & ego_pose)
159+
{
160+
using lanelet::visualization::laneletsAsTriangleMarkerArray;
127161
using marker_utils::showPolygon;
128162
using marker_utils::showPredictedPath;
129163
using marker_utils::showSafetyCheckInfo;
@@ -141,6 +175,20 @@ MarkerArray createDebugMarkerArray(const Debug & debug_data)
141175
tier4_autoware_utils::appendMarkerArray(added, &debug_marker);
142176
};
143177

178+
if (!debug_data.execution_area.points.empty()) {
179+
add(createPolygonMarkerArray(
180+
debug_data.execution_area, "execution_area", 0, 0.16, 1.0, 0.69, 0.1));
181+
}
182+
183+
add(showExecutionInfo(debug_data, ego_pose));
184+
185+
// lanes
186+
add(laneletsAsTriangleMarkerArray(
187+
"current_lanes", debug_data.current_lanes, colors::light_yellow(0.2)));
188+
add(laneletsAsTriangleMarkerArray("target_lanes", debug_data.target_lanes, colors::aqua(0.2)));
189+
add(laneletsAsTriangleMarkerArray(
190+
"target_backward_lanes", debug_data.target_backward_lanes, colors::blue(0.2)));
191+
144192
add(showAllValidLaneChangePath(debug_valid_paths, "lane_change_valid_paths"));
145193
add(showFilteredObjects(
146194
debug_filtered_objects.current_lane, debug_filtered_objects.target_lane,
@@ -162,11 +210,6 @@ MarkerArray createDebugMarkerArray(const Debug & debug_data)
162210
"ego_and_target_polygon_relation_after_approval"));
163211
}
164212

165-
if (!debug_data.execution_area.points.empty()) {
166-
add(createPolygonMarkerArray(
167-
debug_data.execution_area, "execution_area", 0, 0.16, 1.0, 0.69, 0.1));
168-
}
169-
170213
return debug_marker;
171214
}
172215
} // namespace marker_utils::lane_change_markers

0 commit comments

Comments
 (0)