There may be "tasks" that need to run indefinitely or permanently. For example, a patrolling task or a continuous delivery task (where we expect a new delivery to always be ready to go as soon as the previous delivery is finished).
In these cases, it's best to assign the continuous task to one robot, and then exclude the robot from being assigned any further tasks until the indefinite task is canceled or terminates some other way. (Note that we'll assume these indefinite tasks will be responsible for having battery recharging phases)
For the planner, we could indicate that a task is indefinite by changing Estimate::finish_state to return a std::optional<State> where a std::nullopt value means that it will run indefinitely (as opposed to Task::Model::estimate_finish where returning std::nullopt means that the task cannot be performed).
When a branch in the planner assigns an indefinite task to a robot, that branch cannot assign any more tasks to that robot.
There may be "tasks" that need to run indefinitely or permanently. For example, a patrolling task or a continuous delivery task (where we expect a new delivery to always be ready to go as soon as the previous delivery is finished).
In these cases, it's best to assign the continuous task to one robot, and then exclude the robot from being assigned any further tasks until the indefinite task is canceled or terminates some other way. (Note that we'll assume these indefinite tasks will be responsible for having battery recharging phases)
For the planner, we could indicate that a task is indefinite by changing
Estimate::finish_stateto return astd::optional<State>where astd::nulloptvalue means that it will run indefinitely (as opposed toTask::Model::estimate_finishwhere returningstd::nulloptmeans that the task cannot be performed).When a branch in the planner assigns an indefinite task to a robot, that branch cannot assign any more tasks to that robot.