-
HI, rmf release: iron 20231229 I can't provide any more detail at this moment, but we encountered a few issues in interactions with lift with multiple robots:
[WardRobot_FlAdpt]: Planning for [WardRobot/WardRobot_101] to [CART_W56_01] from one of these locations:
[WardRobot_FlAdpt]: Ensuring door [door_08_58_01] is open for [WardRobot/WardRobot_101] after a replan
[WardRobot_FlAdpt]: Executing go_to_place [CART_W56_01] for robot [WardRobot/WardRobot_101]
[WardRobot_FlAdpt]: Opening door [door_08_58_01] for [WardRobot/WardRobot_101]
[WardRobot_FlAdpt]: Robot [WardRobot/WardRobot_101] will release door [door_08_58_01] after a replan because it is no longer needed.
|
Beta Was this translation helpful? Give feedback.
Replies: 3 comments 8 replies
-
Behaviors around lifts are extremely complex, so I can't say with any certainty what caused this, but the overarching cause is almost certainly that RMF believed that the robot was still inside the lift. Here are some possible reasons for this:
I recommend using mutex groups to create a queuing system for the lift as described here. You should try to have as many queuing points as the number of robots that you expect will be trying to get into the lift from one floor at any given moment.
I haven't seen this happen before so I don't have an explanation to offer here. I would need you to elaborate on the exact circumstances around this.
Yes, right now the lift utilization is not very intelligent so it's first-come-first-serve based on lift request times. If this is a problem for your deployment, then you can write a custom lift supervisor node that assigns the lift based on the current floor of the lift and which floor the requests are coming from. We have plans to provide an intelligent reservation system for lift usage out of the box, but it's low priority at the moment as we try to focus on developing more critical improvements.
This is technically possible with the current negotiation system. Usually this will happen when the nav graph around a lift lobby gets too crowded with robots and the traffic flow is too loose. For sensitive areas like lift lobbies, I recommend making very conscious use of traffic flow controls like mutex groups and unidirectional lanes. If you can share a rough sketch of your traffic lane setup around the lift lobbies, I'm happy to give feedback on it.
I understand what caused this, but it's a very very tricky edge case to deal with. I intentionally programmed RMF to not release the lift following a replan if the new plan will still involve the robot taking the lift. The rationale is that in most situations where this happens, the robot may need to move to a certain waypoint to reposition itself to re-attempt entering the lift. We do not want the robot to release the lift while it repositions itself because that would allow another robot to snatch the lift away, creating more delays or possibly even new traffic conflicts. It's very difficult for RMF to infer what exact situations it should hold versus release the lift when an entry attempt fails. I can make two recommendations for you to consider:
|
Beta Was this translation helpful? Give feedback.
-
Hi @mxgrey ,
[WardRobot_FlAdpt]: Planning for [WardRobot/WardRobot_101] to [CART_W56_01] from one of these locations:
[WardRobot_FlAdpt]: Ensuring door [door_08_58_01] is open for [WardRobot/WardRobot_101] after a replan
[WardRobot_FlAdpt]: Executing go_to_place [CART_W56_01] for robot [WardRobot/WardRobot_101]
[WardRobot_FlAdpt]: Opening door [door_08_58_01] for [WardRobot/WardRobot_101]
[WardRobot_FlAdpt]: Robot [WardRobot/WardRobot_101] will release door [door_08_58_01] after a replan because it is no longer neede is my understading correct that the following code snippet did not check if the door is on the robot current map, and if the plan will mistakenly include for (const auto& door : graph.all_known_doors())
{
if (door->intersects(p0, p1, envelope))
{
RCLCPP_INFO(
context->node()->get_logger(),
"Ensuring door [%s] is open for [%s] after a replan",
door->name().c_str(),
context->requester_id().c_str());
legacy_phases.emplace_back(
std::make_shared<phases::DoorOpen::PendingPhase>(
context, door->name(), context->requester_id(), t0),
t0, rmf_traffic::Dependencies(), std::nullopt);
}
} |
Beta Was this translation helpful? Give feedback.
-
For issue that robot enter lift when the lift is not in AGV mode, should this code also check if the lift is already in AGV mode? LegacyTask::StatusMsg RequestLift::ActivePhase::_get_status(
const rmf_lift_msgs::msg::LiftState::SharedPtr& lift_state)
{
using rmf_lift_msgs::msg::LiftState;
using rmf_lift_msgs::msg::LiftRequest;
LegacyTask::StatusMsg status{};
status.state = LegacyTask::StatusMsg::STATE_ACTIVE;
if (!_rewaiting &&
lift_state->lift_name == _lift_name &&
lift_state->current_floor == _destination &&
lift_state->door_state == LiftState::DOOR_OPEN &&
lift_state->current_mode == LiftState::MODE_AGV && //check if the lift is AGV mode
lift_state->session_id == _context->requester_id())
{
RCLCPP_INFO(
_context->node()->get_logger(),
"Lift has arrived on floor [%s] and opened its doors for robot [%s]",
lift_state->current_floor.c_str(),
lift_state->session_id.c_str());
...
|
Beta Was this translation helpful? Give feedback.
If you've manually released the lift then RMF won't relock the lift until it begins a new attempt to have the robot enter or exit the lift. By not calling
replan
ordocking_finished_callback
you're just leaving RMF in a hung state that it will never be able to make progress from.My strongest suspicion right now is that the last position update that you gave before calling
replan
indicated that the robot is either inside the lift or somewhere on the lane that comes out of the lift, which prompts RMF to lock the lift for the robot at the very start of th…