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 20:13:49 浏览: 47
您的代码中,您在 QTimer::singleShot() 的槽函数中使用了一个 lambda 表达式,但是这个 lambda 表达式的语法不正确。您需要将这个 lambda 表达式修改为函数,或者正确编写 lambda 表达式。
另外,您在 lambda 表达式中使用了 & 符号,但是您并没有将参数列表中的变量按照正确的顺序传递给它。您需要将 & 符号后面的参数列表改为正确的形式,例如:
```c++
QTimer::singleShot(time, this, [i, next_node, 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);
}
});
```
这里,我们使用了捕获列表 `[i, next_node, this]` 来将变量 i 和 next_node 以及 MainWindow 类对象 this 捕获到 lambda 表达式中。在 lambda 表达式中,我们可以直接使用这些变量。
另外,您在代码中使用了动态分配内存,但是您没有在适当的时候释放内存,这会导致内存泄漏。您可以使用 C++11 中的智能指针来避免这个问题,例如:
```c++
std::vector<std::vector<std::shared_ptr<Node>>> paths(agvs.size());
// ...
std::shared_ptr<Node> start_node(new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()));
std::shared_ptr<Node> end_node(new Node(agvs[i].getStartX(), agvs[i].getStartY()));
std::shared_ptr<Node> end_node1(new Node(agvs[i].getEndX(), agvs[i].getEndY()));
// ...
std::vector<std::shared_ptr<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;
```
这里,我们使用了 `std::shared_ptr` 智能指针来管理动态分配的内存,这样可以自动释放内存,避免内存泄漏。