autowarefoundation / autoware.universe

https://autowarefoundation.github.io/autoware.universe/
Apache License 2.0
893 stars 582 forks source link

behavior path planner dies in endless `getLeftMostLineString` recursion #5632

Closed VRichardJP closed 2 months ago

VRichardJP commented 8 months ago

Checklist

Description

Sorry for the lack of information (yet)

I have caught this crash of the behavior path planner container with gdb:

(lost upper trace)
#4 lanelet::routing::RoutingGraph::previous()
#5 route_handler::RouteHandler::getPreviousLaneletsWithinRoute()
#6 route_handler::RouteHandler::getLeftLanelet()
#7 route_handler::RouteHandler::getLeftMostLineString()
#8 route_handler::RouteHandler::getLeftMostLineString()
#9 route_handler::RouteHandler::getLeftMostLineString()
#10 route_handler::RouteHandler::getLeftMostLineString()
...
#40 route_handler::RouteHandler::getLeftMostLineString()
...and so on

My map is just a big circular loop, with sometimes multiple lanes and some cross walks (nothing fancy).

It might be the same crash as in https://github.com/autowarefoundation/autoware.universe/issues/5631

I will update when I have more information.

Expected behavior

Never crash

Actual behavior

crash

Steps to reproduce

Stay tuned

Versions

No response

Possible causes

No response

Additional context

No response

VRichardJP commented 7 months ago

I got the same crash today after setting a new goal point. The route handler died after 52000 recursions

I was too clumsy to find the root cause with gdb this time, but from the backtrace and the code, I can think of 2 cases:

https://github.com/autowarefoundation/autoware.universe/blob/b65bfe03b241001c5476003d722b43b1c995ac4f/planning/route_handler/src/route_handler.cpp#L1329-L1341

I am surprised how seldom this bug is (3rd time I see it over 2 weeks). So I guess it might be related to the start/goal point. The lanelet map is just a big one way loop, with sometimes multiple lanes, sometimes a road shoulder on the left, and a few crosswalk. I don't see how such recursion could happen.

In any case, I don't think it is sane to keep unbounded recursion like this one in the code. Most roads are only a few lanelets wide, so it would not be very costy to keep a list of all explored lanelets and stop if a loop is detected.

VRichardJP commented 7 months ago

What I managed to scrape:

#52263 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52264 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52265 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52266 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52267 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52268 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52269 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52270 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52271 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52272 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52273 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52274 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=0x55555564ef70, lanelet=..., enable_same_root=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52275 0x00007fffec7dcb69 in route_handler::RouteHandler::getLeftMostLinestring (this=this@entry=0x55555564ef70, lanelet=..., enable_same_root=enable_same_root@entry=true) at /usr/include/boost/optional/detail/optional_aligned_storage.hpp:48
#52276 0x00007fffec7dd117 in route_handler::RouteHandler::getFurthestLinestring (this=0x55555564ef70, lanelet=..., is_right=<optimized out>, is_left=<optimized out>, is_opposite=<optimized out>, enable_same_root=true) at /home/computer/autoware/src/universe/autoware.universe/planning/route_handler/src/route_handler.cpp:1366
#52277 0x00007fffc5c1b672 in operator()<lanelet::ConstLanelet> (__closure=0x7fffc9fee9a0, target_lanelet=...) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/utils/avoidance/utils.cpp:1029
#52278 0x00007fffc5c1fe07 in behavior_path_planner::utils::avoidance::filterTargetObjects (objects=std::vector of length 4, capacity 4 = {...}, data=..., debug=..., planner_data=std::shared_ptr<const behavior_path_planner::PlannerData> (use count 16, weak count 0) = {...}, parameters=std::shared_ptr<behavior_path_planner::AvoidanceParameters> (use count 4, weak count 0) = {...}) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/utils/avoidance/utils.cpp:1040
#52279 0x00007fffc5b318b4 in behavior_path_planner::AvoidanceByLaneChange::fillAvoidanceTargetObjects (this=0x7fff981820e0, data=..., debug=...) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/scene_module/lane_change/avoidance_by_lane_change.cpp:179
#52280 0x00007fffc5b31d1a in behavior_path_planner::AvoidanceByLaneChange::calcAvoidancePlanningData (this=0x7fff981820e0, debug=...) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/scene_module/lane_change/avoidance_by_lane_change.cpp:133
#52281 0x00007fffc5b31e60 in behavior_path_planner::AvoidanceByLaneChange::updateSpecialData (this=0x7fff981820e0) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/scene_module/lane_change/avoidance_by_lane_change.cpp:97
#52282 0x00007fffc5afd894 in behavior_path_planner::LaneChangeInterface::updateData (this=0x7fff98176850) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/scene_module/lane_change/interface.cpp:192
#52283 0x00007fffc596d3f2 in behavior_path_planner::SceneModuleManagerInterface::isExecutionRequested (this=0x5555558a2820, previous_module_output=...) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/include/behavior_path_planner/scene_module/scene_module_manager_interface.hpp:92
#52284 0x00007fffc595638a in behavior_path_planner::PlannerManager::getRequestModules (this=0x5555557c4a80, previous_module_output=...) at /usr/include/c++/11/bits/shared_ptr_base.h:1295
#52285 0x00007fffc595e25b in operator() (__closure=0x7fffc9ff18e0) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/planner_manager.cpp:95
#52286 0x00007fffc595efc8 in behavior_path_planner::PlannerManager::run (this=this@entry=0x5555557c4a80, data=std::shared_ptr<behavior_path_planner::PlannerData> (use count 16, weak count 0) = {...}) at /home/computer/autoware/src/universe/autoware.universe/planning/behavior_path_planner/src/planner_manager.cpp:55
    #52287 0x00007fffc599530e in behavior_path_planner::BehaviorPathPlannerNode::run   void (behavior_path_planner::BehaviorPathPlannerNode::*&)(), behavior_path_planner::BehaviorPathPlannerNode*&> (__fn=@0x5555558d4dc0: (void (behavior_path_planner::BehaviorPathPlannerNode::*)(behavior_path_planner::BehaviorPathPlannerNode * const)) 0x7fffc5994ee0 <behavior_path_planner::BehaviorPathPlannerNode::run()>) at /usr/include/c++/11/bits/invoke.h:96
#52290 std::_Bind<void (behavior_path_planner::BehaviorPathPlannerNode::*(behavior_path_planner::BehaviorPathPlannerNode*))()>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) (__args=..., this=0x5555558d4dc0) at /usr/include/c++/11/functional:420
#52291 std::_Bind<void (behavior_path_planner::BehaviorPathPlannerNode::*(behavior_path_planner::BehaviorPathPlannerNode*))()>::operator()<, void>() (this=0x5555558d4dc0) at /usr/include/c++/11/functional:503
#52292 rclcpp::GenericTimer<std::_Bind<void (behavior_path_planner::BehaviorPathPlannerNode::*(behavior_path_planner::BehaviorPathPlannerNode*))()>, (void*)0>::execute_callback_delegate<std::_Bind<void (behavior_path_planner::BehaviorPathPlannerNode::*(behavior_path_planner::BehaviorPathPlannerNode*))()>, (void*)0>() (this=0x5555558d4d90) at /opt/ros/humble/include/rclcpp/rclcpp/timer.hpp:244
#52293 rclcpp::GenericTimer<std::_Bind<void (behavior_path_planner::BehaviorPathPlannerNode::*(behavior_path_planner::BehaviorPathPlannerNode*))()>, (void*)0>::execute_callback() (this=0x5555558d4d90) at /opt/ros/humble/include/rclcpp/rclcpp/timer.hpp:230
#52294 0x00007ffff7d63472 in rclcpp::Executor::execute_any_executable (this=this@entry=0x5555555cfef0, any_exec=...) at /home/computer/autoware/src/rclcpp/rclcpp/src/rclcpp/executor.cpp:518
#52295 0x00007ffff7d695ea in rclcpp::executors::MultiThreadedExecutor::run (this=0x5555555cfef0, this_thread_number=<optimized out>) at /home/computer/autoware/src/rclcpp/rclcpp/src/rclcpp/executors/multi_threaded_executor.cpp:93
#52296 0x00007ffff78dc253 in ?? () from /lib/x86_64-linux-gnu/libstdc++.so.6
#52297 0x00007ffff7494ac3 in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
#52298 0x00007ffff7526a40 in clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:81
(gdb) 

/home/computer/autoware/src/universe/autoware.universe/planning/route_handler/src/route_handler.cpp:1366

(gdb) p *lanelet.constData_
$6 = {<lanelet::PrimitiveData> = {id = 1064, attributes = {m_ = std::map with 5 elements = {["location"] = {value_ = "urban", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}, ["one_way"] = {value_ = "yes", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (use count 1, weak count 0) = {get() = 0x7fff6801cf50}}, ["speed_limit"] = {value_ = "20", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}, ["subtype"] = {value_ = "road", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}, ["type"] = {value_ = "lanelet", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}}, v_ = std::vector of length 7, capacity 7 = {{first = "type", second = {value_ = "lanelet", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}}, {first = "subtype", second = {value_ = "road", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}}, {first = "one_way", second = {value_ = "yes", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (use count 1, weak count 0) = {get() = 0x7fff6801cf50}}}, {first = <error: Cannot access memory at address 0x5>, second = {value_ = "\232\002\000\000\000\000\000\000\000P\313?\000\000\200?\000\000\000\000\000 \326A\000\070\032h\377\177\000\000\000\070\032h\377\177\000\000\200\070\032h\377\177\000\000\002\000\000\000\000\000\000\000\000\071\032h\377\177\000\000\020\071\032h\377\177\000\000\020\071\032h\377\177\000\000\220\067\032h\377\177\000\000\360\067\032h\377\177\000\000\360\067\032h\377\177\000\000%\000\000\000\000\000\000\000\260v\026\354\377\177\000\000\020\000\000\000\001\000\000\000\220\066\032h\377\177\000\000u\000\000\000\000\000\000\000\256\002", '\000' <repeats 18 times>, "\377\177\000\000\020:\032h\377\177\000\000\020:\032h\377\177\000\000\220:\032h\377\177\000\000\002\000\000\000\000\000\000\000"..., cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x7fff681946a0}}}, {first = <error: Cannot access memory at address 0x5>, second = {value_ = "\232\002\000\000\000\000\000\000\000P\313?\000\000\200?\000\000\000\000\000 \326A\000\070\032h\377\177\000\000\000\070\032h\377\177\000\000\200\070\032h\377\177\000\000\002\000\000\000\000\000\000\000\000\071\032h\377\177\000\000\020\071\032h\377\177\000\000\020\071\032h\377\177\000\000\220\067\032h\377\177\000\000\360\067\032h\377\177\000\000\360\067\032h\377\177\000\000%\000\000\000\000\000\000\000\260v\026\354\377\177\000\000\020\000\000\000\001\000\000\000\220\066\032h\377\177\000\000u\000\000\000\000\000\000\000\256\002", '\000' <repeats 18 times>, "\377\177\000\000\020:\032h\377\177\000\000\020:\032h\377\177\000\000\220:\032h\377\177\000\000\002\000\000\000\000\000\000\000"..., cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x7fff681946a0}}}, {first = "speed_limit", second = {value_ = "20", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}}, {first = "location", second = {value_ = "urban", cache_ = std::shared_ptr<boost::variant<bool, double, long, int, boost::units::quantity<boost::units::unit<boost::units::list<boost::units::dim<boost::units::length_base_dimension, boost::units::static_rational<1, 1> >, boost::units::list<boost::units::dim<boost::units::time_base_dimension, boost::units::static_rational<-1, 1> >, boost::units::dimensionless_type> >, boost::units::homogeneous_system<boost::units::list<boost::units::si::meter_base_unit, boost::units::list<boost::units::scaled_base_unit<boost::units::cgs::gram_base_unit, boost::units::scale<10, boost::units::static_rational<3, 1> > >, boost::units::list<boost::units::si::second_base_unit, boost::units::list<boost::units::si::ampere_base_unit, boost::units::list<boost::units::si::kelvin_base_unit, boost::units::list<boost::units::si::mole_base_unit, boost::units::list<boost::units::si::candela_base_unit, boost::units::list<boost::units::angle::radian_base_unit, boost::units::list<boost::units::angle::steradian_base_unit, boost::units::dimensionless_type> > > > > > > > > >, void>, double> >> (empty) = {get() = 0x0}}}}}}, leftBound_ = {<lanelet::LineStringImpl<lanelet::ConstLineString3d>> = {<lanelet::Primitive<lanelet::ConstLineString3d>> = {<lanelet::ConstLineString3d> = {<lanelet::ConstLineStringImpl<lanelet::Point3d>> = {<lanelet::ConstPrimitive<lanelet::LineStringData>> = {constData_ = std::shared_ptr<const lanelet::LineStringData> (use count 16, weak count 0) = {get() = 0x7fff681a3690}}, inverted_ = false}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, rightBound_ = {<lanelet::LineStringImpl<lanelet::ConstLineString3d>> = {<lanelet::Primitive<lanelet::ConstLineString3d>> = {<lanelet::ConstLineString3d> = {<lanelet::ConstLineStringImpl<lanelet::Point3d>> = {<lanelet::ConstPrimitive<lanelet::LineStringData>> = {constData_ = std::shared_ptr<const lanelet::LineStringData> (use count 14, weak count 0) = {get() = 0x7fff68194630}}, inverted_ = false}, <No data fields>}, <No data fields>}, <No data fields>}, <No data fields>}, regulatoryElements_ = std::vector of length 0, capacity 0, centerline_ = std::shared_ptr<lanelet::ConstLineString3d> (use count 1, weak count 0) = {get() = 0x7fff68257130}}
(gdb) 
stale[bot] commented 5 months ago

This pull request has been automatically marked as stale because it has not had recent activity.

kyoichi-sugahara commented 4 months ago

@VRichardJP Sorry for the late reply as well, and thank you for reporting the bug! I've looked into the code a bit on my end but couldn't reach the direct cause of the recursion, sorry about that. As a temporary measure to prevent the bug from occurring, as you mentioned, keeping a list of all explored lanelets and stopping if a loop is detected seems like a good idea to me too. However, despite being assigned, I apologize for not having the time to address this issue. Could you possibly handle it on your side?

However, I'm still curious about the conditions under which the recursion occurs and which part of the process is causing the issue. So, how about providing information that could help reproduce the problem and adding a "help-wanted" tag?

VRichardJP commented 4 months ago

@kyoichi-sugahara Unfortunately, I don't remember the exact setup nor the map. However, I think the problem only occur with AvoidanceByLaneChange (which appear in the backtrace). I don't have access to the vehicle anymore, but the module has been disabled for a long time and the crash has never happened again.

I usually don't enable this kind of advanced module (because too risky), except from time to time during the vehicle integration to test a bit. So it is possible the crash has only ever happened with that module (normal lane change has never been an issue).

I have no use for AvoidanceByLaneChange in other projects at the moment so I can't allocate much time to debug this either.

mkquda commented 2 months ago

The function in which the endless recursion occurred is no longer used anywhere in the latest version and has been removed along with other obsolete functions in a recent PR. so this issue can be closed.

kyoichi-sugahara commented 2 months ago

@mkquda Thank you so much for your report and contribution. Could you paste the link of related PR in this page?

mkquda commented 1 month ago

https://github.com/autowarefoundation/autoware.universe/pull/7012