Skip to content
This repository was archived by the owner on Jul 22, 2021. It is now read-only.

Commit 308264c

Browse files
authored
Priority in Task Allocation (#278)
* Addeed priority to requests * Modified compute_f() * Removed redundant earlist_start_time from PendingTask * Added test for priority * More tests * Update valid assignments * Pruning each solution node. Fix for expand_charger() * Modified tests * Check for priority validity across agents * Check for priority validity only if a high priority task exists among requests * More tests * rmf_task::Request is no longer an abstract interface * Refactor * Commented out tests * Continued refactor * Done refactoring * Done refactoring * added Priority msg and updated FleetUpdateHandle * Move Priority and CostCalculator forward declarations into headers * Added Description to Request * Refactor after addition of Request::Description * Fixed UB in rmf_fleet_adapter::tasks * Return shared ptrs by const ref * Moved BinaryPriority BinaryPriorityCostCalculator and InvariantHueristicQueue into new headers * Allow cost calculator to be nullptr * BinaryPriority and BinaryPriorityCostCalculator do not use pimpl.Doc for make_low_priority and pure virtual destructor for Priority * Cleanup
1 parent 6725507 commit 308264c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+2636
-821
lines changed

rmf_fleet_adapter/src/rmf_fleet_adapter/TaskManager.cpp

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -176,9 +176,9 @@ void TaskManager::set_queue(
176176
start = assignments[i-1].state().location();
177177
start.time(a.deployment_time());
178178
rmf_task_msgs::msg::TaskType task_type_msg;
179-
180-
if (const auto request =
181-
std::dynamic_pointer_cast<const rmf_task::requests::Clean>(a.request()))
179+
const auto request = a.request();
180+
if (std::dynamic_pointer_cast<
181+
const rmf_task::requests::CleanDescription>(request->description()) != nullptr)
182182
{
183183
task_type_msg.type = task_type_msg.TYPE_CLEAN;
184184
auto task = rmf_fleet_adapter::tasks::make_clean(
@@ -191,9 +191,9 @@ void TaskManager::set_queue(
191191
_queue.push_back(task);
192192
}
193193

194-
else if (const auto request =
195-
std::dynamic_pointer_cast<const rmf_task::requests::ChargeBattery>(
196-
a.request()))
194+
else if (std::dynamic_pointer_cast<
195+
const rmf_task::requests::ChargeBatteryDescription>(
196+
request->description()) != nullptr)
197197
{
198198
task_type_msg.type = task_type_msg.TYPE_CHARGE_BATTERY;
199199
const auto task = tasks::make_charge_battery(
@@ -206,9 +206,9 @@ void TaskManager::set_queue(
206206
_queue.push_back(task);
207207
}
208208

209-
else if (const auto request =
210-
std::dynamic_pointer_cast<const rmf_task::requests::Delivery>(
211-
a.request()))
209+
else if (std::dynamic_pointer_cast<
210+
const rmf_task::requests::DeliveryDescription>(
211+
request->description()) != nullptr)
212212
{
213213
task_type_msg.type = task_type_msg.TYPE_DELIVERY;
214214
const auto task = tasks::make_delivery(
@@ -221,8 +221,8 @@ void TaskManager::set_queue(
221221
_queue.push_back(task);
222222
}
223223

224-
else if (const auto request =
225-
std::dynamic_pointer_cast<const rmf_task::requests::Loop>(a.request()))
224+
else if (std::dynamic_pointer_cast<
225+
const rmf_task::requests::LoopDescription>(request->description()) != nullptr)
226226
{
227227
task_type_msg.type = task_type_msg.TYPE_LOOP;
228228
const auto task = tasks::make_loop(
@@ -273,8 +273,9 @@ const std::vector<rmf_task::ConstRequestPtr> TaskManager::requests() const
273273
requests.reserve(_queue.size());
274274
for (const auto& task : _queue)
275275
{
276-
if (std::dynamic_pointer_cast<const rmf_task::requests::ChargeBattery>(
277-
task->request()))
276+
if (std::dynamic_pointer_cast<
277+
const rmf_task::requests::ChargeBatteryDescription>(
278+
task->request()->description()))
278279
continue;
279280
requests.push_back(task->request());
280281
}
@@ -461,7 +462,7 @@ void TaskManager::retreat_to_charger()
461462
task_planner_config->planner(),
462463
current_state.finish_time());
463464

464-
const auto finish = charging_request->estimate_finish(
465+
const auto finish = charging_request->description()->estimate_finish(
465466
current_state,
466467
_context->task_planning_constraints(),
467468
estimate_cache);

rmf_fleet_adapter/src/rmf_fleet_adapter/agv/FleetUpdateHandle.cpp

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@ void FleetUpdateHandle::Implementation::bid_notice_cb(
154154
std::string id = msg->task_profile.task_id;
155155
const auto& graph = planner->get_configuration().graph();
156156

157+
// Generate the priority of the request. The current implementation supports
158+
// binary priority
159+
auto priority =
160+
task_profile.description.priority.value > 0 ?
161+
rmf_task::BinaryPriorityScheme::make_high_priority() :
162+
rmf_task::BinaryPriorityScheme::make_low_priority();
163+
157164
// Process Cleaning task
158165
if (task_type.type == rmf_task_msgs::msg::TaskType::TYPE_CLEAN)
159166
{
@@ -239,7 +246,8 @@ void FleetUpdateHandle::Implementation::bid_notice_cb(
239246
tool_sink,
240247
planner,
241248
start_time,
242-
drain_battery);
249+
drain_battery,
250+
priority);
243251

244252
RCLCPP_INFO(
245253
node->get_logger(),
@@ -334,7 +342,8 @@ void FleetUpdateHandle::Implementation::bid_notice_cb(
334342
ambient_sink,
335343
planner,
336344
start_time,
337-
drain_battery);
345+
drain_battery,
346+
priority);
338347

339348
RCLCPP_INFO(
340349
node->get_logger(),
@@ -407,7 +416,8 @@ void FleetUpdateHandle::Implementation::bid_notice_cb(
407416
ambient_sink,
408417
planner,
409418
start_time,
410-
drain_battery);
419+
drain_battery,
420+
priority);
411421

412422
RCLCPP_INFO(
413423
node->get_logger(),
@@ -1111,7 +1121,8 @@ bool FleetUpdateHandle::set_task_planner_params(
11111121
*battery_system,
11121122
motion_sink,
11131123
ambient_sink,
1114-
_pimpl->planner);
1124+
_pimpl->planner,
1125+
_pimpl->cost_calculator);
11151126

11161127
_pimpl->task_planner = std::make_shared<rmf_task::agv::TaskPlanner>(
11171128
task_config);

rmf_fleet_adapter/src/rmf_fleet_adapter/agv/internal_FleetUpdateHandle.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
#include <rmf_task/agv/TaskPlanner.hpp>
2929
#include <rmf_task/Request.hpp>
3030
#include <rmf_task/requests/Clean.hpp>
31+
#include <rmf_task/BinaryPriorityScheme.hpp>
3132

3233
#include <rmf_fleet_msgs/msg/dock_summary.hpp>
3334

@@ -142,6 +143,8 @@ class FleetUpdateHandle::Implementation
142143
std::shared_ptr<rmf_battery::DevicePowerSink> ambient_sink = nullptr;
143144
std::shared_ptr<rmf_battery::DevicePowerSink> tool_sink = nullptr;
144145
bool drain_battery = true;
146+
std::shared_ptr<rmf_task::CostCalculator> cost_calculator =
147+
rmf_task::BinaryPriorityScheme::make_cost_calculator();
145148
std::shared_ptr<rmf_task::agv::TaskPlanner> task_planner = nullptr;
146149
bool initialized_task_planner = false;
147150

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/ChargeBattery.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,26 @@ namespace tasks {
2626

2727
//==============================================================================
2828
std::shared_ptr<Task> make_charge_battery(
29-
const rmf_task::requests::ConstChargeBatteryRequestPtr request,
29+
const rmf_task::ConstRequestPtr request,
3030
const agv::RobotContextPtr& context,
3131
const rmf_traffic::agv::Plan::Start start,
3232
const rmf_traffic::Time deployment_time,
3333
const rmf_task::agv::State finish_state)
3434
{
35+
std::shared_ptr<const rmf_task::requests::ChargeBatteryDescription>
36+
description = std::dynamic_pointer_cast<
37+
const rmf_task::requests::ChargeBatteryDescription>(request->description());
38+
39+
if (description == nullptr)
40+
return nullptr;
41+
3542
rmf_traffic::agv::Planner::Goal goal{finish_state.charging_waypoint()};
3643

3744
Task::PendingPhases phases;
3845
phases.push_back(
3946
phases::GoToPlace::make(context, std::move(start), goal));
4047
phases.push_back(
41-
phases::WaitForCharge::make(context, request->battery_system(), 0.99));
48+
phases::WaitForCharge::make(context, description->battery_system(), 0.99));
4249

4350
return Task::make(
4451
request->id(),

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/ChargeBattery.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace tasks {
3232

3333
//==============================================================================
3434
std::shared_ptr<Task> make_charge_battery(
35-
const rmf_task::requests::ConstChargeBatteryRequestPtr request,
35+
const rmf_task::ConstRequestPtr request,
3636
const agv::RobotContextPtr& context,
3737
const rmf_traffic::agv::Plan::Start start,
3838
const rmf_traffic::Time deployment_time,

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/Clean.cpp

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,22 @@ namespace tasks {
2424

2525
//==============================================================================
2626
std::shared_ptr<Task> make_clean(
27-
const rmf_task::requests::ConstCleanRequestPtr request,
27+
const rmf_task::ConstRequestPtr request,
2828
const agv::RobotContextPtr& context,
2929
const rmf_traffic::agv::Plan::Start clean_start,
3030
const rmf_traffic::Time deployment_time,
3131
const rmf_task::agv::State finish_state)
3232
{
33-
rmf_traffic::agv::Planner::Goal clean_goal{request->start_waypoint()};
34-
auto end_start = request->location_after_clean(clean_start);
35-
rmf_traffic::agv::Planner::Goal end_goal{request->end_waypoint()};
33+
std::shared_ptr<const rmf_task::requests::CleanDescription> description =
34+
std::dynamic_pointer_cast<
35+
const rmf_task::requests::CleanDescription>(request->description());
36+
37+
if (description == nullptr)
38+
return nullptr;
39+
40+
rmf_traffic::agv::Planner::Goal clean_goal{description->start_waypoint()};
41+
auto end_start = description->location_after_clean(clean_start);
42+
rmf_traffic::agv::Planner::Goal end_goal{description->end_waypoint()};
3643
Task::PendingPhases phases;
3744
phases.push_back(
3845
phases::GoToPlace::make(context, std::move(clean_start), clean_goal));

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/Clean.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ namespace tasks {
3232

3333
//==============================================================================
3434
std::shared_ptr<Task> make_clean(
35-
const rmf_task::requests::ConstCleanRequestPtr request,
35+
const rmf_task::ConstRequestPtr request,
3636
const agv::RobotContextPtr& context,
3737
const rmf_traffic::agv::Plan::Start clean_start,
3838
const rmf_traffic::Time deployment_time,

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/Delivery.cpp

Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -28,34 +28,45 @@ namespace tasks {
2828

2929
//==============================================================================
3030
std::shared_ptr<Task> make_delivery(
31-
const rmf_task::requests::ConstDeliveryRequestPtr request,
31+
const rmf_task::ConstRequestPtr request,
3232
const agv::RobotContextPtr& context,
3333
const rmf_traffic::agv::Plan::Start pickup_start,
3434
const rmf_traffic::Time deployment_time,
3535
const rmf_task::agv::State finish_state)
3636
{
37+
38+
std::shared_ptr<const rmf_task::requests::DeliveryDescription> description =
39+
std::dynamic_pointer_cast<
40+
const rmf_task::requests::DeliveryDescription>(request->description());
41+
42+
if (description == nullptr)
43+
return nullptr;
44+
3745
Task::PendingPhases phases;
3846
phases.push_back(
3947
phases::GoToPlace::make(
40-
context, std::move(pickup_start), request->pickup_waypoint()));
48+
context, std::move(pickup_start),
49+
description->pickup_waypoint()));
4150

4251
phases.push_back(
4352
std::make_unique<phases::DispenseItem::PendingPhase>(
4453
context,
4554
request->id(),
46-
request->pickup_dispenser(),
55+
description->pickup_dispenser(),
4756
context->itinerary().description().owner(),
48-
request->items()));
57+
description->items()));
4958

50-
auto dropoff_start = request->dropoff_start(pickup_start);
59+
auto dropoff_start = description->dropoff_start(pickup_start);
5160
phases.push_back(
5261
phases::GoToPlace::make(
53-
context, std::move(dropoff_start), request->dropoff_waypoint()));
62+
context,
63+
std::move(dropoff_start),
64+
description->dropoff_waypoint()));
5465

5566

5667
std::vector<rmf_ingestor_msgs::msg::IngestorRequestItem> ingestor_items;
57-
ingestor_items.reserve(request->items().size());
58-
for(const auto& dispenser_item : request->items()){
68+
ingestor_items.reserve(description->items().size());
69+
for(const auto& dispenser_item : description->items()){
5970
rmf_ingestor_msgs::msg::IngestorRequestItem item{};
6071
item.type_guid = dispenser_item.type_guid;
6172
item.quantity = dispenser_item.quantity;
@@ -67,7 +78,7 @@ std::shared_ptr<Task> make_delivery(
6778
std::make_unique<phases::IngestItem::PendingPhase>(
6879
context,
6980
request->id(),
70-
request->dropoff_ingestor(),
81+
description->dropoff_ingestor(),
7182
context->itinerary().description().owner(),
7283
ingestor_items));
7384

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/Delivery.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ namespace tasks {
2828

2929
//==============================================================================
3030
std::shared_ptr<Task> make_delivery(
31-
const rmf_task::requests::ConstDeliveryRequestPtr request,
31+
const rmf_task::ConstRequestPtr request,
3232
const agv::RobotContextPtr& context,
3333
const rmf_traffic::agv::Plan::Start pickup_start,
3434
const rmf_traffic::Time deployment_time,

rmf_fleet_adapter/src/rmf_fleet_adapter/tasks/Loop.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,34 +24,40 @@ namespace tasks {
2424

2525
//==============================================================================
2626
std::shared_ptr<Task> make_loop(
27-
const rmf_task::requests::ConstLoopRequestPtr request,
27+
const rmf_task::ConstRequestPtr request,
2828
const agv::RobotContextPtr& context,
2929
const rmf_traffic::agv::Plan::Start start,
3030
const rmf_traffic::Time deployment_time,
3131
const rmf_task::agv::State finish_state)
3232
{
33+
std::shared_ptr<const rmf_task::requests::LoopDescription> description =
34+
std::dynamic_pointer_cast<
35+
const rmf_task::requests::LoopDescription>(request->description());
36+
37+
if (description == nullptr)
38+
return nullptr;
3339

3440
Task::PendingPhases phases;
35-
const auto loop_start = request->loop_start(start);
36-
const auto loop_end = request->loop_end(loop_start);
41+
const auto loop_start = description->loop_start(start);
42+
const auto loop_end = description->loop_end(loop_start);
3743

3844
phases.push_back(
3945
phases::GoToPlace::make(
40-
context, std::move(start), request->start_waypoint()));
46+
context, std::move(start), description->start_waypoint()));
4147

4248
phases.push_back(
4349
phases::GoToPlace::make(
44-
context, loop_start, request->finish_waypoint()));
50+
context, loop_start, description->finish_waypoint()));
4551

46-
for (std::size_t i = 1; i < request->num_loops(); ++i)
52+
for (std::size_t i = 1; i < description->num_loops(); ++i)
4753
{
4854
phases.push_back(
4955
phases::GoToPlace::make(
50-
context, loop_end, request->start_waypoint()));
56+
context, loop_end, description->start_waypoint()));
5157

5258
phases.push_back(
5359
phases::GoToPlace::make(
54-
context, loop_start, request->finish_waypoint()));
60+
context, loop_start, description->finish_waypoint()));
5561
}
5662

5763
return Task::make(

0 commit comments

Comments
 (0)