Skip to content

Commit fbd74f8

Browse files
zulfaqar-azmi-t4karishma1911
authored andcommitted
feat(lane_change): additional debug markers (autowarefoundation#6529)
Signed-off-by: Muhammad Zulfaqar Azmi <zulfaqar.azmi@tier4.jp>
1 parent a015258 commit fbd74f8

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
@@ -85,9 +85,9 @@ void LaneChangeInterface::updateData()
8585
if (isWaitingApproval()) {
8686
module_type_->updateLaneChangeStatus();
8787
}
88-
updateDebugMarker();
8988

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()
@@ -196,6 +197,7 @@ bool LaneChangeInterface::canTransitSuccessState()
196197
auto log_debug_throttled = [&](std::string_view message) -> void {
197198
RCLCPP_DEBUG(getLogger(), "%s", message.data());
198199
};
200+
updateDebugMarker();
199201

200202
if (module_type_->specialExpiredCheck() && isWaitingApproval()) {
201203
log_debug_throttled("Run specialExpiredCheck.");
@@ -225,6 +227,7 @@ bool LaneChangeInterface::canTransitFailureState()
225227
RCLCPP_DEBUG(getLogger(), "%s", message.data());
226228
};
227229

230+
updateDebugMarker();
228231
log_debug_throttled(__func__);
229232

230233
if (module_type_->isAbortState() && !module_type_->hasFinishedAbort()) {
@@ -300,7 +303,7 @@ void LaneChangeInterface::updateDebugMarker() const
300303
return;
301304
}
302305
using marker_utils::lane_change_markers::createDebugMarkerArray;
303-
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData());
306+
debug_marker_ = createDebugMarkerArray(module_type_->getDebugData(), module_type_->getEgoPose());
304307
}
305308

306309
MarkerArray LaneChangeInterface::getModuleVirtualWall()

planning/behavior_path_lane_change_module/src/scene.cpp

+40-17
Original file line numberDiff line numberDiff line change
@@ -567,15 +567,20 @@ bool NormalLaneChange::isNearEndOfCurrentLanes(
567567
const auto lane_change_buffer =
568568
utils::lane_change::calcMinimumLaneChangeLength(*lane_change_parameters_, shift_intervals);
569569

570-
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
570+
const auto distance_to_lane_change_end = std::invoke([&]() {
571+
auto distance_to_end = utils::getDistanceToEndOfLane(current_pose, current_lanes);
571572

572-
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
573-
distance_to_end = std::min(
574-
distance_to_end,
575-
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
576-
}
573+
if (!target_lanes.empty() && route_handler->isInGoalRouteSection(target_lanes.back())) {
574+
distance_to_end = std::min(
575+
distance_to_end,
576+
utils::getSignedDistance(current_pose, route_handler->getGoalPose(), current_lanes));
577+
}
578+
579+
return std::max(0.0, distance_to_end) - lane_change_buffer;
580+
});
577581

578-
return (std::max(0.0, distance_to_end) - lane_change_buffer) < threshold;
582+
lane_change_debug_.distance_to_end_of_current_lane = distance_to_lane_change_end;
583+
return distance_to_lane_change_end < threshold;
579584
}
580585

581586
bool NormalLaneChange::hasFinishedLaneChange() const
@@ -593,29 +598,34 @@ bool NormalLaneChange::hasFinishedLaneChange() const
593598
}
594599

595600
const auto reach_lane_change_end = dist_to_lane_change_end + finish_judge_buffer < 0.0;
601+
602+
lane_change_debug_.distance_to_lane_change_finished =
603+
dist_to_lane_change_end + finish_judge_buffer;
604+
596605
if (!reach_lane_change_end) {
597606
return false;
598607
}
599608

600609
const auto arc_length = lanelet::utils::getArcCoordinates(status_.target_lanes, current_pose);
601610
const auto reach_target_lane =
602611
std::abs(arc_length.distance) < lane_change_parameters_->finish_judge_lateral_threshold;
603-
if (!reach_target_lane) {
604-
return false;
605-
}
606612

607-
return true;
613+
lane_change_debug_.distance_to_lane_change_finished = arc_length.distance;
614+
615+
return reach_target_lane;
608616
}
609617

610618
bool NormalLaneChange::isAbleToReturnCurrentLane() const
611619
{
612620
if (status_.lane_change_path.path.points.size() < 2) {
621+
lane_change_debug_.is_able_to_return_to_current_lane = false;
613622
return false;
614623
}
615624

616625
if (!utils::isEgoWithinOriginalLane(
617626
status_.current_lanes, getEgoPose(), planner_data_->parameters,
618627
lane_change_parameters_->cancel.overhang_tolerance)) {
628+
lane_change_debug_.is_able_to_return_to_current_lane = false;
619629
return false;
620630
}
621631

@@ -633,12 +643,15 @@ bool NormalLaneChange::isAbleToReturnCurrentLane() const
633643
dist += calcSignedArcLength(status_.lane_change_path.path.points, idx, idx + 1);
634644
if (dist > estimated_travel_dist) {
635645
const auto & estimated_pose = status_.lane_change_path.path.points.at(idx + 1).point.pose;
636-
return utils::isEgoWithinOriginalLane(
646+
auto is_ego_within_original_lane = utils::isEgoWithinOriginalLane(
637647
status_.current_lanes, estimated_pose, planner_data_->parameters,
638648
lane_change_parameters_->cancel.overhang_tolerance);
649+
lane_change_debug_.is_able_to_return_to_current_lane = is_ego_within_original_lane;
650+
return is_ego_within_original_lane;
639651
}
640652
}
641653

654+
lane_change_debug_.is_able_to_return_to_current_lane = true;
642655
return true;
643656
}
644657

@@ -679,17 +692,18 @@ bool NormalLaneChange::isAbleToStopSafely() const
679692
bool NormalLaneChange::hasFinishedAbort() const
680693
{
681694
if (!abort_path_) {
695+
lane_change_debug_.is_abort = true;
682696
return true;
683697
}
684698

685699
const auto distance_to_finish = calcSignedArcLength(
686700
abort_path_->path.points, getEgoPosition(), abort_path_->info.shift_line.end.position);
701+
lane_change_debug_.distance_to_abort_finished = distance_to_finish;
687702

688-
if (distance_to_finish < 0.0) {
689-
return true;
690-
}
703+
const auto has_finished_abort = distance_to_finish < 0.0;
704+
lane_change_debug_.is_abort = has_finished_abort;
691705

692-
return false;
706+
return has_finished_abort;
693707
}
694708

695709
bool NormalLaneChange::isAbortState() const
@@ -706,6 +720,7 @@ bool NormalLaneChange::isAbortState() const
706720
return false;
707721
}
708722

723+
lane_change_debug_.is_abort = true;
709724
return true;
710725
}
711726
int NormalLaneChange::getNumToPreferredLane(const lanelet::ConstLanelet & lane) const
@@ -860,6 +875,10 @@ LaneChangeTargetObjects NormalLaneChange::getTargetObjects(
860875
const auto target_backward_lanes = behavior_path_planner::utils::getBackwardLanelets(
861876
route_handler, target_lanes, current_pose, backward_length);
862877

878+
lane_change_debug_.current_lanes = current_lanes;
879+
lane_change_debug_.target_lanes = target_lanes;
880+
lane_change_debug_.target_backward_lanes = target_backward_lanes;
881+
863882
// filter objects to get target object index
864883
const auto target_obj_index =
865884
filterObject(objects, current_lanes, target_lanes, target_backward_lanes);
@@ -2043,6 +2062,7 @@ bool NormalLaneChange::isVehicleStuck(
20432062
bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lanes) const
20442063
{
20452064
if (current_lanes.empty()) {
2065+
lane_change_debug_.is_stuck = false;
20462066
return false; // can not check
20472067
}
20482068

@@ -2062,7 +2082,10 @@ bool NormalLaneChange::isVehicleStuck(const lanelet::ConstLanelets & current_lan
20622082
getCommonParam().base_link2front + DETECTION_DISTANCE_MARGIN;
20632083
RCLCPP_DEBUG(logger_, "max_lane_change_length: %f, max_acc: %f", max_lane_change_length, max_acc);
20642084

2065-
return isVehicleStuck(current_lanes, detection_distance);
2085+
auto is_vehicle_stuck = isVehicleStuck(current_lanes, detection_distance);
2086+
2087+
lane_change_debug_.is_stuck = is_vehicle_stuck;
2088+
return is_vehicle_stuck;
20662089
}
20672090

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