void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(500); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<std::vector<Node*>> paths(agvs.size()); // 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path_to_end = astar.getPath(end_node, end_node1); // 去掉 end_node1 path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin()+1 , path_to_start.end()); path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path; //輸出agv的路綫 std::cout << "AGV " << i << " path: "; for (int j = 0; j < path.size(); j++) { std::cout << "(" << path[j]->x << ", " <<path[j]->y << ")"; if (j != path.size() - 1) { std::cout << " -> "; } } std::cout << std::endl; } for (int i = 0; i < agvs.size(); i++) { if (! paths[i].empty()) { Node* next_node = paths[i][1]; 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); std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl; this->update(); if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) { //task_to_agv(i); } }); } } },爲什麽每次運行以後agv的current的x和y沒有得到path下一個節點的坐標
时间: 2023-07-16 08:13:21 浏览: 65
Qt_Timer:用QT实现的计时器
在你的代码中,对于每个AGV,你都计算了它的路径并将其存储在一个 `std::vector` 中。然后,你使用 `QTimer::singleShot()` 函数来延迟一定的时间,以等待AGV移动到下一个节点。在这个函数的最后,你更新了AGV的当前位置,并打印了它的坐标。
然而,在你的 `QTimer::singleShot()` 调用中,你传递了 `i` 和 `next_node` 作为参数,但是你没有正确地使用它们。具体来说,你需要将 `i` 传递给 lambda 函数,并使用 `next_node` 中的坐标来更新AGV的当前位置。这样,你的代码应该修改为:
```
QTimer::singleShot(time, this, [&, i, next_node] {
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
std::cout << "AGV " << agvs[i].getid() << " current_x: " << agvs[i].getCurrentX() << " current_y: " << agvs[i].getCurrentY() <<std::endl;
this->update();
if (next_node->x == agvs[i].getEndX() && next_node->y == agvs[i].getEndY()) {
//task_to_agv(i);
}
});
```
这里,`[&, i, next_node]` 表示使用捕获列表捕获所有变量(使用 `&`),并将 `i` 和 `next_node` 作为参数传递给 lambda 函数。在 lambda 函数中,你可以使用这些变量来更新AGV的当前位置。
阅读全文