Obstacles that don't hold still
Static obstacles, walls, shelves, parked equipment, are the easy case for local avoidance, since their position in the occupancy grid stays valid for as long as the robot can see them. Dynamic obstacles, other robots, people walking through the space, carts being pushed, are harder, because avoidance has to account for where the obstacle will be by the time the robot gets near it, not just where it currently is. A person walking briskly across the robot's path who is avoided based only on their current position may still end up in a collision course, since both the robot and the person keep moving after that snapshot was taken.
In fleets of warehouse autonomous mobile robots working alongside each other and human workers, this problem compounds, since every other robot is itself a dynamic obstacle that may also be reacting to the first robot's movements at the same time. Practical systems handle this by tracking a short history of each detected obstacle's recent positions to estimate its velocity and rough heading, then factoring that predicted near-future position into the avoidance decision, rather than treating every obstacle as frozen in place.
