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()) { int cur_x = agvs[i].getCurrentX(); int cur_y = agvs[i].getCurrentY(); 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; _MAP[cur_x][cur_y] = 1; QTimer::singleShot(time, this, &, i, next_node, cur_x, cur_y { // 离开当前位置时将标记设为0 _MAP[cur_x][cur_y] = 0; agvs[i].setCurrentX(next_node->x); agvs[i].setCurrentY(next_node->y); this->update(); // 在窗口中重绘 }); } }, for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad()){ painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agvload.png").scaled(25,25)); } else { painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agv1.png").scaled(25,25)); },修改代碼:實現agv小車的模擬運動,而不是一秒跳一格
时间: 2024-01-29 08:04:42 浏览: 69
AGVS.rar_AGVS调度_gulf5j4_scheduling AGV_wpf agv调度系统_调度控制
5星 · 资源好评率100%
你可以尝试使用一个定时器来实现agv小车的模拟运动,而不是一秒跳一格。你可以根据agv的速度和路径上相邻节点的距离来计算每次定时器触发的时间间隔和小车移动的距离。具体实现可以参考下面的代码:
```c++
// 定义定时器
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=]() {
// 遍历所有AGV
for (int i = 0; i < agvs.size(); i++) {
// 如果AGV已经完成任务,则跳过
if (tasks[agvs[i].get_task_id()].completed == 2) {
continue;
}
// 如果AGV当前还有路径
if (!paths[i].empty()) {
// 获取AGV当前位置和下一个节点
int cur_x = agvs[i].getCurrentX();
int cur_y = agvs[i].getCurrentY();
Node* next_node = paths[i][0];
// 计算AGV移动的距离和时间
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - cur_x, 2) + pow(next_node->y - cur_y, 2));
float time = distance / speed * 1000;
// 标记AGV当前位置
_MAP[cur_x][cur_y] = 1;
// 移动AGV
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
// 重绘窗口
this->update();
// 延时一段时间后执行回调函数,将标记设为0
QTimer::singleShot(time, this, [=]() {
_MAP[cur_x][cur_y] = 0;
});
// 从路径中删除已经到达的节点
paths[i].erase(paths[i].begin());
}
}
});
// 启动定时器
timer->start(50); // 每50毫秒触发一次
```
在绘制AGV小车时,可以直接使用AGV的当前位置来计算绘制的位置,因为AGV的位置已经在定时器中更新了。代码如下:
```c++
for (int i = 0; i < agvs.size(); i++) {
int x = agvs[i].getCurrentX() * 25 + 200 - (nodeSpacing - nodeSize) / 2;
int y = (agvs[i].getCurrentY() + 1) * 25 + 50 - (nodeSpacing - nodeSize) / 2;
if (agvs[i].getLoad()) {
painter.drawPixmap(x, y, 25, 25, QPixmap(":/new/prefix1/agvload.png").scaled(25, 25));
} else {
painter.drawPixmap(x, y, 25, 25, QPixmap(":/new/prefix1/agv1.png").scaled(25, 25));
}
}
```
这样修改后,你就可以看到AGV小车实现了平滑的模拟运动了。
阅读全文