AGV agv1(1, 1, 1, 0, 0, 0, 0, 10, false, true); AGV agv2(2, 10, 3, 0, 0, 0, 0, 3, false, true); AGV agv3(3, 29, 5, 0 ,0, 6, 6, 5, false, true); Task task1 = {1, 20, 23, 15, 15, 5, false}; Task task2 = {2, 5, 26, 3, 10, 4, false}; Task task3 = {3, 28, 14, 5, 29, 1, false}; //Task task4 = {4, 14, 14, 2, 18, 2, false}; //Task task5 = {5, 20, 20, 30, 30, 3, false}; std::vector<Task> tasks = {task1, task2, task3}; std::vector<AGV> agvs = {agv1, agv2, agv3};,構造循環函數將所有agv放入agvs
时间: 2023-07-02 07:04:27 浏览: 102
您可以使用如下的循环函数将所有 AGV 放入 agvs 向量中:
```c++
void addAGVs(std::vector<AGV>& agvs, AGV agv1, AGV agv2, AGV agv3) {
agvs.push_back(agv1);
agvs.push_back(agv2);
agvs.push_back(agv3);
}
```
在您的主函数中调用该函数:
```c++
std::vector<AGV> agvs;
addAGVs(agvs, agv1, agv2, agv3);
```
这样就将所有 AGV 放入了 agvs 向量中。如果您有更多的 AGV,只需要在函数参数中添加相应的 AGV 即可。
相关问题
[调试] 2023-06-08 11:12:27.301 thread:[11] 202306081112259434178 任务状态Executing(添加记录) 16356244608974848 【202306081112259434178 Executing BOOK2 Step1 AGV4 AGVType0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 2023/6/8 11:12:26 BindAGV0】 [调试] 2023-06-08 11:12:27.301 thread:[11] 202306081112259434178 Step1 Step_Executing Move 101 S:21 V:835 AGV:0(0,0,0) PMS:0【4# Online:False E:393 V:0 LogicBits:0 U:False D:False】
这是一段调试信息,可能是由一个WebAPI应用程序输出的,其中 thread:[11] 表示当前线程的编号,202306081112259434178 是某个任务的唯一标识符,任务状态为Executing(正在执行)。接下来的信息描述了该任务正在执行的具体步骤,包括步骤名称、执行结果、AGV车辆编号、位置等信息。其中,S:21和V:835分别表示AGV车辆的速度和电量,PMS:0表示AGV车辆未被PMS系统控制,4# Online:False表示所在的区域和AGV车辆的在线状态等信息。
if (! paths[i].empty()) { double cur_x = agvs[i].getCurrentX(); double cur_y = agvs[i].getCurrentY(); Node* next_node = paths[i][0]; float speed = agvs[i].getSpeed(); float distance = sqrt(pow(next_node->x - cur_x, 2) + pow(next_node->y - cur_y, 2)); int steps = ceil(distance / (speed * 0.02)); // 计算需要移动的步数 float power_consumption = distance / 20; //_MAP[cur_x][cur_y] = 1; for (int j = 1; j <= steps; j++) { float time = j *100 / speed; // 每步所需时间 QTimer::singleShot(time, this, [&, i, next_node, cur_x, cur_y, power_consumption, j, steps]() { if (j == 1) { // 离开当前位置时将标记设为0 //_MAP[cur_x][cur_y] = 0; } float ratio = static_cast<float>(j) / steps; double new_x = cur_x + ratio * (next_node->x - cur_x); double new_y = cur_y + ratio * (next_node->y - cur_y); agvs[i].setCurrentX(new_x); agvs[i].setCurrentY(new_y); std:: cout <<"AGV"<<"("<< new_x << "," << new_y << ")" << endl; // 更新电量 agvs[i].setpower(agvs[i].power_ - power_consumption / steps); this->update(); // 在窗口中重绘 }); } },爲什麽輸出的currentx和y還會有整數AGV(1,1.08333) AGV(1,1.16667) AGV(1,1.25) AGV(1,1.33333) AGV(1,1.41667) AGV(1,1.5) AGV(1,1.58333) AGV(1,1.66667) AGV(1,1.75) AGV(1,1.83333) AGV(1,1.91667) AGV(1,2) AGV(1,2.08333) AGV(1,2.16667) AGV(1,2.25) AGV(1,2.33333) AGV(1,2.41667) AGV(1,2.5) AGV(1,2.58333) AGV(1,2.66667) AGV(1,2.75) AGV(1,2.83333) AGV(1,2.91667) AGV(1,3)
这是因为每次循环中,new_x和new_y都是通过浮点数运算得出的,但是在输出时没有进行四舍五入的处理。因此,如果new_x或new_y的小数部分小于0.5,那么输出的值就会是整数部分加上小数部分;如果小数部分大于等于0.5,那么输出的值就会是整数部分加上小数部分加1。
如果你想要输出更加精确的坐标值,可以使用C++中的round函数来进行四舍五入的处理。例如:
```
double new_x_rounded = round(new_x * 100) / 100;
double new_y_rounded = round(new_y * 100) / 100;
std::cout << "AGV" << "(" << new_x_rounded << "," << new_y_rounded << ")" << std::endl;
```
这会将new_x和new_y乘以100后进行四舍五入,再除以100输出。这样就可以得到更加准确的坐标值。
阅读全文