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

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

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

        自适应蚁群算法作为一种常用的优化算法,具有并行计算能力、适应性强以及全局搜索的特性,因而在解决路径规划的优化问题等方面广泛应用。本项目旨在基于自适应蚁群算法优化,探索解决攀爬机器人路径规划问题的新方法。通过利用自适应蚁群算法的全局搜索能力和路径优化特性,来提高全局路径规划的效率和质量,为攀爬机器人的实际应用提供有效的路径规划解决方案。使用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.mfbz.cn/a/752592.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

FastGPT 手动部署错误:MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo

在运行 FastGPT 时&#xff0c;mongodb 报如下错误&#xff1a; MongooseServerSelectionError: getaddrinfo EAI_AGAIN mongo 这是因为 mongo 没有解析出来&#xff0c;在 hosts 文件中添加如下信息&#xff1a; 127.0.0.1 mongo 重新运行 FastGPT 即可。 参考链接&#xff…

力扣随机一题 位运算/滑动窗口/数组

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 3191.使二进制数组全部等于1的最少操作次数I【中等】 题目&#xff1a; 给…

C语言力扣刷题7——删除排序链表中的重复元素 II——[快慢双指针法]

力扣刷题7——删除排序链表中的重复元素 II——[快慢双指针法] 一、博客声明二、题目描述三、解题思路1、思路说明 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更好的督促自己学习以及理解力扣大佬们的解题思路&#xff0c;开辟…

STM32将外部SDRAM空间作为系统堆(Heap)空间

概述 stm32可以外扩很大的sram&#xff0c;常见外部sram的初始化函数一般是c语言写的&#xff0c;默认写在main函数里面。stm32初始化首先进入汇编代码startup_stm32f429xx.s&#xff0c;在汇编代码中Reset_Handler&#xff08;复位中断服务程序&#xff09;里面先调用了Syste…

光明致优尊耀呈现“柏林爱乐在上海”音乐会正式开幕,奏响盛夏狂热乐章

2024年6月26日&#xff0c;由光明致优尊耀呈现的中国上海国际艺术节特别项目“柏林爱乐在上海”音乐会正式开幕。暌违七年&#xff0c;世界顶级交响乐团——柏林爱乐乐团再度访沪&#xff0c;在首席指挥基里尔别特连科率领下&#xff0c;正式在中国上海国际艺术节登台演出&…

Talk|CityU 助理教授马佳葳: CVPR 2024, 基于多模态理解的混合数据专家模型

本期为TechBeat人工智能社区第604期线上Talk。 北京时间6月27日(周四)20:00&#xff0c;香港城市大学助理教授—马佳葳的Talk已经准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “基于多模态理解的混合数据专家模型”&#xff0c;他向大家介绍了混合数据专…

x86 平台实现一个原子加法操作

1&#xff0c;先上代码 #include <iostream> #include <omp.h>int atomicAdd(int* ptr, int value) {int result;asm volatile("lock xaddl %0, %1\n": "r" (result), "m" (*ptr): "0" (value), "m" (*ptr): &…

程序猿大战Python——Python与MySQL交互三

SQL注入 目标&#xff1a;了解什么是SQL注入&#xff1f; SQL注入指的是&#xff1a;恶意篡改或注入SQL条件。 当开发者的数据条件若被恶意篡改&#xff0c;那就达不到预期的查询效果。 为了了解SQL注入是怎么回事&#xff1f;通过一个案例来分析。 例如&#xff0c;使用命令…

综合布线实训室建设可行性报告

1、 建设综合布线实训室的目的和意义 1.1 响应国家职业教育政策 在国家对职业教育的高度重视和政策支持下&#xff0c;综合布线实训室的建设不仅是对国家教育方针的积极响应&#xff0c;也是对技术教育改革的有力推动。通过这一平台&#xff0c;我们旨在培育出一批具有强烈实…

ChatGPT智能对话绘画系统 带完整的安装源代码包以及搭建教程

系统概述 ChatGPT 智能对话绘画系统是一款集智能语言处理和绘画创作于一体的综合性系统。它利用了深度学习和自然语言处理技术&#xff0c;能够理解用户的意图和需求&#xff0c;并通过与用户的交互&#xff0c;生成富有创意的绘画作品。该系统的核心是一个强大的人工智能模型…

高考后的抉择:专业优先还是学校优先?

随着2024年高考的帷幕落下&#xff0c;高考生们面临的一个重要抉择再度浮上心头&#xff1a;在分数受限的情况下&#xff0c;是选择一个心仪的专业&#xff0c;还是选择一个知名度更高的学校&#xff1f;这是一个困扰了众多考生和家长的长期难题。在这个关键的时刻&#xff0c;…

“一团乱麻”到底什么是烟雾病呢?

当我们听到“烟雾病”这个名字时&#xff0c;可能会联想到与吸烟有关的疾病&#xff0c;但实际上&#xff0c;这是一种与吸烟毫无关系的罕见脑血管疾病。它的名字来源于在脑血管造影中&#xff0c;病变的血管网看起来像一团乱麻&#xff0c;又似吸烟时吐出的烟雾。 烟雾病&…

uniapp, ‍[⁠TypeError⁠]‍ “Failed to fetch dynamically imported module“ 报错解决思路

文章目录 1. 背景2. 报错3. 解决思路4. 思考参考1. 背景 最近基于uniapp开发一款设备参数调试的APP软件,在使用第三方插件的过程中,出现下面的报错。 2. 报错 [plugin:vite:import-analysis] Cannot find module ‘D:/leaning/uniapp/demo/jk-uts-udp示例/uni_modules/uts-…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP3001(SPI接口)的ADC转换器Proteus仿真

一、仿真原理图: 二、仿真效果: 三、STM32CubeMX配置: 1)、USART配置: 2)、SPI配置: 四、软件部分: 1)、时钟、SPI、USART初始化部分: /** * @brief System Clock Configuration * @retval None */ void SystemClock_Config(void) { RCC_OscInitTypeDef RC…

Docker-Compose一键部署项目

Docker-Compose一键部署项目 目录 Docker-Compose一键部署项目介绍部署Django项目项目目录结构 docker-compose.ymlnginx的default.conf文件后端Dockerfile文件mysql.env一键部署DNS域名解析引起的跨域问题 介绍 Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的…

网络世界的“握手”与“告别”:揭秘TCP的三次握手与四次挥手

在网络世界中&#xff0c;数据的传输就像是一场精心编排的舞蹈&#xff0c;而TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;则是这场舞蹈的指挥家。它确保数据在网络中的传输既稳定又可靠。那么&#xff0c;在这背后&#xff0c;TCP是如何…

红黑树原理 部分模拟实现

1.红黑树的概念及性质 红黑树的概念 红黑树&#xff0c;是一种二叉搜索树&#xff0c;但在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树确保没有一条路径会比其他路径长出…

Redis和PHP的Bitmap于二进制串的相互转换

Redis和PHP的Bitmap于二进制串的相互转换 场景 错题集的存储&#xff0c;需要有正确的题号id集合&#xff0c;错误的题号id集合&#xff0c;两者并集后在全量题的集合中取反就是未答题号id 选型 基于场景的数据结构设计&#xff0c;有试过列表等&#xff0c;测试结果&#xff1…

python笔记----少儿编程课程

第1课&#xff1a; 认识新朋友-python 知识点&#xff1a; 1、在英文状态下编写Python语句。 2、内置函数print()将结果输出到标准的控制台上&#xff0c;它的基本语法格式如下&#xff1a; print("即将输出的内容") #输出的内容要用引号引起来&#xff0c;可…

【Ant Design Vue的更新日志】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…