基于matlab复现,基于voronoi图最小化围捕算法+源代码+文档说明

133 篇文章 0 订阅
87 篇文章 1 订阅

源码下载地址

点击这里下载代码

项目介绍

本仓库是对论文《Intercepting Rogue Robots: An Algorithm for Capturing Multiple Evaders With Multiple Pursuers》的复现,基于voronoi图最小化围捕算法

项目功能

循环控制

  1. 判断所有的evader是否被抓住
  2. 获取各个agent的位置
  3. 计算场上或者的agent维诺图
    将active的agent的index选出来

把这些agent的pos放到一个数组中

计算voronoi图

要计算维诺图的无穷远边与凸多边形的交点,因为有无穷大,无法计算pursuer的的速度

所以必须设置边界,所有点在这个边界内运动,否则会出现计算nan,无法计算

需要对每个元胞构成的voronoi图的顶点重新分配,把无穷远的点替换成直线的交点

预处理:遍历所有的元胞,把元胞C在正方形外的顶点和无穷远的顶点ID都删除掉,只保留在正方形内的顶点

如果顶点在正方形上怎么办,作为有界区域处理,不管他
从vx,vy中倒序查找点,第二行最后一列是终点,第一行最后一列是起点,检测这样的线段是否与正方形的线段有交点

函数中已经把重复的点去掉了
有就把交点按顺序储存到V中(避免与之前的交点的ID产生冲突),接着把正方形的顶点也储存进去,打上ID,没有就过

需要检测是否有重复的点!
所有的边都检查完,为V中新添加的点找最近的两个元胞(用小于等于),并且为元胞打上ID

有点到三个元胞的距离相同,但是计算法先,这个点是元胞内部的点,记得在i上+1即可
正方形角点计算选择最近的距离
其他距离选择两个元胞
4. 计算pursuer和evader速度方向
寻找pursuer元胞周围的neightbor是否有evader的元胞,如果有,找到最近的evader元胞,计算边界的型心;如果没有则计算最近的evader,速度方向朝向evader。

找到两个元胞公共的顶点,且公共顶点数为2,则这两个元胞相邻
先找元胞的neightbor,然后在neightbor中找evader,在evader中找最近的evader
寻找evader 元胞周围的neightbor是否有pursuer的元胞,如果有,计算evader的多边形的型心,朝着型心运动;如果没有则计算最近的pursuer,速度方向朝向pursuer的反方向。

根据论文公式计算输入u

  1. 运动到指定点的位置
  2. 计算是否触发捕获
    计算每个evader最近的pursuer距离,如果小于rc就设置被捕获状态,停止运动,pursuer更新target
    全部evader都被捕获,停止运动
    MATLAB图像处理
  3. 如何给图填充颜色
    不处理
  4. 如何取消voronoi图的蓝点
    hold off
  5. 如何更新各个点的位置,同时上一时刻的位置消失
    hold off

界面预览

在这里插入图片描述

项目备注

1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!
2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。
3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。
下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

源码下载地址

点击这里下载代码

  • 18
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

机器学习的喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值