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 10:40:01 浏览: 27
你可以在移动 AGV 的代码中添加下面的代码来获取当前 AGV 的位置,并将上一个节点的地图值设为 0:
```c++
int current_x = agvs[i].getCurrentX();
int current_y = agvs[i].getCurrentY();
// 将上一个节点的地图值设为 0
_MAP[current_x][current_y] = 0;
Node* next_node = paths[i][0];
// 将下一个节点的地图值设为 1
_MAP[next_node->x][next_node->y] = 1;
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - current_x, 2) + pow(next_node->y - current_y, 2));
float time = distance / speed * 1000;
QTimer::singleShot(time, this, &, i, next_node {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
this->update();
});
```
这样,每次 AGV 移动时,都会将上一个节点的地图值设为 0,将下一个节点的地图值设为 1。
相关问题
AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs); for (int i = 0; i < agvs.size(); i++) { moveAgvs(i); },增加函數,直到所有的任務都已經完成
您的问题似乎是一段代码,而不是一个问题。不过我可以看出这是一个AGV调度器,用于将任务分配给AGV并控制它们完成任务。如果您想让所有任务都完成后停止调度器,您可以使用一个while循环,检查任务是否全部完成,然后再退出循环。
示例代码:
```
AGVScheduler scheduler;
scheduler.assign_task_to_agv(tasks, agvs);
bool all_tasks_completed = false;
while (!all_tasks_completed) {
all_tasks_completed = true;
for (int i = 0; i < agvs.size(); i++) {
moveAgvs(i);
if (!agvs[i].isTaskCompleted()) {
all_tasks_completed = false;
}
}
}
```
这段代码将不断循环,直到所有任务都完成并退出循环。
//輸出path for (int i = 0; i < agvs.size(); i++) { for (int j = 0; j < paths[i].size(); j++) { _MAP[paths[i][j]->x][ paths[i][j]->y] = 5; } } //模擬小車行駛 for (int i = 0; i < agvs.size(); i++) { 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(); // 在窗口中重绘 }); } } //如果任務完成停止定時器 for (int i = 0; i < tasks.size(); i++) { if (tasks[i].completed != 2) { allTasksCompleted = false; break; } } if (allTasksCompleted) { timer->stop(); update(); } } },添加黨agv的current坐標輸入_MAP中,值為0
可以在第一个 for 循环中添加以下代码来实现:
```
for (int i = 0; i < agvs.size(); i++) {
_MAP[agvs[i].getCurrentX()][agvs[i].getCurrentY()] = 0;
}
```
这样就可以将所有 AGV 的当前位置对应的地图值设为 0。完整的代码如下:
```
for (int i = 0; i < agvs.size(); i++) {
for (int j = 0; j < paths[i].size(); j++) {
_MAP[paths[i][j]->x][paths[i][j]->y] = 5;
}
}
for (int i = 0; i < agvs.size(); i++) {
_MAP[agvs[i].getCurrentX()][agvs[i].getCurrentY()] = 0;
}
for (int i = 0; i < agvs.size(); i++) {
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;
QTimer::singleShot(time, this, [&, i, next_node]() {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
this->update();
});
}
}
for (int i = 0; i < tasks.size(); i++) {
if (tasks[i].completed != 2) {
allTasksCompleted = false;
break;
}
}
if (allTasksCompleted) {
timer->stop();
update();
}
```