DLu / navigation_layers

155 stars 136 forks source link

Program dies when use_pixel is used #78

Open abylikhsanov opened 3 years ago

abylikhsanov commented 3 years ago

I think this is where the problem lies: https://github.com/DLu/navigation_layers/blob/8899b6e9504165469468cc966f9030305ed5d827/range_sensor_layer/src/range_sensor_layer.cpp#L403

@DLu

abylikhsanov commented 3 years ago

Actually, the program dies when does this line: https://github.com/DLu/navigation_layers/blob/8899b6e9504165469468cc966f9030305ed5d827/range_sensor_layer/src/range_sensor_layer.cpp#L376

abylikhsanov commented 3 years ago

Well it is obvious I think, the market_point_history is being cleared before accessing

jhbirdchoi commented 3 years ago

Hi...same issue~

jhbirdchoi commented 3 years ago

Hi

I think this is a problem caused by referring to marked_pointhistory in several places.

if (use_decay_)
{
  std::pair<unsigned int, unsigned int> coordinate_pair(x, y);
  // If the point has a score high enough to be marked in the costmap, we add it's time to the marked_point_history
  if (c > to_cost(mark_threshold_)) {
    marked_point_history_[coordinate_pair] = last_reading_time_.toSec();

ROS_INFO("CHECK::update_cell is called x = %d y = %d\n", x, y); // If the point score is not high enough, we try to find it in the mark history point. // In the case we find it in the marked_point_history // we clear it from the map so we won't checked already cleared point } else if (c < to_cost(clearthreshold)) { ROS_INFO("CHECK::update_cell is called CLEAR x = %d y = %d\n", x, y); // If the point score is not high enough, we try to find it in the mark history point. std::map<std::pair<unsigned int, unsigned int>, double>::iterator it_clear; it_clear = marked_pointhistory.find(coordinate_pair); if (it_clear != marked_pointhistory.end()) marked_pointhistory.erase(it_clear); } }

void RangeSensorLayer::removeOutdatedReadings() { std::map<std::pair<unsigned int, unsigned int>, double>::iterator it_map;

ROS_INFO("CHECK::removeOutdaredReadings\n"); double removal_time = last_readingtime.toSec() - pixeldecay; for (it_map = marked_pointhistory.begin() ; it_map != marked_pointhistory.end() && marked_pointhistory.size() != 0 ; it_map++ ) { if (it_map->second < removal_time) { ROS_INFO("CHECK::removeOutdaredReading size = %d\n", (unsigned int)marked_pointhistory.size()); setCost(std::get<0>(it_map->first), std::get<1>(it_map->first), costmap_2d::FREE_SPACE); ROS_INFO("CHECK::removeOutdaredReadings2 = %d - %d\n", std::get<0>(it_map->first), std::get<1>(it_map->first)); marked_pointhistory.erase(it_map); ROS_INFO("CHECK::removeOutdaredReadings ERASED\n"); } } ROS_INFO("CHECK::removeOutdaredReadings _END\n"); }

After the marked_point_histor is removed by clear_threshold, it is also referred to by pixel_decay.

The simplest way is to use a lock. I will update after testing.

thanks.