磁导式AGV自动导航控制系统设计与优缺点分析

需积分: 45 120 下载量 10 浏览量 更新于2024-08-09 收藏 4.37MB PDF 举报
"这篇资源主要讨论了AGV(Automated Guided Vehicle)引导技术的优缺点,并结合java环境搭建的教程,尤其是myeclipse10、jdk1.8和tomcat8的集成配置。文章还提及了一篇关于磁导式AGV自动导航车控制系统设计的硕士学位论文,该论文由王瑾垡撰写,主要研究AGV的控制系统设计。" 在AGV技术中,引导方式是决定其自主运行的关键因素,不同工作环境对AGV的导航技术有不同的需求。表1.1列举了各种AGV引导技术的优缺点,尽管具体内容未给出,但通常包括激光导航、磁条导航、视觉导航、二维码导航等多种方式。激光导航具有较高的精度和灵活性,但成本较高;磁条导航则相对简单且成本低,但路线固定不易更改;视觉导航依赖于摄像头,适应性强但对环境光线和标志物清晰度要求高;二维码导航易于部署,但可能受环境干扰。 在Java开发环境中,myeclipse10是一个集成开发环境,它支持java项目的创建、编辑和调试。配合jdk1.8,开发者可以编写和运行Java 8及以下版本的代码。而tomcat8是一个流行的Java应用服务器,用于部署和运行Java Web应用程序。myeclipse10与jdk1.8和tomcat8的集成,是Java Web开发的基础,确保开发者能够在本地环境中顺利地进行开发、测试和部署。 王瑾垡的硕士学位论文聚焦于磁导式AGV自动导航车的控制系统设计,磁导式导航是一种常见的AGV导航技术,通过在地面上铺设磁条或磁钉,AGV通过检测这些磁场信号来确定其位置和方向。这种技术的优点在于安装方便、成本适中,但对磁条的维护要求较高,且路径变更较为困难。 论文详细阐述了该控制系统的设计,可能涵盖了硬件选型、传感器集成、导航算法实现、通信协议设计以及软件架构等内容,旨在提高AGV的导航性能和系统稳定性,以满足工业生产中的柔性化和自动化需求。作者对控制系统进行了深入研究,以提升AGV在物流领域的应用效果。 这篇资源结合了理论知识和实际开发经验,对于理解AGV技术及其在实际环境中的应用,以及Java开发环境的搭建,都提供了宝贵的信息。同时,王瑾垡的硕士论文为深入研究AGV控制系统设计提供了参考。
153 浏览量

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 上传

给这段代码加上注释 //计算AGV矩形轮廓路径 计算角点:利用车头正方向的夹角差值计算车的四个角度 QPainterPath path; double carWidth =m_para.width; double carLength =m_para.length; double carAngle =m_attri->angle/100; double angle = atan((carWidth)/(carLength));//夹角差值 double length = sqrt(pow(carWidth,2)+pow(carLength,2))/2;//对角线长度的一半 //计算AGV外接矩形轮廓路径 /m_boundPath //矩形的四个顶点存储在m_agvRectPoints中,绘制AGV锁定区域需要用到m_agvRectPoints QPointF pointRT = calLinePath(path,length,carAnglePI/180+angle,true);//右上角 m_agvRectPoints[0]=pointRT; QPointF pointRB = calLinePath(path,length,carAnglePI/180-angle);//右下角--头 m_agvRectPoints[1]=pointRB; QPointF pointLB = calLinePath(path,length,carAnglePI/180+angle+PI);//左下角--尾 m_agvRectPoints[2]=pointLB; QPointF pointLT = calLinePath(path,length,carAnglePI/180-angle+PI);//左上角--尾 m_agvRectPoints[3]=pointLT; path.closeSubpath(); m_path = path; //计算AGV锁定矩形轮廓路径 /m_trackPath QPainterPath trackPath; double tracklength = sqrt(pow(carWidth+carWidth/2.0,2)+pow(carLength+carLength/2.0,2))/2;//对角线长度的一半 //agv锁定矩形随agv旋转 --MYJ 2021.12.14 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle), true);//右上角 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle));//右下角--头 calLinePath(trackPath, tracklength, -(carAnglePI / 180 + angle + PI));//左下角--尾 calLinePath(trackPath, tracklength, -(carAnglePI / 180 - angle + PI));//左上角--尾 trackPath.closeSubpath(); m_boundaryPath = trackPath;

105 浏览量

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 < 3) { // 最多等待 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->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 << endl; } else { std::cout << "task_id-" << task.id << "No available AGV!" << endl; } } },修改爲黨沒有可用小車的時候直接退出

2023-05-24 上传