软挑
主函数有个Work对象
# readMapOK
读取判题器发送过来的地图数据,数据格式参考任务书
# work->init()
拿到地图数据后进行一些初始化工作
# readFrameOK
读取判题器发送过来的每一帧数据,数据格式参考任务书
# schedulingRobot
调度机器人,返回需要的指令 orders
最后将 orders printf给判题器。
以上所有操作都是在work对象来操作的。
# work->schedulingRobot()
vector<string> schedulingRobot(int frameId) {
// 这里是要返回的机器人控制指令orders
vector<string> orders;
// 操作四个机器人
for (const auto &robot: robots) {
// 1. 如果机器人没有目标工作台,给机器人设立一个目标工作台. 调用2,或3
// 2. findWorkBenchService->findWorkbenchBuy();
// 3. findWorkBenchService->findWorkbenchSell();
// 4. 有了目标工作台,判断机器人是否已经到达工作台, 调用5 或6
// 5. 买, push买的指令, 并且同时设立目标工作台 调用3
// 6. 卖, push卖的指令, 并且同时设立目标工作台 调用2
// 7. 机器人有目标, 让机器人按照路径走,调用
// 8. robot->pathMove(), 返回运动控制指令
}
// 9. 这里写碰撞检测, 调用
// 10. collisionService->avoid(),返回运动控制指令,会覆盖8的控制指令
// 返回这一帧所有指令
return orders;
}
# findWorkbenchBuy(), findWorkbenchSell()
如果可以给机器人设定一个目标工作台,那么函数的最后会给机器人设置target工作台,并且会给他路径
auto &workbench = item.first;
// 这里有两条路径,一条是原始的路径,optimPath是筛选出关键点后的路径
vector<vector<double>> path, optimPath;
bool succeed = findPath(*robot, *workbench, path, optimPath);
if (succeed) {
int workbenchId = workbench->getWorkbenchId();
// 给机器人路径
robot->setPath(optimPath);
robot->setTargetWorkBenchId(workbenchId);
robot->pidClear();
}
函数的其他部分是如何给机器人分发工作台的问题,不用管。
# robot->pathMove(), 控制机器人运动
// 机器人会拿到一个 path路径, 机器人记录当前路径中的哪一步
vector<string> pathMove() {
vector<string> res;
// 遍历路径中的每一步
for (; path_step < path.size(); ++path_step) {
// 拿到路径中某一步的坐标(x,y)
double targetX = path[path_step][0];
double targetY = path[path_step][1];
// 让机器人运动到(x,y)
// 根据机器人当前的位置,计算运动到(x,y)需要的速度和角速度
// 最后push 速度指令和角速度指令到 res中,最后返回
return res;
}
return res;
}