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);//agv設置為可用狀態 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 = astar.getPath(start_node, end_node1); path.erase(path.begin()); paths[i] = path; } },添加代碼,如果agv的load是false,即空載狀態,agv的速度是初始值,如果agv的load是true,即重載狀態,agv的速度減3
时间: 2024-01-23 22:02:52 浏览: 16
您可以在代码中增加以下内容来实现您的要求:
```c++
if (agvs[i].getLoad() == false) { // 如果是空载状态
agvs[i].setSpeed(initial_speed); // 设置为初始速度
} else { // 如果是重载状态
agvs[i].setSpeed(initial_speed - 3); // 设置速度减3
}
```
这段代码会判断 AGV 的载货状态,如果是空载状态,则将 AGV 的速度设置为初始速度;如果是重载状态,则将 AGV 的速度设置为初始速度减3。
相关问题
void MainWindow::moveAgvs_(){ timer =new QTimer(this); timer->start(1000); connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);} void MainWindow::moveAgvs() { Astar astar; std::vector<Node*> path; 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; if (agvs[i].getLoad() == false) { end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY()); } else { end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY()); } std::vector<Node*> path = astar.getPath(start_node, end_node); 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][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; 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沒有模擬運行,修改一下
有几个问题需要修正:
1. `moveAgvs_()`函数中,应该将`timer->start(1000)`放在`connect`语句的后面,因为如果`timeout`信号在`start()`之前被触发,会导致`moveAgvs()`函数在启动定时器之前就被调用。
2. 在`moveAgvs()`函数中,定义了一个名为`path`的局部变量,覆盖了函数开头定义的`std::vector<Node*> path`。因此,在后面对`paths`进行赋值时,实际上是没有生效的。应该将第6行的`std::vector<Node*> path;`修改为`path = astar.getPath(start_node, end_node);`。
3. 在`QTimer::singleShot()`函数的第三个参数中,应该将`&`去掉,并在lambda表达式中加入`i`和`next_node`的捕获列表。即将`&, i, next_node`修改为`[=, i, next_node]() mutable {`。
4. 在`QTimer::singleShot()`函数中,应该将花括号中的代码块用圆括号括起来,即将`{ agvs[i].setCurrentX(next_node->x);`修改为`{ agvs[i].setCurrentX(next_node->x); }`。
下面是修改后的代码:
```c++
void MainWindow::moveAgvs_()
{
timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, &MainWindow::moveAgvs);
timer->start(1000);
}
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;
if (agvs[i].getLoad() == false)
{
end_node = new Node(agvs[i].getStartX(), agvs[i].getStartY());
}
else
{
end_node = new Node(agvs[i].getEndX(), agvs[i].getEndY());
}
std::vector<Node*> path = astar.getPath(start_node, end_node);
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][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;
QTimer::singleShot(time, [=, i, next_node]() mutable {
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);
}
});
}
}
}
```
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(); // 在窗口中重绘 }); } }, for (int i = 0; i < agvs.size(); i++) { if (agvs[i].getLoad()){ painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agvload.png").scaled(25,25)); } else { painter.drawPixmap(agvs[i].getCurrentX()*25+200-(nodeSpacing-nodeSize)/2,(agvs[i].getCurrentY()+1)*25+50-(nodeSpacing-nodeSize)/2,25,25,QPixmap(":/new/prefix1/agv1.png").scaled(25,25)); },修改代碼:實現agv小車的模擬運動,而不是一秒跳一格
你可以尝试使用一个定时器来实现agv小车的模拟运动,而不是一秒跳一格。你可以根据agv的速度和路径上相邻节点的距离来计算每次定时器触发的时间间隔和小车移动的距离。具体实现可以参考下面的代码:
```c++
// 定义定时器
QTimer* timer = new QTimer(this);
connect(timer, &QTimer::timeout, this, [=]() {
// 遍历所有AGV
for (int i = 0; i < agvs.size(); i++) {
// 如果AGV已经完成任务,则跳过
if (tasks[agvs[i].get_task_id()].completed == 2) {
continue;
}
// 如果AGV当前还有路径
if (!paths[i].empty()) {
// 获取AGV当前位置和下一个节点
int cur_x = agvs[i].getCurrentX();
int cur_y = agvs[i].getCurrentY();
Node* next_node = paths[i][0];
// 计算AGV移动的距离和时间
float speed = agvs[i].getSpeed();
float distance = sqrt(pow(next_node->x - cur_x, 2) + pow(next_node->y - cur_y, 2));
float time = distance / speed * 1000;
// 标记AGV当前位置
_MAP[cur_x][cur_y] = 1;
// 移动AGV
agvs[i].setCurrentX(next_node->x);
agvs[i].setCurrentY(next_node->y);
// 重绘窗口
this->update();
// 延时一段时间后执行回调函数,将标记设为0
QTimer::singleShot(time, this, [=]() {
_MAP[cur_x][cur_y] = 0;
});
// 从路径中删除已经到达的节点
paths[i].erase(paths[i].begin());
}
}
});
// 启动定时器
timer->start(50); // 每50毫秒触发一次
```
在绘制AGV小车时,可以直接使用AGV的当前位置来计算绘制的位置,因为AGV的位置已经在定时器中更新了。代码如下:
```c++
for (int i = 0; i < agvs.size(); i++) {
int x = agvs[i].getCurrentX() * 25 + 200 - (nodeSpacing - nodeSize) / 2;
int y = (agvs[i].getCurrentY() + 1) * 25 + 50 - (nodeSpacing - nodeSize) / 2;
if (agvs[i].getLoad()) {
painter.drawPixmap(x, y, 25, 25, QPixmap(":/new/prefix1/agvload.png").scaled(25, 25));
} else {
painter.drawPixmap(x, y, 25, 25, QPixmap(":/new/prefix1/agv1.png").scaled(25, 25));
}
}
```
这样修改后,你就可以看到AGV小车实现了平滑的模拟运动了。
相关推荐
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.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)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![.pdf](https://img-home.csdnimg.cn/images/20210720083646.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![7z](https://img-home.csdnimg.cn/images/20210720083312.png)