【文献阅读】基于Voronoi图的探索

近期查找UAV在未知环境中的协同探索,很多文章中提出了Voronoi图的方法,因此查找了一篇关于Voronoi的文章2020-IEEE Transactions on Vehicular Technology-Voronoi-Based Multi-Robot Autonomous Exploration in Unknown Environments via Deep Reinforcement Learning,下面是我对本文的一些内容记录,以便后续学习

目录

         一、摘要

二、主要内容

1. Contributions

2. 技术背景

A. 通信网络

B. Voronoi分区

C. 避免碰撞问题的表述

3. 协同探索策略

A. 分层控制结构

B. 探索robots的协同算法

C. 算法伪代码分析

         三、总结


一、摘要

本文提出了一种新的多移动robots协同探索策略

设计了一种包含高层决策层和低层目标跟踪层的分层控制体系结构

提出的合作勘探方法使用动态Voronoi分区开发→最大限度地减少重复的勘探区域

针对未知环境中的突发障碍,提出了一种基于深度强化学习的综合避撞算法

二、主要内容

深度强化学习技术需要全面了解环境(例如,障碍物的大小和位置)和机器人平台(例如,机器人的精确数学模型),在提前获得较少工作区域信息的情况下,有可能实现安全导航

本文旨在为分散的协同多robots设计一种有效的自主探索策略,同时避免突然观察到的障碍

1. Contributions

1)开发了一种基于Voronoi的探索策略,以有效地协调多robots团队对未知区域的探索。基于Voronoi动态分区,为每个robot分配不同的目标位置,以避免重复探测区域

2)提出了一种基于深度学习的避障算法来引导robots到达目标。该方法使控制策略能够从人类演示数据中学习

3)通过轮式移动robots的实际实验验证了所提出的合作探索策略的可能性

2. 技术背景

A. 通信网络

加权无线信息图→节点,边,相关邻接矩阵

信息流动,两个节点之间的距离

如果每对不同的节点之间都有一条路径,则无向图是连通的

图中两个节点之间的最短路径距离是连接它们的最短路径上所有边的权值之和

B. Voronoi分区

Voronoi分区在可用的移动robots平台之间划分区域,其中每个Voronoi单元的质心被取为单个移动robot的位置

使用Voronoi分区,可以根据robots团队成员的当前位置动态划分待映射的区域

通过构造,Voronoi分区可以通过robots之间的通信以去中心化的方式实现

使用动态Voronoi分区,每个robot只需知道其邻居的位置即可计算其分区

由于Voronoi分区是动态生成的,因此团队可以根据新的邻居(不包含失败的robot)调整Voronoi分区配置

C. 避免碰撞问题的表述

自主智能体的避碰问题是在每个自主智能体在欧式平面上移动的上下文中定义的

3. 协同探索策略

A. 分层控制结构

提出了一种网络化robot放入两层控制体系结构,包括高层决策层和低层目标跟踪层

在第一层中,基于Voronoi分区和同步映射选择所需的下一个边界点

这些信息被发送到第二层进行跟踪,并使用深度强化学习神经网络训练robot到达所需位置的位置,同时避免潜在的障碍

B. 探索robots的协同算法

第一层提出的合作探测策略

为了标记探测区域,多车系统中的每个robot在探测环境时都部署了信息节点

这些部署的信息节点形成了一个信息网络,允许机器人以分散的方式共享信息

信息节点可以是真是的传感器设备,也可以是每个机器人同步映射中的虚拟目标

一旦将信息节点部署到某一位置,它将在被感知区域与无传感器覆盖的开放区域之间的边界上生成一些新的边界点

每个robot均可以共享该网络并且对信息图进行更新

基于相邻的robot的位置,生成一个Voronoi分区,只考虑自身Voronoi分区中的边界点进行下一个动作→有效地移除探索者所选择的不需要的边界点

公式:分配给robot R_{i}放入前沿节点k的效用函数 

 \chi→满足0\leqslant \lambda \leqslant 1的标量,决定搜索的方式:深度or广度

d_{ik}R_{i}与前沿节点k之间的距离 

\phi _{ik}→前沿节点kR_{i}初始位置之间的距离

 C. 算法伪代码分析

1. 如果Robot R_{i}在以半径为r_{s}的圆内发现信息节点→R_{i}在当前位置放置一个信息节点

2. 如果选择的前沿节点f_{R_{i}}为空

R_{i}使用最小定义边界点的效用函数函数搜索存在于自己Voronoi分区内的下一个前沿节点;

→将新搜索到的前沿节点设置为f_{R_{i}}

R_{i}开始沿着I_{i}^{t}中的最短路径移动到f_{R_{i}}

3. 如果R_{i}到达f_{R_{i}}R_{i}在该位置放置一个信息节点

   否则R_{i}继续移动直至到达​​​​​f_{R_{i}}

4. 上诉3步骤不断循环,直至每个信息节点都没有边界点→没有发现新的边界点

注:I_{i}^{t}→作为信息图It时刻的子图,由R_{i}可以观察到的节点集生成

前沿节点并不是信息节点,信息节点提前部署,前沿节点为信息节点定义中的新的边界点

该算法基于Voronoi分区寻找前沿节点,并不断更新前沿节点的集合,将所有处于Voronoi分区内的节点均加入到信息节点中

三、总结

该文章本人仅阅读了Voronoi分区部分,对于这个部分有些问题

首先是信息节点的部署→部署信息节点的标准

其次是针对Voronoi分区→通过算法类似于对已经分区,但是作者要实现的是动态分区,动态体现在什么地方,作者阐述为robot只要知道邻居的位置既可以进行动态分区,但是这种分区的基准是什么

最后是前沿节点→是否可以理解为信息节点为那个被选择的前沿节点,但是在算法理解中步骤2作者阐述的是会将新探索到的节点加入到前沿节点中,那么可以保证该结点就是已部署的信息节点吗

该文章中作者所写的总结:大体与摘要相同,除了几个点

1. 设计了一个兼顾路径代价和目标距离的效用函数来确定目标的下一个边界点,从而根据不同的额场景选择深度优先和广度优先模式

2. 避障算法→DDPG+PER

最后作者提出了仿真结果及算法的有效性

该文章为个人学习笔记,部分内容不全,对该文章感兴趣的读者请移步Voronoi-Based Multi-Robot Autonomous Exploration in Unknown Environments via Deep Reinforcement Learning | IEEE Journals & Magazine | IEEE Xplore

如有侵权,联系立删

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于Voronoi的多机器人寻源的Matlab仿真代码,供参考: ``` clc;clear all;close all; %参数设置 N=5; %机器人个数 x0=rand(2,N)*10; %初始位置 d=5; %检测距离 v=1; %速度 dt=0.1; %时间步长 t=0:dt:100; %时间序列 %目标点设置 xg=[20;20]; %画准备 figure (1) hold on; axis([0 25 0 25]); title('多机器人寻源仿真'); xlabel('X'); ylabel('Y'); %画出初始位置和目标点 plot(xg(1),xg(2),'r*','MarkerSize',10); plot(x0(1,:),x0(2,:),'bo'); %循环 for k=1:length(t) %计算Voronoi [v,c]=voronoin(x0'); %画出Voronoi voronoi(x0(1,:),x0(2,:)); %循环每个机器人 for i=1:N %找出机器人i的邻居 nei=setdiff(findNeighbors(v,c,i),i); %计算机器人i的速度 vi=Velocity(i,x0,nei,xg,v,d,v); %更新机器人i的位置 x0(:,i)=x0(:,i)+vi*dt; %画出更新后机器人i的位置 plot(x0(1,i),x0(2,i),'bo'); end %判断是否所有机器人都到达了目标点 if norm((x0-xg),2)<1e-3 break; end %暂停一下,方便观察 pause(0.1); end %显示结束信息 if k<length(t) fprintf('在第%d秒所有机器人都到达了目标点\n',k*dt); else fprintf('在%ds内未找到路径\n',t(end)); end ``` 其中,`Velocity` 函数用来计算每个机器人的速度,代码如下: ``` function vi=Velocity(i,x0,nei,xg,voronoi,d,v) %计算机器人i的速度 % x0:所有机器人的位置 % nei:机器人i的邻居 % xg:目标点 % voronoiVoronoi % d:检测距离 % v:速度 %返回机器人i的速度 vi=zeros(2,1); %计算机器人i到目标点的方向 dir=xg-x0(:,i); dir=dir/norm(dir,2); %计算机器人i到其他机器人的距离和方向 dis=zeros(length(nei),1); dir_n=zeros(2,length(nei)); for j=1:length(nei) dis(j)=norm(x0(:,nei(j))-x0(:,i),2); dir_n(:,j)=(x0(:,nei(j))-x0(:,i))/dis(j); end %计算机器人i的速度 if isempty(nei) %没有邻居,直接朝目标点走 vi=v*dir; else %有邻居,考虑避障 %计算机器人i到Voronoi上的最近点的距离 point=voronoi{nei(1)}(1:2); dis_v=norm(point-x0(:,i),2); for j=2:length(nei) point=voronoi{nei(j)}(1:2); dis_v=min(dis_v,norm(point-x0(:,i),2)); end %判断是否需要避障 if dis_v<=d %需要避障 %计算机器人i的速度方向 dir_a=dir; for j=1:length(nei) if dis(j)<=d %在危险范围内 %计算机器人i需要避开的方向 dir_o=dir_n(:,j); dir_a=dir_a-((d-dis(j))/d)*(1-dis_v/d)*dir_o; end end %重新计算机器人i的速度 vi=v*dir_a/norm(dir_a,2); else %不需要避障 vi=v*dir; end end end ``` 该代码实现了多机器人的协作寻源,机器人通过Voronoi来计算避障方向,从而避免碰撞。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值