自动化立体仓库:AGV在物流中的应用

需积分: 0 0 下载量 115 浏览量 更新于2024-08-24 收藏 1.58MB PPT 举报
"自动导向车AGV-自动化立体仓库" 自动导向车(AGV)是一种先进的物流设备,主要用于自动化仓储系统中。这些车辆无需人工驾驶,能够根据预设的导向路径自主移动,通常由蓄电池供电并配备直流电动机作为动力源。AGV的承载能力广泛,从50公斤到5000公斤不等,最高可达100吨。根据不同的应用需求,AGV分为多种类型,如自动导向搬运车、自动导向牵引车和自动导向叉车,它们各自在物料搬运和物流运输中扮演着不同角色。 自动化立体仓库是现代仓储系统中的一个重要组成部分,它利用高层货架和自动化设备实现高效的空间利用率和库存管理。例如,内蒙古蒙牛乳业泰安有限公司的自动化立体仓库就是一个典型的实例。该仓库由太原刚玉物流工程有限公司设计制造,与生产线和出库区紧密连接,专门存储乳制品。仓库拥有多个不同高度的货架区域,总计19632个货位,分别用于常温和低温产品的存储。仓库的入库和出库能力分别为150盘/小时和300盘/小时。 入库区配备了链式输送机和双工位高速穿梭车,确保生产线上的货物能快速有效地进入库区。穿梭车在入库输送机和巷道堆垛机之间进行货物分配、转动和空托盘回送。巷道堆垛机是仓库的核心设备,它们遵循计算机指令,执行取货、搬运、存储和出货任务。 仓库内的托盘回流区利用输送机、巷道堆垛机和货架管理空托盘的回收、存储和回送。出库区则由输送机、叉车和运输车辆协同工作,通过电子看板和RF终端进行货物的暂存、装车和信息反馈。此外,设有专门的维修区,确保穿梭车的正常运行。整个系统的控制和管理工作在二楼的计算机控制室进行,包括出入库登记、高度管理以及与其它系统的联机控制。 自动化立体仓库(AS/RS)通过高层货架的使用,极大地提高了仓库空间的利用率,同时结合自动化设备,实现了库存管理的精准和高效。这种仓库系统不仅减少了人工操作,降低了错误率,还大大提升了物流效率,是现代化物流中心不可或缺的组成部分。

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return !task_1.completed; } else { return task_1.priority < task_2.priority; } }); for (const auto& task : tasks) { std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (!task.completed) { AGV* closest_agv = nullptr; // 初始化为 nullptr while (closest_agv == nullptr) { // 查找可用的小车 for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); } } // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } // 将任务分配给 AGV 对象的起点和终点坐标 closest_agv->setStartCoord(task.start_x, task.start_y); closest_agv->setEndCoord(task.end_x, task.end_y); closest_agv->setState(false); task.completed = true; std::cout << closest_agv->getid() << "," << task.id << endl; } } },當沒有小車用的時候就卡死,添加代碼,找到可用小車的開始運行,沒找到可用小車的一直等待,直到有可用小車

2023-05-24 上传

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return task_1.completed < task_2.completed; // 未完成的任务排在已完成的任务前面 } else { return task_1.priority < task_2.priority; // 同一完成状态下,按照优先级排序 } }); for (const auto& task : tasks) { //std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (task.completed == 0) { // 只分配未完成的任务 AGV* closest_agv = nullptr; int wait_time = 0; // 等待时间计数器 // 初始化为 nullptr while (closest_agv == nullptr && wait_time < 1) { // 最多等待 1 秒钟 // 查找可用的小车 for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); wait_time++; } } if (closest_agv != nullptr) { // 找到可用小车 // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } // 将任务分配给 AGV 对象的起点和终点坐标 closest_agv->set_task_id(task.id); closest_agv->setStartCoord(task.start_x, task.start_y); closest_agv->setEndCoord(task.end_x, task.end_y); closest_agv->setState(false); // 小车被占用 task.completed = 1; // 任务状态修改为进行中 std::cout << "agv_id" << closest_agv->getid() << "————" << "task_id"<<task.id << "task_completed"<< task.completed << endl; } else { std::cout << "task_id-" << task.id << "No available AGV!" << "task_completed"<< task.completed <<endl; } } },修改代碼為在最後輸出所有task的agvid,taskid和task的completed

135 浏览量

void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs) { // 首先按照任务的完成状态、优先级进行排序 std::sort(tasks.begin(), tasks.end(), [](const Task& task_1, const Task& task_2) { if (task_1.completed != task_2.completed) { return !task_1.completed; } else { return task_1.priority < task_2.priority; } }); for (const auto& task : tasks) { std::cout << "Task name: " << task.id << ", Completed: " << task.completed << ", Priority: " << task.priority << std::endl; } // 遍历任务列表,分配任务给可用的小车 for (auto& task : tasks) { if (!task.completed) { AGV* closest_agv = nullptr; // 初始化为 nullptr // 查找可用的小车 while (closest_agv == nullptr) { for (auto& agv : agvs) { if (agv.getState()) { closest_agv = &agv; break; } } if (closest_agv == nullptr) { // 没有可用的小车,等待一段时间再查找 std::this_thread::sleep_for(std::chrono::seconds(1)); } } // 找到最近的可用小车 int min_distance = INT_MAX; for (auto& agv : agvs) { if (agv.getState()) { int distance = abs(agv.getCurrentX()- task.start_x) + abs(agv.getCurrentY() - task.start_y); if (distance < min_distance) { min_distance = distance; closest_agv = &agv; } } } closest_agv->setCurrentX(closest_agv->getCurrentX()); closest_agv->setCurrentY(closest_agv->getCurrentY()); closest_agv->setEndCoord(task.end_x, task.end_y); // 将任务终点分配给 AGV 对象的终点坐标 closest_agv->setStartCoord(task.start_x, task.start_y); // 将任务起点分配给 AGV 对象的终点坐标 closest_agv->setState(false); task.completed = true; std::cout << closest_agv->getid() << "," << task.id << endl; } } },修改爲找到可用的小車,找不到等待一段时间再查找。已經找到的可用小車的任務繼續下面的流程,黨等待一段時間找到可用任務的小車也繼續下面的流程

2023-05-24 上传