CAN总线通信在AGV控制系统中的应用——基于myeclipse+jdk1.8+tomcat8的环境配置

需积分: 45 120 下载量 142 浏览量 更新于2024-08-09 收藏 4.37MB PDF 举报
"这篇资源主要讲述了AGV控制系统方案的构建,特别是如何搭建基于Java环境的开发平台,包括MyEclipse10、JDK1.8和Tomcat8的配置。同时,提到了AGV系统中的CAN总线通信模块,讨论了CAN总线的优势以及选择PHILIPS公司的TJA1050作为CAN总线控制器的原因。该论文出自长沙理工大学,作者为王瑾垡,研究方向为信息检测处理,指导教师为廑童至熬援。" 正文: AGV(Automated Guided Vehicle)控制系统方案的设计是物流自动化领域的一个关键组成部分,它涉及到硬件选型和软件开发等多个方面。在本方案中,选择CAN(Controller Area Network)总线作为主控电路与磁采集电路之间的通信协议,是因为CAN总线具有高可靠性、实时性和灵活性。这些特性使得CAN总线能确保数据在传输过程中的安全性和准确性,尤其对于需要实时处理位置信号的AGV控制系统至关重要。 在CAN控制器的选择上,文章提到考虑了多种品牌,如INTEL、PHILIPS、MOTOROLA、NEC和SIUONI等。最终选择了PHILIPs公司的TJA1050,这主要是基于性价比的考量。TJA1050是一款高性能的CAN收发器,能够满足AGV控制系统对于高速、低延迟和抗干扰能力的需求。 软件开发环境的搭建是实现AGV控制系统功能的基础。本资源详细介绍了如何在Java环境下配置开发工具,包括使用MyEclipse10作为集成开发环境,搭配JDK1.8(Java Development Kit)作为编程语言的运行环境,以及Tomcat8作为应用服务器,用于部署和运行AGV控制系统的后台应用程序。MyEclipse10提供了丰富的Java开发工具和插件,JDK1.8提供了最新的Java语言特性和性能优化,而Tomcat8则是一个广泛使用的轻量级应用服务器,适合部署Web应用。 通过这样的软硬件结合,AGV能够根据磁采集电路反馈的位置信息,实时计算出小车的实时位置偏差,并据此进行路径调整。这种设计提高了AGV的自主导航能力和系统的整体效率。在实际操作中,开发者需要利用Java编写控制算法,结合CAN通信协议,实现AGV与周边设备的有效交互。 该资源详细阐述了AGV控制系统的设计思路,包括硬件选择和软件开发环境的搭建,为AGV技术的研究者和开发者提供了实践指导。通过这个方案,可以为AGV的精准定位和高效运行打下坚实基础,进一步推动物流自动化领域的创新和发展。
2023-06-13 上传

给这段代码加上注释 //计算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;

2023-06-13 上传

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)); } },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; } } },添加代碼:繪製直綫agv從path獲取的行駛路綫

2023-05-26 上传