Skip to content

Commit 1dc2a0e

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

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.");
@@ -234,6 +236,7 @@ bool LaneChangeInterface::canTransitFailureState()
234236
RCLCPP_DEBUG(getLogger(), "%s", message.data());
235237
};
236238

239+
updateDebugMarker();
237240
log_debug_throttled(__func__);
238241

239242
if (module_type_->isAbortState() && !module_type_->hasFinishedAbort()) {
@@ -309,7 +312,7 @@ void LaneChangeInterface::updateDebugMarker() const
309312
return;
310313
}
311314
using marker_utils::lane_change_markers::createDebugMarkerArray;
312-
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData());
315+
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData(), module_type_->getEgoPose());
313316
}
314317

315318
MarkerArray LaneChangeInterface::getModuleVirtualWall()

planning/behavior_path_lane_change_module/src/scene.cpp

+40-17
Original file line numberDiff line numberDiff line change
@@ -553,15 +553,20 @@ bool NormalLaneChange::isNearEndOfCurrentLanes(
553553
const auto lane_change_buffer =
554554
utils::lane_change::calcMinimumLaneChangeLength(*lane_change_parameters_, shift_intervals);
555555

556-
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
556+
const auto distance_to_lane_change_end = std::invoke([&]() {
557+
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
557558

558-
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
559-
distance_to_end = std::min(
560-
distance_to_end,
561-
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
562-
}
559+
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
560+
distance_to_end = std::min(
561+
distance_to_end,
562+
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
563+
}
564+
565+
return std::max(0.0, distance_to_end) - lane_change_buffer;
566+
});
563567

564-
return (std::max(0.0, distance_to_end) - lane_change_buffer) < threshold;
568+
lane_change_debug_.distance_to_end_of_current_lane = distance_to_lane_change_end;
569+
return distance_to_lane_change_end < threshold;
565570
}
566571

567572
bool NormalLaneChange::hasFinishedLaneChange() const
@@ -579,29 +584,34 @@ bool NormalLaneChange::hasFinishedLaneChange() const
579584
}
580585

581586
const auto reach_lane_change_end = dist_to_lane_change_end + finish_judge_buffer < 0.0;
587+
588+
lane_change_debug_.distance_to_lane_change_finished =
589+
dist_to_lane_change_end + finish_judge_buffer;
590+
582591
if (!reach_lane_change_end) {
583592
return false;
584593
}
585594

586595
const auto arc_length = lanelet::utils::getArcCoordinates(status_.target_lanes, current_pose);
587596
const auto reach_target_lane =
588597
std::abs(arc_length.distance) < lane_change_parameters_->finish_judge_lateral_threshold;
589-
if (!reach_target_lane) {
590-
return false;
591-
}
592598

593-
return true;
599+
lane_change_debug_.distance_to_lane_change_finished = arc_length.distance;
600+
601+
return reach_target_lane;
594602
}
595603

596604
bool NormalLaneChange::isAbleToReturnCurrentLane() const
597605
{
598606
if (status_.lane_change_path.path.points.size() < 2) {
607+
lane_change_debug_.is_able_to_return_to_current_lane = false;
599608
return false;
600609
}
601610

602611
if (!utils::isEgoWithinOriginalLane(
603612
status_.current_lanes, getEgoPose(), planner_data_->parameters,
604613
lane_change_parameters_->cancel.overhang_tolerance)) {
614+
lane_change_debug_.is_able_to_return_to_current_lane = false;
605615
return false;
606616
}
607617

@@ -619,12 +629,15 @@ bool NormalLaneChange::isAbleToReturnCurrentLane() const
619629
dist += calcSignedArcLength(status_.lane_change_path.path.points, idx, idx + 1);
620630
if (dist > estimated_travel_dist) {
621631
const auto & estimated_pose = status_.lane_change_path.path.points.at(idx + 1).point.pose;
622-
return utils::isEgoWithinOriginalLane(
632+
auto is_ego_within_original_lane = utils::isEgoWithinOriginalLane(
623633
status_.current_lanes, estimated_pose, planner_data_->parameters,
624634
lane_change_parameters_->cancel.overhang_tolerance);
635+
lane_change_debug_.is_able_to_return_to_current_lane = is_ego_within_original_lane;
636+
return is_ego_within_original_lane;
625637
}
626638
}
627639

640+
lane_change_debug_.is_able_to_return_to_current_lane = true;
628641
return true;
629642
}
630643

@@ -665,17 +678,18 @@ bool NormalLaneChange::isAbleToStopSafely() const
665678
bool NormalLaneChange::hasFinishedAbort() const
666679
{
667680
if (!abort_path_) {
681+
lane_change_debug_.is_abort = true;
668682
return true;
669683
}
670684

671685
const auto distance_to_finish = calcSignedArcLength(
672686
abort_path_->path.points, getEgoPosition(), abort_path_->info.shift_line.end.position);
687+
lane_change_debug_.distance_to_abort_finished = distance_to_finish;
673688

674-
if (distance_to_finish < 0.0) {
675-
return true;
676-
}
689+
const auto has_finished_abort = distance_to_finish < 0.0;
690+
lane_change_debug_.is_abort = has_finished_abort;
677691

678-
return false;
692+
return has_finished_abort;
679693
}
680694

681695
bool NormalLaneChange::isAbortState() const
@@ -692,6 +706,7 @@ bool NormalLaneChange::isAbortState() const
692706
return false;
693707
}
694708

709+
lane_change_debug_.is_abort = true;
695710
return true;
696711
}
697712
int NormalLaneChange::getNumToPreferredLane(const lanelet::ConstLanelet & lane) const
@@ -846,6 +861,10 @@ LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
846861
const auto target_backward_lanes = utils::lane_change::getBackwardLanelets(
847862
route_handler, target_lanes, current_pose, backward_length);
848863

864+
lane_change_debug_.current_lanes = current_lanes;
865+
lane_change_debug_.target_lanes = target_lanes;
866+
lane_change_debug_.target_backward_lanes = target_backward_lanes;
867+
849868
// filter objects to get target object index
850869
const auto target_obj_index =
851870
filterObject(objects, current_lanes, target_lanes, target_backward_lanes);
@@ -2081,6 +2100,7 @@ bool NormalLaneChange::isVehicleStuck(
20812100
bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lanes) const
20822101
{
20832102
if (current_lanes.empty()) {
2103+
lane_change_debug_.is_stuck = false;
20842104
return false; // can not check
20852105
}
20862106

@@ -2100,7 +2120,10 @@ bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lan
21002120
getCommonParam().base_link2front + DETECTION_DISTANCE_MARGIN;
21012121
RCLCPP_DEBUG(logger_, "max_lane_change_length: %f, max_acc: %f", max_lane_change_length, max_acc);
21022122

2103-
return isVehicleStuck(current_lanes, detection_distance);
2123+
auto is_vehicle_stuck = isVehicleStuck(current_lanes, detection_distance);
2124+
2125+
lane_change_debug_.is_stuck = is_vehicle_stuck;
2126+
return is_vehicle_stuck;
21042127
}
21052128

21062129
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)