自适应蚁群算法优化的攀爬机器人的路径规划

news2024/11/24 17:27:12

        大家好,我是带我去滑雪!

        攀爬机器人是一种能够在复杂环境中自主移动和攀爬的具有广阔应用前景的智能机器人,具有较强的应用潜力和广泛的研究价值。随着科技的不断发展,攀爬机器人在许多领域中的应用越来越广泛,例如建筑物维护、救援任务、环境监测等,其在复杂环境下的路径规划问题一直是学术界和工业界的关注焦点。在现实应用中,攀爬机器人的自主移动和路径规划仍然面临很多挑战。因为攀爬机器人工作环境复杂、移动范围高度不确定,传统的路径规划方法存在着计算复杂度高、搜索效率低等问题,往往难以适应攀爬机器人的需求。所以,研究如何有效地规划攀爬机器人的行驶路径已经成为了当前研究的热点问题。

        自适应蚁群算法作为一种常用的优化算法,具有并行计算能力、适应性强以及全局搜索的特性,因而在解决路径规划的优化问题等方面广泛应用。本项目旨在基于自适应蚁群算法优化,探索解决攀爬机器人路径规划问题的新方法。通过利用自适应蚁群算法的全局搜索能力和路径优化特性,来提高全局路径规划的效率和质量,为攀爬机器人的实际应用提供有效的路径规划解决方案。使用matlab软件进行模拟,下面开始代码实战。

目录

(1)地图建模

(2)机器人建模

(3)自适应蚁群算法代码实现


(1)地图建模

        栅格法建模是一种广泛应用于地理信息系统中的空间数据建模方法。由于采用其方法建模的分辨率高,安全系数高,信息清晰,规划空间表达一致,灵活性强,易于存储和更新,在编程中容易实现,所以采用栅格法建立攀爬机器人的工作环境模型。下面,绘制栅格划分图:

function [map1] = map1(type)

% type=1 简单栅格 =2 复杂栅格
map_easy = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];
map_comp = [1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 0 1 1 0 1 1 1 1 1 0 1 1 1 1 0 0 0 1 1
    1 0 0 1 0 1 0 1 0 1 1 0 1 1 1 0 1 0 1 1
    1 0 1 1 1 0 0 1 0 0 1 1 0 1 1 0 1 0 1 1
    1 1 1 0 1 1 0 0 0 1 1 1 1 1 1 0 1 0 1 1
    1 0 0 0 1 1 0 0 0 1 1 0 1 1 1 1 0 0 1 1
    1 0 1 0 0 1 0 0 0 1 1 1 1 0 1 0 0 1 1 1
    1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 1 0 0 1 1
    1 0 0 0 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1
    1 1 1 1 0 1 1 1 1 1 0 1 0 0 1 1 0 1 1 1
    1 1 1 0 0 0 1 0 0 1 0 0 0 0 0 1 1 1 1 1
    1 1 1 0 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 0 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1
    1 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 0 1
    1 1 0 0 1 1 1 0 1 1 1 0 0 0 1 0 0 1 0 1
    1 1 0 0 1 1 0 1 0 1 1 1 1 0 0 1 1 1 1 1
    1 1 1 1 1 1 0 0 0 1 0 0 1 1 1 1 0 0 0 1
    1 1 1 1 1 1 1 1 1 1 0 1 1 1 0 1 1 0 0 1
    1 1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 0 0 1];

if type==1
    map1 = map_easy;
else
    map1 = map_comp;
end

输出结果:

(2)机器人建模

       攀爬机器人利用视觉传感器对工作环境的信息进行采集整理,进行降维处理,将三维空间的信息转化为二进制方阵,进而在一个二维平面空间中,找到一条从起始位置到目标位置的无重复无碰撞的最优解路径。出于对建模的有效性考虑,假设攀爬机器人在二维空间中移动,将攀爬机器人视作一个红色质点在二维空间内移动,因此机器人的体积可忽略不计。工作空间内的障碍物可用黑体正方形进行表示。

(3)自适应蚁群算法代码实现

         采用自适应蚁群算法在20×20的平面空间中寻找一条从起始位置S到目标位置T的最优路径,在该机器人二维空间模型中存在着多个不移动的不规则障碍物。其中,起始位置O的坐标为(10,16),目标位置E的坐标为(4,2)。算法的执行流程如下图所示:

clc,clear
close all
rng(2)

%% 构建简单/复杂环境栅格图
type = 1; % 1 简单栅格 2 复杂栅格
map = map(type);
map1 = map;

%% 画出栅格
[m,n] = size(map);
figure(1)
for i=1:m
    for j=1:n
        if map(i,j)==0
            x1=j;   y1=n-i;
            x2=j;   y2=n-i+1;
%             if j-1~=0
%                 map1(i,j-1) = 0;
%             end
            x3=j-1; y3=n-i+1;
            if i+1<=m
                map1(i+1,j) = 0;
            end
            x4=j-1; y4=n-i;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[0,0,0]);
            hold on
        else
            x1=j;   y1=n-i;
            x2=j;   y2=n-i+1;
            x3=j-1; y3=n-i+1;
            x4=j-1; y4=n-i;
            fill([x1,x2,x3,x4],[y1,y2,y3,y4],[1,1,1]);
            hold on
        end
        
    end
end
axis([0,m,0,n])
grid on
grid minor
box on
set(gca,'LineWidth',1)
map(:,:) = map1(end:-1:1,:);

%% 起始点/终点
Spoint = [2,4];
Epoint = [16,10];
Start = sub2ind([m,n],Spoint(1),Spoint(2));% 下标转索引
End = sub2ind([m,n],Epoint(1),Epoint(2));% 下标转索引

%% 参数的设置
popsize = 50;           % 蚂蚁数目
maxiter = 800;          % 最大迭代次数
Rho = 0.1;              % 信息素挥发系数
Beta = 5;               % 启发式因子重要程度参数
Alpha = 2;              % 信息素重要程度参数
q0 = 0.9;               % 偏向选择的阈值
Q=1;
X = size(map,1);      % 问题的状态空间矩阵的行数
Y = size(map,2);      % 问题的状态空间矩阵的列数

tauInit = 1/((X+Y)*(X*Y));        % 初始化信息素的量
tauInfo = tauInit .* ones(X*Y,8); % 8个节点 对于某个节点 其可选的下一个节点是其邻接节点 共8个

upPheromone = 500;              % 信息素上限
lowPheromone = tauInit;         % 信息素下限

bestSoFar_path_length = inf;    % 当前最优路径长度
bestSoFar_pathNode = [];

bestSoFar_PathNode = cell(1,maxiter);
bestSoFar_PathLength = zeros(1,maxiter);
best_dist = [];

%% 迭代
tic
for NC=1:maxiter
    for k=1:popsize
        currentNode = Start;
        pathInfo = currentNode; % 记录一只蚂蚁的行驶路径的节点信息
        path_length = 0;        % 记录蚂蚁走过的路径长度
        distan = []; % 距离矩阵
        availableNode = findNextNodeSet(map,currentNode); %% 未经过禁忌表处理的可选节点
        nodeNumber = size(availableNode,1);
        while(nodeNumber>0&&currentNode~=End)
            % 计算启发信息
            heuristicInfo = compute_HeuristicInfo(End,map,availableNode);
            tauInfo_ = tauInfo(currentNode,:)';% 提取信息素
            % 启发信息和信息素的综合
            [info,availableNode_] = CCP(...
                tauInfo_,heuristicInfo,pathInfo,availableNode,Alpha,Beta); % 经过禁忌表处理的可选节点
            
            nodeNumber = size(availableNode_,1);
            % 如果无可选节点 就跳出循环
            if nodeNumber==0
                break
            end
            nextNode = selectNextNode(info,availableNode_,q0);
            [xi,yi] = ind2sub([m,n],currentNode);
            [x,y] = ind2sub([m,n],nextNode);
            distanceCurrentAndNext = sqrt( (x-xi)^2 + (y-yi)^2 );
            distan = [distan distanceCurrentAndNext];
            path_length = path_length + distanceCurrentAndNext;
            
            pathInfo = [pathInfo,nextNode];
            
            %%% 判断下一节点集是否中存在目标点
            currentNode = nextNode;
            availableNode = findNextNodeSet(map,currentNode);
            nodeNumber = size(availableNode,1);
            
            flag = ismember(End,availableNode);
            if flag==1
                nextNode = End;
                pathInfo = [pathInfo,nextNode];
                [xi,yi] = ind2sub([m,n],currentNode);
                [x,y] = ind2sub([m,n],nextNode);
                distanceCurrentAndNext = sqrt( (x-xi)^2 + (y-yi)^2 );
                distan = [distan distanceCurrentAndNext];
                path_length = path_length + distanceCurrentAndNext;
                break
            end
        end %end while,
        
        % 更新路径
        if pathInfo(end) == End && bestSoFar_path_length>path_length
            bestSoFar_path_length = path_length;
            bestSoFar_pathNode = pathInfo;
            best_dist = distan;
        end
        
        % 更新信息素
        for i=1:size(pathInfo,2)-1
            currentCity = pathInfo(1,i);
            nextCity = pathInfo(1,i+1);
            [xi,yi] = ind2sub([m,n],currentCity);
            [x,y] = ind2sub([m,n],nextCity);
            
            relativeIndex = CCTRI(xi,yi,x,y);%第二点相对于第一个点的位置
            
            tau_1 = tauInfo(currentCity,:);
            
            tau_1(1,relativeIndex) = (1-Rho)*tau_1(1,relativeIndex) + Q/distan(i);
            
            if tau_1(1,relativeIndex)<lowPheromone
                tau_1(1,relativeIndex) = lowPheromone;
            end
            
            tauInfo(currentCity,:) = tau_1;
            
        end
    end 
    
    bestSoFar_PathNode{1,NC} = bestSoFar_pathNode;
    bestSoFar_PathLength(1,NC) = bestSoFar_path_length;
    % 更新信息素
    for i=1:size(bestSoFar_pathNode,2)-1
        currentCity = bestSoFar_pathNode(1,i);
        nextCity = bestSoFar_pathNode(1,i+1);
        [xi,yi] = ind2sub([m,n],currentCity);
        [x,y] = ind2sub([m,n],nextCity);
        
        relativeIndex = CCTRI(xi,yi,x,y);%第二点相对于第一个点的位置
        
        tau_1 = tauInfo(currentCity,:);
        
        tau_1(1,relativeIndex) = (1-Rho)*tau_1(1,relativeIndex) + Q/best_dist(i);
        
        if tau_1(1,relativeIndex)<lowPheromone
            tau_1(1,relativeIndex) = lowPheromone;
        end
        
        tauInfo(currentCity,:) = tau_1;
        
    end
end %end NCmax

toc
clear currentNode distanceCurrentAndNext bad_pathNode flag heuristicInfo NC NCmax nextNode ...
    nodeNumber num_point path_length pathInfo info availableNode availableNode_ ...
    bestSoFar_path_length bestSoFar_pathLength bestSoFar_PathNode

%% 绘制全局最优路径节点信息
the_end_path = bestSoFar_pathNode;
the_end = length(bestSoFar_PathLength);
length_shortest = bestSoFar_PathLength(1,the_end);
len_ROUTS = length(the_end_path);
Rx = the_end_path;
Ry = the_end_path;
for i=1:len_ROUTS
    [Rx(i),Ry(i)] = ind2sub([m,n],the_end_path(i));
end
plot(Ry,Rx,'r-','lineWidth',2);% 画出最优路径图
title(['Length of the global shortest road is ',num2str(length_shortest)])

%% 绘制迭代图
figure(2)
plot(bestSoFar_PathLength,'r-','lineWidth',2)
xlabel('迭代次数')
ylabel('适应度值')
title(['进化过程 '])

输出轨迹路径图:

 输出算法迭代图:

需要数据集的家人们可以去百度网盘(永久有效)获取:

链接:https://pan.baidu.com/s/173deLlgLYUz789M3KHYw-Q?pwd=0ly6
提取码:2138 


更多优质内容持续发布中,请移步主页查看。

博主的WeChat:TCB1736732074

   点赞+关注,下次不迷路!

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

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

相关文章

Python 面试【初级】

阐述以下方法 classmethod, staticmethod, property&#xff1f; 解释什么是lambda函数&#xff1f;它有什么好处&#xff1f;

phpMyAdmin 4.0.10 文件包含 -> getshell

phpMyAdmin 4.0.10 文件包含 -> getshell 前言&#xff1a;这里这个漏洞相对来说审计起来不是特别难&#xff0c;但是对于初学者还是有点挑战性的&#xff0c;从zkaq web课过来的小伙伴想挑战一下自己代码审计能力的话&#xff0c;可以直接跳到最后下载源码&#xff0c;聂风…

一键进阶ComfyUI!懂AI的设计师现在都在用的节点式Stable Diffusion

前言 _ 万字教程&#xff01;奶奶看了都会的 ComfyUI 入门教程 推荐阅读 一、川言川语 大家好&#xff0c;我是言川。 阅读文章 > ](https://www.uisdc.com/comfyui-3) 目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;WebUI 和 ComfyUI。而更晚出现的…

顶顶通呼叫中心中间件-透传uuid并且导入对端变量到本端(mod_cti基于Freeswitch)

一、配置拨号方案 win-ccadmin配置方法 点击拨号方案 -> 点击进入排队 -> 根据图中配置。如果不是排队转人工是机器人转人工那么就是在机器人那个拨号方案配置&#xff0c;并且需要配置在"cti_robot"之前即可 action"set" data"sip_h_X_tas…

【HTML03】HTML表单语法笔记,附带案例-作业

文章目录 表单概述一、表单容器&#xff08;form&#xff09;二、控件相关单词获取本次课程作业和案例 表单概述 允许用户输入信息&#xff0c;和提交信息的-收集用户信息。 表单&#xff1a;表单容器表单控件组成。 控件&#xff1a;输入框、单选按钮、多选、下拉框、多行文…

72V转12V非隔离DC/DC电源原理图+PCB源文件

资料下载地址&#xff1a;72V转12V非隔离DCDC电源原理图PCB源文件 电动车所用的非隔离DC/DC电源&#xff0c;采用BUCK电路&#xff0c;运行稳定&#xff0c;为已经在产品中使用的电路 1、原理图 2、PCB

2006年下半年软件设计师【上午题】试题及答案

文章目录 2006年下半年软件设计师上午题--试题2006年下半年软件设计师上午题--答案2006年下半年软件设计师上午题–试题

linux rocky9.2系统搭建sqle数据库审核平台

文章目录 前言一、环境准备?二、开始部署前言 关于SQLE SQLE 是由上海爱可生信息技术股份有限公司 开发并开源,支持SQL审核、索引优化、事前审核、事后审核、支持标准化上线流程、原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。 产品特色 支持通过插件的形式扩展…

使用 WebGL 创建 3D 对象

WebGL Demohttps://mdn.github.io/dom-examples/webgl-examples/tutorial/sample5/index.html 现在让我们给之前的正方形添加五个面从而可以创建一个三维的立方体。最简单的方式就是通过调用方法 gl.drawElements() 使用顶点数组列表来替换之前的通过方法gl.drawArrays() 直接…

docker 多网卡指定网卡出网

前言 宿主机中有多个网卡 ens160 192.168.4.23/20 内网通信用 ens192 10.31.116.128/24 出公网访问-1 ens193 10.31.116.128/24 出公网访问-2 现在需要不同容器中不同出网访问&#xff0c;举例 容器1 192.168.0.1/20 网段走宿主机 ens160网卡&#xff0c;否则全部走ens192 网…

从@Param注解开始,深入了解 MyBatis 参数映射的原理

系列文章目录 MyBatis缓存原理 Mybatis plugin 的使用及原理 MyBatisSpringboot 启动到SQL执行全流程 数据库操作不再困难&#xff0c;MyBatis动态Sql标签解析 Mybatis的CachingExecutor与二级缓存 使用MybatisPlus还是MyBaits &#xff0c;开发者应该如何选择&#xff1f; 巧…

Socket编程详解:FrmTCPServer与FrmTCPClient的双向对话

目录 预备知识 视频教程 项目前准备知识点 1、服务器端程序的编写步骤 2、客户端程序编写步骤 代码部分 1、服务端FrmServer.cs文件 2、客户端FrmClient.cs文件 3、启动文件Program.cs 结果展示 预备知识 请查阅博客http://t.csdnimg.cn/jE4Tp 视频教程 链接&#…

面经总结系列(六): 奇安信技术研究院算法工程师

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; CSDN、阿里云人工智能领域博客专家&#xff0c;新星计划计算机视觉导师&#xff0c;百度飞桨PPDE&#xff0c;专注大数据与AI知识分享。✨公众号&#xff1a;GoAI的学习小屋 &#xff0c;免费分享书籍、简历、导图等&#xf…

健身馆预约小程序定制搭建会员管理系统次卡核销充值年卡saas账号

健身馆预约小程序定制搭建&#xff1a;打造高效会员管理系统 &#x1f3cb;️ 一、引言&#xff1a;为何需要健身馆预约小程序&#xff1f; 随着健康意识的提高&#xff0c;越来越多的人选择到健身馆进行锻炼。然而&#xff0c;传统的健身馆预约方式往往存在诸多不便&#xff…

(上位机APP开发)调用华为云命令API接口给设备下发命令

一、功能说明 通过调用华为云IOT提供的命令下发API接口,实现下面界面上相同的功能。调用API接口给设备下发命令。 二、JavaScript代码 function sendUnlockCommand() {var requestUrl = "https://9bcf4cfd30.st1.iotda-app.cn-north-4.myhuaweicloud.com:443/v5/iot/60…

reactjs18 中使用路由技巧

react18 版本中&#xff0c;路由的用法发生了变化&#xff0c;react18 版本中&#xff0c;路由由 react-router-dom 包提供。与 react-router 包不同的是&#xff0c;react-router-dom 包提供了 createBrowserRouter 方法&#xff0c;该方法可以创建路由对象。总之&#xff0c;…

汽车尾灯(转向灯)电路设计

即当汽车进行转弯时,司机打开转向灯,尾灯会根据转向依次被点亮,经过一定的间隔后,再全部被消灭。不停地重复,直到司机关闭转向灯。 该效果可由以下电路实现: 完整电路图: 02—电路设计要点 延时电路的要点主要有两个: 一、当转向开关被按下时,LED需要逐个亮起; 二、LED被逐…

商业智能(BI)实战项目

商业智能&#xff08;BI&#xff09;实战项目 期待您的关注 ☀大数据学习笔记 1.实现的功能 2.数据库操作步骤 创建数据库&#xff1a;create database card;创建表&#xff1a;create table card_apply ( cid bigint primary key auto_increment ,apply_uid bigint ,apply_ent…

我的北航MEM成长之旅

领完毕业证&#xff0c;2年的学业生涯到此结束。为了方便大家理解后续的内容&#xff0c;这里我们先解释下基本信息&#xff0c;比如MEM到底是个啥&#xff1f;以及北航的MEM都学什么&#xff1f; 1 MEM解读 1.1 MEM是什么&#xff1f; MEM是"Master of Engineering Ma…

[数据集][目标检测]城市街道井盖破损未盖丢失检测数据集VOC+YOLO格式4404张5类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4404 标注数量(xml文件个数)&#xff1a;4404 标注数量(txt文件个数)&#xff1a;4404 标注…