44 for(uint32_t i = 0; i <
threads_; i++)
56 std::vector<uint32_t> robotRadius(_nr_robots, 0);
60 for(uint32_t i = 0; i <
threads_; i++)
119 bool MultiRobotRouterThreadedSrr::getRoutingTable(
const std::vector<Segment> &_graph,
const std::vector<uint32_t> &_startSegments,
const std::vector<uint32_t> &_goalSegments, std::vector<std::vector< Checkpoint>> &routingTable,
const float &_timeLimit)
121 std::chrono::time_point<std::chrono::high_resolution_clock> tstart = std::chrono::high_resolution_clock::now();
135 std::vector<std::vector<RouteVertex>> routeCandidates;
140 uint32_t firstSchedule = 0;
142 uint32_t lastPlannedRobot;
147 int32_t firstRobot = -1;
155 for(uint32_t i = 0; i < priorityList.size(); i++)
157 if(priorityList[i] == firstRobot)
162 found =
planPaths(priorityList, speedList, _startSegments, _goalSegments, firstSchedule, routeCandidates, lastPlannedRobot);
165 std::chrono::time_point<std::chrono::high_resolution_clock> tgoal = std::chrono::high_resolution_clock::now();
166 duration = std::chrono::duration_cast<std::chrono::milliseconds>(tgoal - tstart).count();
181 bool MultiRobotRouterThreadedSrr::planPaths(
const std::vector<uint32_t> &_priorityList,
const std::vector<float> &_speedList,
const std::vector<uint32_t> &_startSegments,
const std::vector<uint32_t> &_goalSegments,
const uint32_t _firstSchedule, std::vector<std::vector<RouteVertex>> &_routeCandidates, uint32_t &_lastRobot)
184 for(uint32_t i = _firstSchedule; i <
nr_robots_; i++)
186 uint32_t robot = _priorityList[i];
191 uint32_t plannedRobots = _firstSchedule;
193 while(plannedRobots < nr_robots_)
195 uint32_t maxCount = std::min(plannedRobots +
threads_, nr_robots_);
196 uint32_t startCount = plannedRobots;
197 int32_t currentFailedI = -1;
201 std::vector<std::thread>
s;
202 s.resize(maxCount - startCount);
204 std::vector<RouteCoordinatorWrapper> rcWrappers;
205 for(
int i = startCount; i < maxCount; i++)
207 uint32_t robot = _priorityList[i];
209 rcWrappers.push_back(rcW);
212 for(
int i = startCount; i < maxCount; i++)
214 uint32_t robot = _priorityList[i];
215 uint32_t start = _startSegments[robot];
216 uint32_t goal = _goalSegments[robot];
218 float speed = _speedList[robot];
219 std::vector<RouteVertex> &routeCandidate = _routeCandidates[robot];
221 uint32_t index = i - startCount;
224 s[index] = std::thread(
225 [wr, robot, start, goal, diameter, speed, &routeCandidate, iter, &sr]()
239 for(std::thread & t : s)
245 for(uint32_t i = startCount; i < maxCount; i++)
247 uint32_t robot = _priorityList[i];
248 uint32_t planner = i - startCount;
254 if(!
srr[planner].getLastResult())
void reset(const uint32_t _nrRobots)
resets the Priority schedule with an initial priority schedule
MultiRobotRouterThreadedSrr(const uint32_t _nr_robots, const std::vector< uint32_t > &_robotDiameter, const uint32_t _threads)
constructor
standard multi robot router without multi threading (Works best in practice)
virtual void removeRobot(const uint32_t _robot)=0
removes a Robot from the Routing Table
bool planPaths(const std::vector< uint32_t > &_priorityList, const std::vector< float > &_speedList, const std::vector< uint32_t > &_startSegments, const std::vector< uint32_t > &_goalSegments, const uint32_t _firstSchedule, std::vector< std::vector< RouteVertex >> &_routeCandidates, uint32_t &_robot)
RouteCoordinator * route_coordinator_
bool getRouteCandidate(const uint32_t _start, const uint32_t _goal, const RouteCoordinatorWrapper &path_coordinator, const uint32_t _robotDiameter, const float &_robotSpeed, std::vector< RouteVertex > &path, const uint32_t _maxIterations)
calculates a route candidate coordinated with other robots by the given route Coordinated ...
virtual bool setGoalSegments(const std::vector< uint32_t > &_goalSegments)=0
updates the goal segments of the planning attempt
virtual bool addRoute(const std::vector< RouteVertex > &_path, const uint32_t _diameterPixel, const uint32_t _robotId)=0
checks if a robot can enter a segment at a specific time
virtual void setRobotDiameter(const std::vector< uint32_t > &_diameter)
sets the robot diameter for every robot
virtual bool setStartSegments(const std::vector< uint32_t > &_startSegments)=0
updates the start segments of the planning attempt
virtual void setThreads(const uint32_t _threads)
sets the number of threads
void reset(const uint32_t _nrRobots)
resets the speed rescheduler (all speeds to max)
bool usePriorityRescheduler_
std::vector< uint32_t > robotDiameter_
uint32_t priorityScheduleAttempts_
std::vector< std::vector< Checkpoint > > generatePath(const std::vector< std::vector< RouteVertex >> &_paths, const RouteCoordinator &routeQuerry_) const
generates a final Routing Table containing Segment List and Preconditions to other robots ...
virtual bool getRoutingTable(const std::vector< Segment > &_graph, const std::vector< uint32_t > &_startSegments, const std::vector< uint32_t > &_goalSegments, std::vector< std::vector< Checkpoint >> &_routingTable, const float &_timeLimit)
computes the routing table according to the given start and goal _goalSegments
bool rescheduleSpeeds(const uint32_t _collidingRobot, const std::vector< uint32_t > &_collsisions, std::vector< float > &_newSchedule, int32_t &_firstRobotToReplan)
reduces a selected robots maximum speed
RouteCoordinatorTimed rct_
bool useSpeedRescheduler_
virtual void setCollisionResolver(const SegmentExpander::CollisionResolverType cRes)
sets the CollisionResolverType used to resolve occured robot collisions
bool reschedulePriorities(const uint32_t _collidingRobot, std::vector< uint32_t > _collsisions, std::vector< uint32_t > &_newSchedule, uint32_t &_firstRobotToReplan)
rescedules priorities depending on the ound collisions and allready tried schedules ...
PriorityScheduler priority_scheduler_
virtual void setRobotNr(const uint32_t _nr_robots)
sets the number of robots used
virtual const uint32_t getPriorityScheduleAttempts() const
returns the number of attemps to reschedul the priorities taken
virtual void setSpeedRescheduling(const bool _status)
enables or disables speed rescheduling
SpeedScheduler speed_scheduler_
uint32_t maxIterationsSingleRobot_
virtual void reset(const std::vector< Segment > &_graph, const uint32_t _nrRobots)=0
resets the planning session of multiple robots
uint32_t speedScheduleAttempts_
virtual const uint32_t getSpeedScheduleAttempts() const
returns the number of attemps to limit the maximum speed of a robot taken
void resetAttempt(const std::vector< Segment > &_graph)
std::vector< SingleRobotRouter > srr
const std::vector< float > & getActualSpeeds()
returns the computed speed schedule
std::vector< std::vector< uint32_t > > robotCollisions_
SegmentExpander::CollisionResolverType cResType_
const std::vector< uint32_t > & getActualSchedule() const
returns the currently produced speed schedule
virtual void setPriorityRescheduling(const bool _status)
enables or disables priority rescheduling