苏宁 11.11:仓库内多 AGV 协作的全局路径规划算法研究

本文为『InfoQ x 苏宁 2018双十一』技术特别策划系列文章之一。

1. 背景

随着物联网和人工智能的发展,越来越多的任务渐渐的被机器人取代,机器人逐渐在发展中慢慢进入物流领域,“智能叉车”,AGV(Automated Guided Vehicle,自主导航车)的出现不仅大大降低了人工成本,还在提升效率,面对海量订单拣选时候有不错的表现。在实际应用中,一个仓库内多个AGV协作完成订单是不可或缺的部分,而且多个AGV共同运输的过程中同时进行路径规划需要一定的算法做支撑,本文在一个仓库内多个AGV协作进行路径规划的方向上进行算法的研究,对其原理和实现进行分析和介绍。

2. 分析

首先,我们的背景设置在物流仓库,针对仓库中常见的入库、拣货、出库等具体的任务细节进行分析,来了解我们AGV所面临的场景。

传统的方式一般采用静止的货架,入库时将商品运输到指定货架前,人工上架入库,拣货时人工去到指定的货架拣选订单对应的商品打包出库,引入AGV之后,模式将发生改变,我们会在仓库规划指定的入库区、拣选区,AGV会将包含订单的货架动态地运输到拣选区,排队等待人工或者机械臂拣选到指定的订单拣选筐内打包出库,完成拣选后将货架运输至指定位置。

所以,引入AGV之后,我们面临的问题是为了最大限度的提高效率,多个AGV如何避免拥堵和碰撞,如何对每个AGV规划出更好的行走路线,怎样才能让每个AGV花最小的代价,完成更多的任务,将是此文讨论的重点。

3. 问题拆解

要使得多个机器人在道路规划上最优,无非是在单个小车规划路径时考虑其他小车的行驶路线,进而选取最优的一个行驶方案。另外,不同于室外场景,我们在仓库中规划小车路径,整个道路都是可以设计的,所以我们的问题可拆解为:

(1)\t仓库中道路的设计;
(2)\t获取到其他小车的路径行驶状态;
(3)\t定义可能的道路拥堵;
(4)\t规划最短路径;
(5)\t交通管制。

3.1 仓库中的道路设计

一些常见的道路设计如图1和图2,根据实际的应用场景来布局,考虑的因素包括仓库的结构,商品的种类等,根据实际测试或模拟来选取最优的设计。

\"image\"
图1. V字型道路设计

\"image\"
图2. 井字型道路设计

3.2 获取到其他小车的路径行驶状态

要做到全局路径规划,必须得到每一个时刻小车的位置和运行状态,所以必须和小车建立起稳定的通信系统,一般采用无线局域网的方式,用TCP建立连接,选取合适的WIFI通道来保证小车和全局路径规划系统的通信的稳健。

3.3 定义可能的道路拥堵

在仓库的道路规划完成之后,首先要考虑的因素是可能的道路拥堵情况,一般小车在仓库中都是直线行走,需要转弯时要停在原地,原地旋转90°或180°之后继续直线行走,所以每个转弯都有机会造成当前道路拥堵。另外,同一条道路车流量较大时,也会造成道路拥堵,加上路口会车的情况,主要造成道路拥堵的有转弯、会车和车流量较大3种常见的可能情况。

3.4 规划最短路径

最短路径规划是全局路径规划的核心,要从地图上的一个位置到达另一个位置,在中间有障碍物以及考虑到可能的道路拥堵情况,必须使用一个路径搜索算法来寻找从初始点到目标点的一条最短路径,常见的搜索路径的算法有广度优先算法、深度优先算法、Dijkstra算法、A*算法等,广度优先算法和深度优先算法适用于树形结构求解最短路径或最小权重的场景,环状结构求解最短路径一般采用Dijkstra算法,A*算法是静态路网中求解最短路径最有效的直接搜索方法。

每一种算法都有其应用场景,对于我们全局路径规划的场景,我们的地图更容易转换成栅格地图,而A*算法在栅格地图上搜索最短路径有明显的优势,而且方便于修改加上我们道路拥堵场景的考量,所以我们以A*算法为首选最短路径算法,进而分析实现全局路径规划。

3.5 交通管制

交通管制主要应用于会车和并流场景,一方面为了避免车辆碰撞,另一方面路口会车比较常见,处理不好会导致车辆死锁,车辆相互等待,进而导致任务无法完成,也是全局路径规划的核心算法,常见的会车场景如图3。

\"image\"
图3. 路口会车

4. 核心算法实现

路径规划算法的核心主要在于最短路径的规划和交通管制,这里将对一种最短路径规划算法和交通管制算法进行算法剖析,进而设计出一套完整的全局路径规划算法。

4.1 A*算法规划最短路径

A*算法类似于图论中寻找最优树,通常是通盘考虑选择某一路径的路径耗费,在所有可通过的路径中总有一条路径相对于其他任何可通行的路径来说是耗费最少的。在图论中寻找最佳路径时每一条的路径耗费是已知且固定的,但在用A*算法求解最佳路径时,沿着不同的路径前进,尽管是同一节点但其耗费可能是不同的,这便是启发式寻路的精髓。

运用此方式时,首先将实际问题抽象出来,用矩阵的形式表示问题中的各元素,包括起点位置,目标点位置,以及出现的障碍物。我们会逐渐地发现在寻路方面都是将实际问题抽象地用矩阵表示,之后通过对矩阵的操作模拟实现寻路过程。

其基本思想是以起点为中心,其周围紧邻的8个点都通过指针指向它,在其周围点内选择最佳路径点并以它为中心点将其还未建立指针联系的周围点(可行的,这在后文中解释)通过指针指向它,并选择最佳路径点再以此点为中心寻路直到寻找到点的周围点中有目标点,这样寻找的路径就通过指针一一连接起来了,最后通过输出这些点就是寻找的路径了。

下文主要通过以下几个方面来逐步分析A*算法的寻路过程:

(1)\t将实际问题抽象化为矩阵表示

抽象出的矩阵如图4,其中绿色区域表示起始点,红色区域表示目标点,中间蓝色区域表示障碍物(如不可通过的高山或是河流),黑色区域表示可产生路径的区域。

(2)\t以起点为中心寻找到下一节点

如图5所示,以起点为中心与之紧密相邻的8个点是其所寻路径上可到的下一点,且都以指针的形式将中间当前点作为与其紧邻的周围点的父节点。对于这8个点,应该选择哪一点作为寻路的下一个起点呢,A*算法中建立了两个列表,一个为开启列表(用于存储所有当前点的可到点(除去已经在关闭列表中的点、障碍物点)),另一个为关闭列表(里面存储已经到过的点,已经在关闭列表中的点在下一次寻路的过程中是不会再次检查的,这也说明寻路的线路不会有相交的可能)。

\"image\"
图4

\"image\"
图5

(3)\t选择下一节点

将起点加入关闭列表,在以后的寻路过程中不再对其进行检查,接下来就是在这8个点中选择一个作为下一路径点,选择的原则是在其中寻找路径耗费最小的节点,

其权值用F表示,F=G+H

其中G表示从起点开始,沿着产生的路径,移动到指定方格上的路径耗费;如图6所示,以起点为中心其紧邻周围点有上下左右、对角线方向上的8个点,以上下左右移动路径耗费为10,对角线耗费为 $ \\sqrt{2} \\times10$,约为14。

其中H表示从路径所在的当前点到终点的移动路径耗费,计算方法为当前点到目的点之间水平和垂直的方格的数量总和,然后把结果乘以10。

从图7可以看出,起始点右边点的权值F最小,故将其作为下一路径点。

\"image\"
图6

\"image\"
图7

(4)\t继续搜索

把路径点从开启列表中删除,并添加到关闭列表中。检查与此点紧邻的8个点(忽略在关闭列表中或者不可通过的点),把他们添加进开启列表,如果存在还有点没有添加进开启列表,则将路径点作为此类点的父节点并添加进开启列表。

如果所有可行的紧邻点已经在开启列表中,对每一紧邻点检查目前这条路径到是否比上一路径点到这一紧邻点的路径耗费要小,如果不是则什么都不用做(如图8所示)从原始起点到其紧邻的右下方的点,按照新产生路径G值:G1=10+10=20,而原始路径G值G2=14,即新产生路径的G值比原始路径的G值大,而它们的H值相同(为同一点)故原始路径的F值比新产生路径的F值要小,不做任何处理,继续下一步寻路。如果是,那就把相邻方格的父节点改为目前选中的方格,说明新产生的路径的移动耗费更小。

\"image\"
图8

(5)\t重复上一搜索过程直至结束

搜寻过程结束分为两种情况:一种是目标点加入关闭列表,搜索正常结束,找到路径。另一种情况是目标点未找到但开启列表已经为空,意味着没有找到从起始点到目标点的路径,搜索结束。

搜索过程如图9所示,从中可以看出从起点到目标点之间有指针指向一致的一条路径,这便A*算法是搜寻到的路径。在路径点上添加红色点突出显示,此即为从起始点到终点的一条路径。

\"image\"
图9

整个寻路过程整理如下:

  1. 起始格加入开启列表;
  2. 重复如下的工作:
    a. 寻找开启列表中F值最低的点。我们称它为当前点;
    b. 把它加入关闭列表;
    c. 对紧邻的8格中的每一点
    • 如果它不可通过或者已经在关闭列表中,略过它。反之如下:
    • 如果它不在开启列表中,把它添加进去。把当前点作为这一格的父节点。记录这一点的F、G和H值;
    • 如果它已经在开启列表中,用G值为参考检查新的路径是否更好。更低的G值意味着更好的路径。如果是这样,就把这一点的父节 点改成当前点,并且重新计算这一点的G和F值。改变之后需要重新对开启列表按F值大小排序。如果不是则不需要做后面改变指针指向并重新计算G、F值的工作;
  3. 停止搜索,分为两种情况:
    • 当目标点添加入了关闭列表,这时候路径被找到,搜索正常结束;
    • 没有找到目标点,但开启列表已经空了,此时未找到合适的路径,搜索结束;
  4. 保存路径。从目标点开始,沿着每一点的指针指向移动,直到回到起始点,输出路径。

4.2 基于锁格机制的交通管制

车辆道路规划完成后,多个小车同时开始行走,多条道路小车会车的情况不可避免,会车时候车辆主要会出现跟随,相向而行,十字路口或丁字路口的情况,跟随的时候车辆前方会有传感器避免跟随碰撞,为了避免十字路和丁字路会车碰撞,会车时候采取锁格的方式,即:

(1)\t每辆小车行走一步,将前面即将行走的两步的点锁住;
(2)\t小车锁格时发现即将锁的地图的点已经被锁住,则两车协商看哪个优先级高,哪辆车先行,另一辆车停车等待;
(3)\t小车走过之后将解锁,等待的时候可以重新锁住即将行驶的点,继续往前行走;
(4)\t循环一直每一步都进行锁格操作。

4.3 全局路径规划

在规划当前小车路径时,要在考虑到道路拥堵的情况下去规划最短路径,以满足整体规划结果最优,使用A*算法,用G值为参考检查新的路径是否更好, 将地图中其他小车规划的路径的点的G值增加,即可尽量避免搜索到相同的路径,同样的道理,在车辆需要转弯的时候,也同样增加转弯下一点的G值,从而规划路径尽量避免转弯的情况出现,来达到整体效率最高,全局路径最优。
此外,由于路径规划都是静态规划的路径,车辆在行走过程中同时需要对每辆小车进行锁格的交通管制,来保证车辆不会相撞。

5. 总结

本文主要对仓库内多AGV协作的全局路径规划进行了研究,并介绍了一种可能的实现算法方案,从仓库中道路的设计,拥堵的考量等角度简单全局路径规划需要考虑的维度,对最短路径规划和交通管制策略进行的详细的分析和应用设计。

作者:董效成,苏宁易购IT总部人工智能研发中心技术经理,负责机器人项目任务匹配和路径规划算法工作。有多年的机器人算法开发经验,对轮式机器人的运动控制,路径规划等算法有深刻的理解,有丰富的机器人操作系统(ROS)开发实践经验。

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

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

相关文章

用python绘制玫瑰花的代码_python也能玩出玫瑰花!程序员的表白代码

有些情侣是异地恋,情人节想送朵玫瑰花给女朋友都困难。别担心,用Python就好了,互联网时代的恋爱神器!接下来就让我们一起来看看如何用Python变出玫瑰花的。 1、首先我们导入画图工具turtle,即import turtle 2、导入画图…

Springboot 整合 swagger

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_40254498/article/details/83622098 swagger 主要是为后端服务的接口文档,懒人必备,swagger就是一款让你更好的书写API文档的框架。 其他的框架…

Project为项目设置预算

假设项目预算10万元,如果项目完成后,花费没有超过10万元,则成本管理是成功的,如果花费了11万,则超过了预算。 预算是10万,一般目标成本设得比预算成本低,比如9.5万。在项目实施过程中&#xff…

activiti7流程设计器_变频空调器通信电路

通信电路由室内机和室外机主板两个部分单元电路组成,并且在实际维修中该电路的故障率比较高,因此单设--节进行详细说明。第三章变频空调器单元电路对比和通信电路第二节通信电路通信电路由室内机和室外机主板两个部分单元电路组成,并且在实际…

PyCharm 中为 Python 项目添加.gitignore文件

文章目录 1.安装.ignore插件 2.在项目中添加.ignore文件 1.安装.ignore插件 在pycharm编译器中,依次点击File->Setting 在跳出Setting的页面中,执行如下操作: 点击左侧的Plugins, 在搜索框中输入.ignore 点击右侧的install 点…

mysql的分页查询

为什么80%的码农都做不了架构师?>>> order by case when 的用法(实现特殊情况的排序,如leader1的排最前面): select * from m_worker_project order by CASE WHEN leader 1 THEN 100 ELSE 1000 END 项目中…

.describe() python_python的apply应用:一般性的“拆分-应用-合并”,附加详细讲解

跟aggregate一样,transform也是一个有着严格条件的特殊函数:传入的函数只能产生两种结果,要么产生一个可以传播的标量值(如np.mean),要么产生一个相同大小的结果数组。最一般化的GroupBy方法是apply,apply会将待处理的…

DNS服务(4)Slave DNS及高级特性

为了简化运维人员的负担,使用Master/Slave DNS架构的情况比较好,现在我们来简单叙述一下Master/Slaver DNS的特点主DNS服务器:维护所负责解析的域内解析库服务器;解析库由管理员维护;从DNS服务器:从主DNS服务器或其它的…

think python下载 中文版开源!这或许是最经典的编程教材

《Think Python》是很多Python初学者的不二入门教材,受到广泛好评。该书原作者是美国Olin工程学院的教授Allen B. Downey,目前该书的原版和中文版本都已免费开源。 中文版本译者是一名自学Python的编程爱好者。选择翻译《Think Python》,一是…

datatable的数据进行组内排序_排序算法学习分享(四)希尔排序

排序,也称为排序算法,可以说是我们学习算法的过程中遇到的第一个门槛,也是实际应用中使用得较为频繁的算法,我将自己对所学的排序算法进行一个归纳总结与分享,如有错误,欢迎指正!排序算法学习分…

jupyter notebook 安装代码提示功能

效果 安装成功后,输入部分代码,按 tab 键,会提示代码 安装步骤 1.安装nbextensions 从国内的pip镜像下载快 pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com jupyter_contrib_nbextensions jupyter contr…

python需要配置环境变量吗_python为什么会环境变量设置不成功

学习python编程,首先要配置好环境变量。本文主要讲解python的环境变量配置,在不同版本下如何安装 Windows 打开Python官方下载网站 https://www.python.org/downloads/release/python-370/ x86:表示是32位电脑 x86-64:表示是64位电脑 目前Python版本分为…

一维数组、二维数组、三维数组、四维数组、多维数组的理解

以图书馆来举例 一维数组是一条线 二维数组是一页纸 三维数组是一本书 四维数组是书架 五维数组是图书室2201(好几个书架) 六维数组是图书馆某一层,2楼/3楼,好几个图书室 七维数组是整个图书馆 第N维数组是宇宙..................…

在资源使用状况视图中查看资源的负荷情况

只有工时类资源才会出现过度分配,因为工时类资源通常指组织内部的人力资源或者机械设备等,这些资源通常都有数量上的瓶颈,也只有工时类资源才会在【资源工作表】中设置它的最大单位和资源可用性,这就限制了它在不同时间段内的可用…

python常用单词自由且开放_python常用英语单词词汇 unit7

1. Darcula IntelliJ IDEA自带的黑色主题名称,Android Studio是基于IntelliJ IDEA的。 2. Appearance /prns/ n. 外观; 3. Custom /kstm/ n. 习惯; 4. UI abbr. 用户界面(user interface) 5.Terminate /tmnet/ 终止、结…

2018.10.29-2018.11.4

简述osi七层模型和TCP/IP五层模型应用层OSI 参考模型中最靠近用户的一层,是为计算用户提供应用接口,也为用户直接提供网络服务。常见的应用层网络服务协议有:HTTP,HTTPS,FTP,POP3,SMTP等表示层表示提供各种用于应用层数据编码和转换功能&…

CSV文件转Excel后数字自动转换成科学计数法的解决方法

CSV文件用Excel打开后,长度超过11位的数字自动转换成科学计数法显示,末尾数字变成“0000”,如何解决这一问题? 以“老劳模系统数据.CSV”为例,身份证码是科学计数法了 第一步:新建excel,用 off…

python 小说 云_python小说网站

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python爬虫之小说网站--下载小说(正则表达式)思路:1. 找到要下载的小说首页,打开网页源代码进行分析(例:htt…

6.6(java学习笔记)文件分割(IO综合例子)

基本思路: 文件分割:将一个文件分割成若干个独立的文件。 设置分割后小文件文件的字节数,然后读取被分割文件, 将对应的字节数写入分割后的小文件中。 使用seek定位下一次读取位置。 文件合并:将分割后的若干的文件合并…

小米MIUI关闭内容中心通知

被MIUI的内容中心打扰了许久,终于找到彻底关闭它的方式。 这个内容中心,在应用列表里找不到卸载,在通知管理里也找不到,小米把它藏得深。 关闭内容中心通知 第一步,先进入内容中心,然后切换到后台&#…