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(); // 在窗口中重绘 }); } },修改爲:模擬小車平滑移動
时间: 2024-01-07 15:03:45 浏览: 31
可以尝试使用插值法来实现小车平滑移动。具体来说,可以在路径规划时将路径上的每个点之间插入多个点,使得小车在移动时可以按照一定的时间间隔逐渐接近下一个点,从而实现平滑移动的效果。
具体实现可以参考以下代码:
```
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;
// 插值计算路径上的点
std::vector<Node*> interpolated_nodes;
Node* prev_node = new Node(cur_x, cur_y);
for (int k = 1; k <= time / INTERVAL; k++) {
float ratio = (float) k / (float) (time / INTERVAL);
int x = prev_node->x + (next_node->x - prev_node->x) * ratio;
int y = prev_node->y + (next_node->y - prev_node->y) * ratio;
interpolated_nodes.push_back(new Node(x, y));
}
interpolated_nodes.push_back(next_node);
// 依次移动到插值点
for (int k = 1; k < interpolated_nodes.size(); k++) {
Node* node = interpolated_nodes[k];
int x = node->x;
int y = node->y;
QTimer::singleShot(k*INTERVAL, this, [&, i, node, cur_x, cur_y]() {
agvs[i].setCurrentX(node->x);
agvs[i].setCurrentY(node->y);
this->update(); // 在窗口中重绘
});
prev_node = node;
}
delete prev_node;
}
}
```
其中,`INTERVAL` 表示小车在路径上相邻两个点之间移动的时间间隔,可以根据实际需要进行调整。如果需要更加平滑的移动效果,可以将时间间隔设置得更小。