// 得到agv的路綫 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad() == true) { // 如果是负载的状态 if (agvs[i].getCurrentX() == agvs[i].getEndX() && agvs[i].getCurrentY() == agvs[i].getEndY()) { // 如果到达终点 agvs[i].setLoad(false); // 设置为空载状态 agvs[i].setState(true); std :: cout << "agv__id :" << agvs[i].getid() << " ,agv_get_task_id :" << agvs[i].get_task_id() << endl; for (int j = 0; j < tasks.size(); j++) { if (tasks[j].id == agvs[i].get_task_id()) { completed_task_index = j; break; } } if (completed_task_index != -1) { tasks[completed_task_index].completed = 2; } task_to_agv(); // 更新任务分配 update(); // 更新AGV状态 } else { // 否则行驶到终点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node1 = new Node(agvs[i].getEndX(), agvs[i].getEndY()); std::vector<Node*> path_to_end = astar.getPath(start_node, end_node1); path_to_end.erase(path_to_end.begin()); std::vector<Node*> path; path.insert(path.end(), path_to_end.begin(), path_to_end.end()); paths[i] = path; } } else { // 如果是空载的状态 if (agvs[i].getCurrentX() == agvs[i].getStartX() && agvs[i].getCurrentY() == agvs[i].getStartY()) { // 如果到达起点 agvs[i].setLoad(true); // 设置为负载状态 } else { // 否则行驶到起点 Node* start_node = new Node(agvs[i].getCurrentX(), agvs[i].getCurrentY()); Node* end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); std::vector<Node*> path_to_start = astar.getPath(start_node, end_node); std::vector<Node*> path; path.insert(path.end(), path_to_start.begin() + 1, path_to_start.end()); paths[i] = path; } } },添加代碼:根據path得到的坐標繪製直綫,得到agv行駛的路綫
时间: 2024-01-21 18:19:22 浏览: 24
可以使用图形库(如OpenCV)来绘制路径。首先,根据每个AGV的路径(即坐标序列),计算出每个坐标点之间的直线段,然后使用绘图函数将这些线段绘制出来。
代码示例:
```
// 计算直线段
std::vector<cv::Point> line_points;
for (int j = 0; j < paths[i].size() - 1; j++) {
cv::Point start_point(paths[i][j]->x, paths[i][j]->y);
cv::Point end_point(paths[i][j+1]->x, paths[i][j+1]->y);
line_points.push_back(start_point);
line_points.push_back(end_point);
}
// 绘制路径
cv::Mat img = cv::Mat::zeros(map_height, map_width, CV_8UC3);
for (int j = 0; j < line_points.size() - 1; j += 2) {
cv::line(img, line_points[j], line_points[j+1], cv::Scalar(0, 0, 255), 2);
}
cv::imshow("AGV Path", img);
cv::waitKey(0);
```
以上代码将绘制出一张带有AGV路径的图像,并在窗口中显示。您可以根据实际情况调整颜色、线宽等参数。
相关问题
// 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } },將他變爲定時觸發
如果你想将这段代码变为定时触发,可以使用 QTimer 类在指定的时间间隔内触发一个信号,并在该信号的槽函数中执行这段代码。
首先,你需要创建一个 QTimer 对象,并设置定时器的时间间隔:
```
QTimer* timer = new QTimer(this);
timer->setInterval(1000); // 定时器间隔为 1 秒
```
接下来,你需要将 QTimer 对象的 timeout() 信号连接到一个槽函数,该槽函数将执行你需要定时触发的代码:
```
connect(timer, &QTimer::timeout, this, [=]() {
// 遍历所有 AGV,更新位置和状态
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) {
moveAgvs(i);
std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl;
}
}
});
```
最后,你需要启动 QTimer 对象来开始定时触发:
```
timer->start();
```
这样就可以在每个 1 秒钟内触发一次定时器,并执行你指定的代码。需要注意的是,如果你的程序需要在多线程中运行,请确保在正确的线程中创建和使用 QTimer 对象。
//分配小車 AGVScheduler scheduler; scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務 // 遍历所有 AGV,更新位置和状态 for (int i = 0; i < agvs.size(); i++) { if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) { moveAgvs(i); std:: cout << "agv.id:"<< agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl; } },添加代碼 :遍歷所有的task,只要所有task的completed的值不全為2,則循環這個函數
如果您的要求是遍历所有任务,只要所有任务的completed的值不全为2,就循环这个函数,可以尝试以下代码:
```
while (true) {
bool all_completed = true;
for (int i = 0; i < tasks.size(); i++) {
if (tasks[i].completed != 2) {
all_completed = false;
break;
}
}
if (all_completed) {
break;
}
AGVScheduler scheduler;
scheduler.assign_task_to_agv(tasks, agvs);//開始分配任務
for (int i = 0; i < agvs.size(); i++) {
if (agvs[i].available_ == 0 && agvs[i].run_== 0 ) {
moveAgvs(i);
std::cout << "agv.id:" << agvs[i].id_ << "___task.id :" << agvs[i].task_id << endl;
}
}
}
```
这段代码会无限循环,直到所有任务的completed的值都为2为止。在每次循环中,会先检查所有任务的completed的值是否都为2,如果是就跳出循环;否则就继续进行任务分配和 AGV 的更新操作。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)