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 15:13:18 浏览: 71
Qt_Timer:用QT实现的计时器
在你的代码中,我发现在使用 `QTimer::singleShot` 函数时,你的函数参数列表有一些问题。正确的写法应该是:
```
QTimer::singleShot(time, this, [=]() {
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);
}
});
```
在这里,你应该使用 lambda 表达式来捕获变量 `i` 和 `next_node`。这样做的目的是避免在定时器触发时,这些变量已经失效了。使用 lambda 表达式可以将这些变量复制到一个新的上下文中,在定时器触发时使用。
另外,你在计算时间时使用了一个常数 1000。这个常数是将毫秒转换为秒的系数,但是在这里不应该使用它。因为你计算出的时间应该是以毫秒为单位的,所以不需要进行单位转换。正确的写法应该是:
```
float time = distance / speed;
QTimer::singleShot(time * 1000, this, [=]() {
// ...
});
```
这样就可以正确地更新 agv 的位置了。
阅读全文