AGV调整Matlab实现

% 用二维数组代替地图和场地信息 
% 可用场地:0
% 小车本身:1
% 货物点及入库点:2
% 地图边界: 100
% AGV出发区:11
% 监测区:12
% 充电区:13
% 生产区A1、A2:14
% 生产区B3、B4、B5:15
% 仓库1、4: 16
% 仓库2、3:17

% 注:以下坐标均在matlab的map矩阵中表示,下标是从[1,1]开始
% 需要注意一个问题 平常的x-y轴坐标表示方法与matlab的矩阵表示方法相反
% 四个入库点  入库A [4,16] [27,16] 入库B [16,4] [16,27] 

%  基本假设:
% (1)AGV 的行驶速度为匀速;
% (2)AGV 在转弯时的用时固定;
% (3)AGV 从货架上叉取货物的用时固定;
% (4)AGV 从自身储位上放货物的用时固定;
% (5)不考虑 AGV 自身启动和制动对速度的影响;
% 定义:小车移动一个格子的时间为1s,转向花费的时间为1s
%      小车到达取货点时取货时间1s 卸货时间1s
global UnitTime TurningTime
global PickUpTime
global DrapTime
UnitTime = 1;  TurningTime = 1;
PickUpTime = 1;  DrapTime = 1;

%% 地图初始化
[AGVMapSize, AGVMap] = mapInit();

%% 向地图中添加场地信息 -- 出发区、充电区、生产地、仓库、监测区
AGVMap = addMapVenue(AGVMap);

%% 任务分配采用随机任务分配策略
x = rand(1,12) * (4-1) + 1; % 12个任务随机分配给3辆小车
%% 向地图中添加小车及货物信息 -- 3辆小车、12个货物、4个入库点

% 注:更改小车点和货物点后需要在函数addMapGoods、函数judgeCargoShelves、函数mapPlot里面进行对应修改
[AGVInitCoorPoint, AGVStartPoint, storageA, storageB, AGVMission, AGVMap] = addMapGoods(AGVMap, x);

AGVTime = [0;0;0]; % 记录三辆小车的总任务时间
numAGV = 3;
AGVPath = cell(1,numAGV);  % AGV的初始化路径矩阵
maxRow = max([size(AGVMission{1},1), size(AGVMission{2},1), size(AGVMission{3},1)]); % 获取小车中的最大任务数
% AGVPath的第一列和第二列表示规划路径的横纵坐标
% 第三列表示是否发生转弯 0代表未发生转弯 1代表在此节点上发生了转弯
% 第四列表示花费总时间
% 第五列表示是空载还是负载 0代表空载 1代表负载低优先级任务 2代表负载高优先级任务
% 第六列表示是发生冲突的类型 1代表相交节点冲突 2代表相向节点冲突 3代表相向冲突
% 另注:如果小车不去对应的货物点取货,那么那个取货点对他来说一直是一个障碍物,卸货点也是一样的设置方式

for i = 1:maxRow
    for j = 1:numAGV
        % 执行顺序:小车1的任务1,小车2的任务1,小车3的任务1,小车1的任务2,小车2的任务2...
        if i > size(AGVMission{j},1)
            continue
        else
            fprintf('开始第%d个小车的第%d个货物的轨迹规划\n', j, i)
            % 对应的小车去对应的货物取货
            isTake = 1; % 是否取货
            isSave = 0; % 是否卸货
            start = AGVStartPoint(j,:);
            goal = AGVMission{j}(i,:);
            travelTime = AGVTime(j);
            % 取货最优路径
            AGVMap(goal(1), goal(2)) = 0; % 将目标货物点设置为可用场地
            [AGVpickUpPath, ~, travelTime] = Astar(start, goal, AGVMapSize, AGVMap, 0, isTake, isSave, travelTime);
            AGVPath{j} = [AGVPath{j};AGVpickUpPath]; % 将路径存储到路径矩阵中
            AGVMap(goal(1), goal(2)) = 1; % 将目标货物点设置为不可用场地

            % 卸货路径
            start = goal;
            travelTime = travelTime + PickUpTime;  % 取货时间1s 
            % 判断货物对应的货架
            [goal1, goal2] = judgeCargoShelves(start, storageA, storageB);
            AGVMap(goal1(1), goal1(2)) = 0; % 将目标卸货点设置为可用场地
            AGVMap(goal2(1), goal2(2)) = 0; % 将目标卸货点设置为可用场地

            % 判断此时任务点离哪一个入库点更近 进行卸货
            isTake = 0;
            isSave = 1;
            tmpTime = travelTime;
            [AGVUnLoadPath1, ~, travelTime1] = Astar(start, goal1, AGVMapSize, AGVMap, 0, isTake, isSave, tmpTime);
            [AGVUnLoadPath2, ~, travelTime2] = Astar(start, goal2, AGVMapSize, AGVMap, 0, isTake, isSave, tmpTime);
            if travelTime1 < travelTime2
                AGVPath{j} = [AGVPath{j};AGVUnLoadPath1]; % 将路径存储到路径矩阵中
                travelTime = travelTime1;
                start = goal1;
            else
                AGVPath{j} = [AGVPath{j};AGVUnLoadPath2]; % 将路径存储到路径矩阵中
                travelTime = travelTime2;
                start = goal2;
            end  
            travelTime = travelTime + DrapTime;  % 卸货时间1s
            AGVMap(goal1(1), goal1(2)) = 1; % 将目标卸货点设置为不可用场地
            AGVMap(goal2(1), goal2(2)) = 1; % 将目标卸货点设置为不可用场地

            AGVTime(j) = travelTime;
            % 如果已经执行完最后一个任务,则回到原始出发点
            if i == size(AGVMission{j},1)
                isTake = 1; 
                isSave = 0; 
                travelTime = AGVTime(j);
                goal = AGVInitCoorPoint(j,:);
                [AGVpickUpPath, ~, ~] = Astar(start, goal, AGVMapSize, AGVMap, 0, isTake, isSave, travelTime);
                AGVPath{j} = [AGVPath{j};AGVpickUpPath]; % 将路径存储到路径矩阵中
                AGVMap(goal(1), goal(2)) = 1; % 将静止的小车视为一个障碍物
            else
                % 此时代表一次任务完成,开始执行下一个小车的任务
                AGVStartPoint(j,:) = start; % 更新出发点
            end
        end
    end
end

    % 对路径进行预处理 -- 对回到初始位置的小车置为高优先级,避免发生碰撞
    AGVPath = preProcessing(AGVPath);
    
    % 时间窗算法 规划出多AGV无冲突的路径
    [AGVPath, sumTime] = timeWindow(AGVPath, AGVMap);
    
    % 对时间窗算法规划后的路径进行处理 -- 细分路径和补齐长度
    AGVPath = finalProcessing(AGVPath);
    
    %  动态展示绘图效果
    % 开始绘图
    mapPlot(AGVPath, 1);
    fprintf('总花费时间为%d秒\n', sumTime)


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/166479.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C百题--7.输出乘法表

1.问题描述 输出9*9乘法表 2.解决思路 利用99乘法表行和列之间的关系&#xff0c;进行输出 注意&#xff1a;%-2d 2代表占两个字符&#xff1b;-代表左对齐 3.代码实现 #include<stdio.h> int main(){for(int i1;i<9;i){for(int j1;j<i;j){printf("%d*%d…

微信小程序埋点

使用如下代码封装一下&#xff0c;例如封装在log.js文件里面&#xff1a; var log wx.getRealtimeLogManager ? wx.getRealtimeLogManager() : nullmodule.exports {debug() {if (!log) returnlog.debug.apply(log, arguments)},info() {if (!log) returnlog.info.apply(l…

深入学习pytorch笔记

两个重要的函数 dir()&#xff1a; 一个内置函数&#xff0c;用于列出对象的所有属性和方法 help()&#xff1a;一个内置函数&#xff0c;用于获取关于Python对象、模块、函数、类等的详细信息 Dateset类 Dataset&#xff1a;pytorch中的一个类&#xff0c;开发者在训练和…

抖音电商品牌力不足咋办?如何升级或强开旗舰店、官方旗舰店?我们有妙招!

随着抖音电商的发展&#xff0c;越来越多的商家蜂拥而至&#xff0c;入驻经营抖音小店... 然而我们在开店的时候&#xff0c;选择开通官方旗舰店、旗舰店、专营店或专卖店&#xff0c;却被系统提示为你的商标品牌力不足&#xff0c;无法开通官方旗舰店、旗舰店、专营店、专卖店…

Android手电筒、闪光灯、torch、flash

1. 仅开启手电筒 单纯的开启手电筒我们可以使用CameraManager的.setTorchMode()方法。 cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE)获取该相机特征是否可获取闪光灯。 CameraManager cameraManager (CameraManager) getSystemService(CAMERA_SE…

在 vscode 中的json文件写注释,不报错的解决办法

打开 vscode 的「设置」&#xff0c;搜索&#xff1a;files: associations&#xff0c;然后添加 *.json jsonc最后

Nginx 配置错误导致的漏洞

目录 1. CRLF注入漏洞 Bottle HTTP头注入漏洞 2.目录穿越漏洞 3. http add_header被覆盖 本篇要复现的漏洞实验有一个网站直接为我们提供了Docker的环境&#xff0c;我们只需要下载下来就可以使用&#xff1a; Docker环境的安装可以参考&#xff1a;Docker安装 漏洞环境的…

Docker rm 命令

docker rm&#xff1a;删除一个或多个容器。 语法&#xff1a; docker rm [OPTIONS] CONTAINER [CONTAINER...]OPTIONS说明&#xff1a; -f&#xff1a;通过SIGKILL信号强制删除一个运行中的容器。 -l &#xff1a;移除容器间的网络连接&#xff0c;而非容器本身。 -v &…

2023亚太杯数学建模A题思路代码分析

已经完成A题完整思路代码&#xff0c;文末名片查看获取 A题就是我们机器学习中的一个图像识别&#xff0c;他是水果图像识别&#xff0c;就是苹果识别的一个问题&#xff0c;我们用到的方法基本是使用深度学习中的卷积神经网络来进行识别和分类 问题一&#xff1a;基于附件1中…

展现天津援疆工作成果 “团结村里看振兴”媒体采风团走进和田

央广网天津11月19日消息(记者周思杨)11月18日&#xff0c;由媒体记者、书法和摄影家、旅行社企业代表等40余人组成的“团结村里看振兴”媒体采风团走进新疆和田。在接下来的一周时间里&#xff0c;采风团将走访天津援疆和田地区策勒县、于田县、民丰县乡村振兴示范村&#xff0…

HTML CSS登录网页设计

一、效果图: 二、HTML代码: <!DOCTYPE html> <!-- 定义HTML5文档 --> <html lang="en"> …

在全球碳市场中崭露头角的中碳CCNG

在全球气候治理的大背景下&#xff0c;中国碳中和发展集团有限公司&#xff08;简称中国碳中和&#xff09;正在成为全球碳交易市场的一个重要参与者。随着国际社会对碳排放的日益关注&#xff0c;中国碳中和凭借其在碳资产开发、咨询与管理等领域的深厚积累&#xff0c;正成为…

acedInitGet 函数

acedInitGet 函数是 AutoCAD 的 C++ API(ObjectARX)中用于初始化下一次用户输入操作选项的函数。以下是该函数签名及其组成部分的中文翻译和解释: extern "C" int acedInitGet(int val,const ACHAR * kwl );cpp 复制 extern “C”:指定函数使用 C 语言链接(lin…

LeetCode93. Restore IP Addresses

文章目录 一、题目二、题解 一、题目 A valid IP address consists of exactly four integers separated by single dots. Each integer is between 0 and 255 (inclusive) and cannot have leading zeros. For example, “0.1.2.201” and “192.168.1.1” are valid IP add…

视频剪辑新招:批量随机分割,分享精彩瞬间

随着社交媒体的普及&#xff0c;短视频已经成为分享生活、交流信息的重要方式。为制作出吸引的短视频&#xff0c;许多创作者都投入了大量的时间和精力进行剪辑。然而&#xff0c;对于一些没有剪辑经验的新手来说&#xff0c;这个过程可能会非常繁琐。现在一起来看云炫AI智剪批…

杨传辉:从一体化架构,到一体化产品,为关键业务负载打造一体化数据库

在刚刚结束的年度发布会上&#xff0c;OceanBase正式推出一体化数据库的首个长期支持版本 4.2.1 LTS&#xff0c;这是面向 OLTP 核心场景的全功能里程碑版本&#xff0c;相比上一个 3.2.4 LTS 版本&#xff0c;新版本能力全面提升&#xff0c;适应场景更加丰富&#xff0c;有更…

web前端之若依框架图标对照表、node获取文件夹中的文件名,并通过数组返回文件名、在html文件中引入.svg文件、require、icon

MENU 前言效果图htmlJavaScripstylenode获取文件夹中的文件名 前言 需要把若依原有的icon的svg文件拿到哦&#xff01; 注意看生成svg的路径。 效果图 html <div id"idSvg" class"svg_box"></div>JavaScrip let listSvg [404, bug, build, …

02 如何快速读懂一个C++程序

系列文章目录 02 如何快速读懂一个C程序 目录 系列文章目录 文章目录 前言 一、C 的基本语法 二、如何看懂一个c程序&#xff1f; 1.了解程序结构 2.C 中的分号 & 语句块 3.C 注释 总结 前言 C 是一种高级编程语言&#xff0c;它具有丰富的特性&#xff0c;用于…

CentOS7安装Docker运行环境

1 引言 Docker 是一个用于开发&#xff0c;交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开&#xff0c;从而可以快速交付软件。借助 Docker&#xff0c;您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付&#xff0c;…

11.前缀和、异或前缀和、差分数组练习题

前缀和 前缀和可以用来求满足条件的子数组的和、个数、长度 更多前缀和题目&#xff1a; 560. 和为 K 的子数组 974. 和可被 K 整除的子数组 1590. 使数组和能被 P 整除 523. 连续的子数组和 525. 连续数组 560. 和为 K 的子数组 中等 给你一个整数数组 nums 和一个整数…