复杂环境下多移动机器人路径规划研究附Matlab代码

news2025/7/19 10:13:33

✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。

🍎个人主页:Matlab科研工作室

🍊个人信条:格物致知。

更多Matlab仿真内容点击👇

智能优化算法  神经网络预测 雷达通信  无线传感器

信号处理 图像处理 路径规划 元胞自动机 无人机  电力系统

⛄ 内容介绍

我们使用了本文[2]中描述的匈牙利赋值算法,并改编了[1]中的matlab实现。为了估计机器人团队的运行时间,我们计算了10条路径的平均值。然后我们将C-CAPT算法扩展到去中心化D-CAPT算法。我们在覆盖起始位置和目标位置的凸包中施加相同的无障碍消耗。在分散的假设所有机器人彼此相距足够远,以便机器人能够计算而不考虑与其他机器人的碰撞和交互。最初,所有机器人都是随机分配一个目标,然后我们假设机器人的数量与目标数量。假设机器人有一个可以发送和接收信息的视野来自其他机器人的消息。因此,当两个机器人进入彼此的领域时,它们会局部优化通过改变它们的目标位置,使它们在本地移动最小化平方距离损失函数。

⛄ 部分代码

function [desired_state,fret] = dcaptTrajGenerator(var,tc,state, qn)

%% The function which performs the dcapt computation and simulation

% var is a structure containing start goal f(assignment of goal) nbots

% bound vmax bound

%% Assign params

persistent tprev C_prev U_prev f coeff G

N = var.nbots;

tf = var.tf;

if(tc>=tf)

    desired_state.pos = G(f(qn),:)';

    desired_state.vel = zeros(3,1);

    desired_state.acc = zeros(3,1);

    desired_state.yaw = 0;

    desired_state.yawdot = 0; 

    fret =f;

    return;

end

if isempty(tprev)

    G = var.goal;

    f = var.f;

    C_prev = computeNeighb(var.start, var.h);

    U_prev = C_prev;

    tprev = var.t0;

    %% TODO set the des

    X_V_0 = extractPosVel(state);

    coeff = computeCoeff(X_V_0, G(f,:), tc, var.tf, true(N,1));

    desired_state.pos = X_V_0(qn,1:3)';

    desired_state.vel = zeros(3,1);

    desired_state.acc = zeros(3,1);

    desired_state.yaw = 0;

    desired_state.yawdot = 0;

    fret = f;

    return;

end

%% Actual algorithm

X_V_prev = extractPosVel(state);

X_prev = X_V_prev(:,1:3);

isFC = false(N,1);

isFC(qn) = true;

C_t = computeNeighb(X_prev, var.h);

U_t = U_prev | (C_t & (~C_prev));

U_t = U_t & C_t;

while(any(isFC))

  

    %robots to check

    rtc = find(isFC);

    

    for i = 1:numel(rtc)

        

        ri = rtc(i);

        isFC(ri) = false;

        

        % neighb

        n_ind = find(U_t(ri,:));

        

        for j = 1:numel(n_ind)

            % neighb

            rj = n_ind(j);

            

            % any has to be swapped

            if isSwap(X_prev(ri,:), G(f(ri),:), X_prev(rj,:), G(f(rj),:))

                

                % swap fi fj

                tmp = f(ri);

                f(ri) = f(rj);

                f(rj) = tmp';

                

                % new neighb

                U_t(ri,:) = C_t(ri,:);

                U_t(ri,rj) = false;

                U_t(rj,:) = C_t(rj,:);

                U_t(rj,ri) = false;

                

                % recompute trajs

                r_inds = [ri;rj]; 

                coeff_ij = computeCoeff(X_V_prev, G(f,:), tprev, tf , r_inds );

                coeff.x([ri;rj],:) = coeff_ij.x;

                coeff.y([ri;rj],:) = coeff_ij.y;

                coeff.z([ri;rj],:) = coeff_ij.z;

                

                isFC(ri) = true;

                isFC(rj) = true;

                

            end

            U_t(ri,rj) = false;

        end

    end

end

%plotSim(X_c, var, var.start, var.goal, var.scale)

tprev = tc;

C_prev = C_t;

U_prev = U_t;

fret=f;

[Xc,Vc,Ac] = computeState(tc, coeff, qn);

desired_state.pos = Xc;

desired_state.vel = Vc;

desired_state.acc = Ac;

desired_state.yaw = 0;

desired_state.yawdot = 0;

end

function C = computeNeighb(X, h )

%% X = N by ndim position

% C = N by N sparse matrix 1 for points which are less than h dist

% btw them

N = size(X,1);

C = pdist2(X,X)<=h;

% make diag zeros

C(logical(eye(N))) = 0;

end

function [Xnext,Vnext,Anext] = computeState(tc, coeff, qn)

%% Given the current state and current goals and the

% current time, the time to estimate the next state

% and the end time compute Xnext

tpos = [ 1; tc; tc^2;   tc^3;    tc^4;    tc^5;     tc^6;     tc^7];

tvel = [ 0;  1; 2*tc; 3*tc^2;  4*tc^3;  5*tc^4;   6*tc^5;   7*tc^6];

tacc = [ 0;  0;    2;   6*tc; 12*tc^2; 20*tc^3;  30*tc^4;  42*tc^5];

Xnext = [coeff.x(qn,:)*tpos; coeff.y(qn,:)*tpos; coeff.z(qn,:)*tpos];

Vnext = [coeff.x(qn,:)*tvel; coeff.y(qn,:)*tvel; coeff.z(qn,:)*tvel];

Anext = [coeff.x(qn,:)*tacc; coeff.y(qn,:)*tacc; coeff.z(qn,:)*tacc];

end

function toSwap = isSwap(x_i, g_i, x_j, g_j)

%% checks if u'*w <0; where u = xj_c - xj_c

% checks if u'*w <0; where w = xj_tf - xj_tf

U = x_j - x_i; % 1 by n

W = g_j - g_i; % 1 by n

toSwap = U*W' < 0; % 1 by n x n by 1

end

function X = extractPosVel(state)

%% extract pos and vel

    X = cell2mat(state);

    X = X(1:6,:)';

end

function coeff = computeCoeff(X_V, G, tprev, tf , rob_ind)

%% Compute the coefficients of the septic for all the 

% robots if rob_ind is not passed

X_V_int = X_V(rob_ind,:)';

G_int = G(rob_ind,:)';

zrs = zeros(size(X_V_int(1,:)));

x0= X_V_int(1,:);

vx0= X_V_int(4,:);

y0= X_V_int(2,:);

vy0= X_V_int(5,:);

z0= X_V_int(3,:);

vz0= X_V_int(6,:);

xf = G_int(1,:);

yf = G_int(2,:);

zf = G_int(3,:);

% computeSeptic(x0,v0,a0,j0,xf,vf,af,jf, t0,tf)

coeff.x = computeSeptic(x0,vx0,zrs,zrs,xf,zrs,zrs,zrs, tprev,tf)';

coeff.y = computeSeptic(y0,vy0,zrs,zrs,yf,zrs,zrs,zrs, tprev,tf)';

coeff.z = computeSeptic(z0,vz0,zrs,zrs,zf,zrs,zrs,zrs, tprev,tf)';

end

⛄ 运行结果

⛄ 参考文献

[1] James Munkres. Algorithms for the Assignment and Transportation Problems. Journal of the Society for Industrial and Applied Mathematics, 5(1):32–38, 1957.

[2] Matthew Turpin, Nathan Michael, and Vijay Kumar. Capt: Concurrent assignment and planning of trajectories for multiple robots. Int. J. Rob. Res., 33(1):98–112, January 2014.

⛄ Matlab代码关注

❤️部分理论引用网络文献,若有侵权联系博主删除

❤️ 关注我领取海量matlab电子书和数学建模资料

 

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

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

相关文章

数据结构 | 顺序栈与链式队【栈与队列的交际舞】

数据结构之栈与队列&#x1f333;顺序栈&#x1f343;前言&#x1f525;栈的结构简介及概述&#x1f525;为什么要用顺序栈&#xff1f;&#x1f525;结构声明&#x1f343;接口算法实现&#x1f35e;初始化栈&#x1f35e;销毁栈&#x1f35e;入栈&#x1f35e;出栈&#x1f3…

磨金石教育|干货分享:剪辑技法之跳切(上)

有一种剪辑手法划分了传统剪辑与现代剪辑的界限&#xff0c;它就是“跳切”&#xff1b; 跳切&#xff0c;是“切”的一种。属于一种无技巧的剪辑手法。它打破常规状态镜头切换时所遵循的时空和动作连续性要求&#xff0c;以较大幅度的跳跃式镜头组接&#xff0c;突出某些必要内…

【kafka】三、kafka命令行操作

kafka命令行操作 kafka的相关操作命令脚本文件在bin目录下 查看所有的topic kafka-topics.sh --zookeeper hll1:2181 --list 或 kafka-topics.sh --zookeeper 192.168.171.132:2181 --listkafka-topics.sh&#xff1a;topic执行脚本 --zookeeper hll1:2181&#xff1a;需要的…

[carla]把carla世界坐标系 转换为 俯视地图像素坐标系

在下面这篇参考博客中介绍了如何手动获取从carla世界坐标系到俯视地图像素坐标系的旋转平移矩阵.我也是采用了一样的思路和代码,这里把实现的过程以及最后所有地图的变换矩阵记录如下. 参考博客:carla真实世界坐标系与全局俯视地图像素坐标系变换 文章目录代码:1.carla世界坐标…

【表白】html表白代码

目录一.引言二.表白效果展示1.惊喜表白2.烟花表白3.玫瑰花表白4.心形表白5.心加文字6.炫酷的特效一.引言 我们可以用一下好看的网页来表白&#xff0c;下面就有我觉得很有趣的表白代码 下载整套表白文件 二.表白效果展示 1.惊喜表白 2.烟花表白 源码&#xff1a;新建一个文本文…

基于51单片机的温度控制系统数码管显示蜂鸣器报警proteus仿真原理图PCB

功能&#xff1a; 0.本系统采用STC89C52作为单片机 1.系统实时监测并显示当前温度&#xff0c;并通过四位数码管显示 2.超过设定阈值&#xff0c;蜂鸣器将报警&#xff0c;同时控制相应继电器实现降温或者加热 3.系统具备三个功能按键&#xff0c;可更改温度上限和下限 4.采用D…

SpringBoot+Mybatis-Plus+Thymeleaf 实现增删改查+登录/注册

SQL -- student_info create table if not exists student_info ( sid int not null auto_increment comment 学生表主键 primary key, sname varchar(20) not null comment 学生账号登录名、姓名, pwd varchar(32) not null comment 密码, sex varchar(20) not null comment …

AQS源码解析 7.共享模式_CyclicBarrier重复屏障

AQS源码解析 —共享模式_CyclicBarrier重复屏障 简介 CyclicBarrier&#xff1a;循环屏障、循环栅栏&#xff0c;用来进行线程协作&#xff0c;等待线程满足某个计数。构造时设置『计数个数』&#xff0c;每个线程执行到某个需要“同步”的时刻调用 await() 方法进行等待&…

【多目标进化优化】多目标进化群体的分布性

0 前言 \quad\quad进化算法是模拟生物自然进化的人工方法&#xff0c;与大自然生态环境一样&#xff0c;进化的物种也需要平衡发展。因此&#xff0c;设计者必须制定合适的生存规则来维持种群的多样性和分布性。在多目标进化算法中&#xff0c;对于某些问题&#xff0c;Pareto最…

微机-------可编程并行接口8255A

目录 8255A的内部结构8255A控制信息和传输动作的对应关系⭐8255A的控制字一、方式选择控制字①方式0(基本输入输出工作方式)二、端口C置1/置0控制字8255A的工作方式②方式1(选通的输入输出工作方式)③方式2(双向传输方式)⭐⭐8255的编程及应用8255A的内部结构 ①数据总线…

Steam项目推进(二)—— 在项目中使用FairyGUI

一、遇到的问题 昨天把代码大致清理了一遍之后&#xff0c;发现代码中存在很大的一个问题是数据和表现耦合在一起了&#xff0c;如下&#xff1a; using UnityEngine; using UnityEngine.UI;public enum CardStateType {InDeck, InHand, InBattle, InSave, InAbandon }//卡牌…

Cisco简单配置(十八)—OSPF

开放式最短路径优先&#xff08;Open Shortest Path First&#xff0c;OSPF&#xff09;是广泛使用的一种动态路由协议&#xff0c;它属于链路状态路由协议&#xff0c;具有路由变化收敛速度快、无路由环路、支持变长子网掩码&#xff08;VLSM&#xff09;和汇总、层次区域划分…

设计模式-组合模式(决策树)

一、只如初见 组合模式也许大家第一联想到的就是把两个模块组合起来使用&#xff0c;其实好像是这样也其实不是这样&#xff0c;废话不多说&#xff0c;学习一件新的事物总要先了解一下他的概念&#xff0c;老规矩先上概念&#xff08;摘自百度百科&#xff09;&#xff1a; 组…

【活动预告】金融大数据治理实践分享(12/03)

原创 DAMA数据管理 # 本期主题 金融大数据治理实践分享 数字化时代&#xff0c;数据的价值受到越来越多的关注&#xff0c;有人将其比作黄金&#xff0c;也有人将其比作石油&#xff0c;成为组织中的最重要资产之一。针对数据这种有特殊属性的资产&#xff0c;也存在着采集…

[论文阅读] 颜色迁移-N维pdf迁移

[论文阅读] 颜色迁移-N维pdf迁移 文章: N-Dimensional Probability Density Function Transfer and its Application to Colour Transfer, [paper ][code] 1-算法原理 简单来说, 本文将图像看作是随机变量的一组样本, 图像之间的颜色迁移可以看作是样本之间分布的迁移. 因而…

G1D23-RAGA报名蓝桥Attackg安装cudatorch

昨天太摸鱼啦~不过蛮开心的哈哈 今天主要是把积累的ddl都清理一下&#xff01;&#xff01;&#xff01;第一项就是我和舍友一起读的论文嘿嘿&#xff01;&#xff01; 一、RAGA &#xff08;零&#xff09;总结&#xff08;仅模型&#xff09; 作为数据挖掘顶会2021年的论文…

【MATLAB教程案例46】三维数据的插值和滤波处理matlab仿真

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 本课程学习成果预览: 目录 1.软件版本 2.三维数据插值

openFeign夺命连环9问,这谁受得了?

1、前言 前面介绍了Spring Cloud 中的灵魂摆渡者Nacos&#xff0c;和它的前辈们相比不仅仅功能强大&#xff0c;而且部署非常简单。 今天介绍一款服务调用的组件&#xff1a;OpenFeign&#xff0c;同样是一款超越先辈&#xff08;Ribbon、Feign&#xff09;的狠角色。 文章目…

linux 安装新版傻妞+TG+青龙

一键安装命令 #国内服务器要先设置网络代理set sillyGirl download_prefix https://yanyu.ltd/#一键安装命令ssillyGirl;aarm64;if [[ $(uname -a | grep "x86_64") ! "" ]];then aamd64;fi ;if [ ! -d $s ];then mkdir $s;fi ;cd $s;wget https://yanyu.…

git回滚指定版本相关操作

当提交推送到远程仓库之后&#xff0c;需要回退到特定版本,去修改该代码,然后在推送到远程仓库; 1.查看目前版本状态: git status 2.查看提交日志&#xff0c;找到需要回滚的git版本号 git log 3.将当前分支回滚到id9c45732c5701fc84164bebe3c05760a72a4ece12 #这个是软回滚&am…