for (int i = 0; i < agvs.size(); i++) { for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (tasks[completed_task_index].completed == 2 ) { // 如果已经完成任务 paths[i].clear(); continue; // 跳过此次循环 } if (! paths[i].empty()) { Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - agvs[i].getCurrentX(), 2) + pow(next_node->y - agvs[i].getCurrentY(), 2)); float time = distance / speed * 1000; //node_Value[next_node->x][next_node->y] = 10; QTimer::singleShot(time, this, &, i, next_node { agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); this->update(); // 在窗口中重绘 }); } },添加代碼,獲取agv的current的x和y,_MAP[][] = 1,黨agv離開這個點的時候,MAP變爲0
时间: 2023-12-14 11:40:10 浏览: 64
您可以在AGV离开节点时,添加以下代码来更新地图:
```c++
// 获取AGV当前位置
int cur_x = agvs[i].getCurrentX();
int cur_y = agvs[i].getCurrentY();
// 将地图上对应的位置标记为0
_MAP[cur_x][cur_y] = 0;
```
同时,您需要在AGV到达下一个节点时,将地图上对应的位置标记为1,您可以在以下代码中添加:
```c++
QTimer::singleShot(time, this, &, i, next_node {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
// 更新地图上对应的位置为1
_MAP[next_node->x][next_node->y] = 1;
this->update(); // 在窗口中重绘
});
```
注意:以上代码只是一种实现方式,具体实现还需根据您的代码逻辑进行调整。
相关问题
for (int i = 0; i < agvs.size(); i++) { for (int j = 0; j < paths[i].size(); j++) { for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (tasks[completed_task_index].completed == 2 ) { // 如果已经完成任务 continue; // 跳过此次循环 } _MAP[paths[i][j]->x][ paths[i][j]->y] = 5; } },添加代碼:黨任務的completd值是2的時候,清空path裏的值
可以在 `if (tasks[j].id == agvs[i].get_task_id())` 和 `if (tasks[completed_task_index].completed == 2)` 之间添加以下代码:
```
if (tasks[completed_task_index].completed == 2) {
paths[i].clear(); // 清空当前 AGV 的路径
break; // 跳出内层循环
}
```
这样当任务的 `completed` 值为 2 时,就会清空当前 AGV 的路径,跳过该任务,继续执行下一个任务。
while (true) { bool all_tasks_completed = true; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].completed = 0) { all_tasks_completed = false; break; } } AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務 // 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == false) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } } if (all_tasks_completed) { break; } }
这段代码看起来是一个 AGV 调度系统的主循环。在每次循环中,系统会检查所有任务是否已经完成,如果没有完成则开始分配任务给 AGV 并更新 AGV 的位置和状态。如果所有任务都已经完成,则退出循环。
其中,AGVScheduler 是一个 AGV 调度器类,assign_task_to_agv() 函数用于将任务分配给 AGV,moveAgvs() 函数用于更新 AGV 的位置和状态。在 AGV 更新位置和状态时,代码会输出 AGV 的 ID 和当前正在执行的任务的 ID。
需要注意的是,代码中的 if (tasks[j].completed = 0) 应该是 if (tasks[j].completed == 0),因为这里应该是判断任务是否已经完成,应该使用双等号来进行比较。
阅读全文