机器人路径规划:基于Bug算法的机器人路径规划(提供Python代码)

news2024/9/23 9:22:09

一、Bug算法简介

Bug 算法是一种基于追踪障碍物的路径规划算法,它模拟了一种昆虫寻找巢穴的行为,因此得名Bug算法。Bug算法的基本思路是:当机器人遇到障碍物时,他会沿着障碍物的边缘行走,直到到达目标点。该算法可以分为两个主要步骤:表示空间中的点和算法实现。

在Bug算法中,空间被表示为二维网格,其中每个单元格可以是空的,包含障碍物或表示起点和终点。每个单元格可以表示一个网格点,该点的坐标可以用(x,y)表示。通过搜索算法,机器人可以在此网格中寻找路径,并移动到相应的点。Bug算法可以分为两个主要阶段:接近目标(Approach Phase)和沿障碍物行走(Follow Boundary Phase)。

(1)接近目标

在接近阶段,机器人按直线行驶到目标点,如果遇到障碍物,则计算机器人到目标点的距离,然后自动开始沿着障碍物行走,直到到达目标点或绕过障碍物。

(2)沿障碍物行走

在Bug算法中,移动机器人沿连接目标点和 起点的最短直线前进,在遇到障碍物时采用边缘 跟踪的方法绕过障碍物,然后再次沿直线前进。 Bug算法在移动机器人未知环境导航中是经典通 用的算法。需求的存储容量小。如果在机器人起 点和目标终点间存在可行路径的话,那么这种纯 粹的应激式算法肯定会完成路径规划,保证算法 的全局收敛。 Bug算法在寻找两点间可行路径上并不能保 证最优。标准的算法是在起点和终点的直线方向 上产生,遇到障碍物时沿相同的方向绕行。这种 算法能保证寻找到一条安全路径,但并不保证能 迅速到达目标终点,如下图所示:

Bug算法由两种模式来共同保证全局收敛: 趋向目标模式(Moving toward the Goal)和边线 沿走模式(Boundary Following)。开始时移动机 器人执行“趋向目标”模式,遇到障碍物时转向 “边线沿走”模式。

(3)Bug1算法

在Bug1算法中,机器人被假定为搭载接触传感器并能获取精确位置,且能测量两点之间的距离:

(4)Bug2算法

在Bug2算法中,机器人遇到障碍物后,机器人沿障碍物边界运动,直到找到起始点连接的直线上比初始接触障碍物点距目标更近的点。若机器人再次遇到原来的出发点,则没有通往目标的路径。

参考文献:

[1]康亮,赵春霞,郭剑辉.未知环境下基于三次螺线Bug算法的移动机器人路径规划[J].工程图学学报, 2010(1):9.DOI:10.3969/j.issn.1003-0158.2010.01.006.

[2]赵文瑜.基于Bug算法的移动机器人路径规划研究[J].无线互联科技, 2020, 17(6):2.DOI:CNKI:SUN:WXHK.0.2020-06-050.

二、部分代码

import numpy as np
import matplotlib.pyplot as plt

show_animation = True


class BugPlanner:
    def __init__(self, start_x, start_y, goal_x, goal_y, obs_x, obs_y):
        self.goal_x = goal_x
        self.goal_y = goal_y
        self.obs_x = obs_x
        self.obs_y = obs_y
        self.r_x = [start_x]
        self.r_y = [start_y]
        self.out_x = []
        self.out_y = []
        for o_x, o_y in zip(obs_x, obs_y):
            for add_x, add_y in zip([1, 0, -1, -1, -1, 0, 1, 1],
                                    [1, 1, 1, 0, -1, -1, -1, 0]):
                cand_x, cand_y = o_x+add_x, o_y+add_y
                valid_point = True
                for _x, _y in zip(obs_x, obs_y):
                    if cand_x == _x and cand_y == _y:
                        valid_point = False
                        break
                if valid_point:
                    self.out_x.append(cand_x), self.out_y.append(cand_y)

    def mov_normal(self):
        return self.r_x[-1] + np.sign(self.goal_x - self.r_x[-1]), \
               self.r_y[-1] + np.sign(self.goal_y - self.r_y[-1])

三、部分结果

四、完整Python代码

见下方名片

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

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

相关文章

代码随想录算法训练营第二十五天|216.组合总和III,17.电话号码的字母组合

216.组合总和III 题目 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。 说明: 所有数字都是正整数。 解集不能包含重复的组合。 示例 1: 输入: k 3, n 7 输出: [[1,2,4]] 示例 2: 输入…

深入了解JVM底层原理

一、JVM内存结构 1、方法区:存储编译后的类、常量等(.class字节码文件) 2、堆内存:存储对象 3、程序计数器:存储当前执行的指令地址(计算机处理器(CPU)正在执行的下一条指令在内存…

Java后端八股----JVM篇

上图中线程1,2如果资源被抢占了,则程序计数器记录一下执行的行号,等到资源就绪后会从记录的行号继续向后执行。 Java8把静态变量以及常量放到了线程的本地内存原空间中(避免放在堆中不可控)。 👆图中第二种情况不太容易出现…

【Chapter1】操作系统概述,计算机操作系统教程,第四版,左万利,王英

文章目录 一、操作系统的基本概念1.1操作系统的层次结构1.2操作系统的运行视图1.3操作系统的概念(定义)1.4操作系统的功能和目标1.4.1操作系统的功能和目标——作为系统资源的管理者1.4.2操作系统的功能和目标——向上层提供方便易用的服务1.4.2.1GUI:图形化用户接口…

CPU vs. GPU :本质差异是?

他们的目的都是做并行计算的,但并行计算可分为时间上的并行和空间上的并行。所以我觉得本质差异是: CPU 时间并行GPU 空间并行 这样就容易理解他们的工作方式: 对CPU来说,不同的核心可以执行不同的机器指令但GPU则不同&#xff…

长安链开源社区发布2023年度长安链优秀应用案例

1月27日结束的“长安链发布三周年庆暨生态年会”上,在国家区块链技术创新中心的指导下,长安链开源社区联合长安链生态联盟正式发布2023年度长安链行业示范案例、领域精品案例及特色创新案例。 本次评选面向2023年度应用长安链上线并取得应用成效的案例&…

SSA优化最近邻分类预测(matlab代码)

SSA-最近邻分类预测matlab代码 麻雀搜索算法(Sparrow Search Algorithm, SSA)是一种新型的群智能优化算法,在2020年提出,主要是受麻雀的觅食行为和反捕食行为的启发。 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集,比例为8&#…

intelliJ配置Android环境 与 文件目录解释

实验目的与要求: 目的:掌握面向Android编程的开发环境搭建。学习、掌握Android程序编写基本步骤,例如,Android Studio平台编写简单的一个 HelloWorld程序,掌握编译、运行等基本步骤和操作。 内容要求: 搭建…

杂货铺 | vscode配置C/C++环境(亲测极简ver)

文章目录 📚Step1:下载安装VSCode📚Step2:下载安装g📚Step3:编辑环境变量📚Step4:安装vscode插件📚Step5:建好文件夹⭐️📚Step6:开始…

【Node.js从基础到高级运用】十三、NodeJS中间件高级应用

在现代web开发中,Node.js因其高效和灵活性而备受青睐。其中,中间件的概念是构建高效Node.js应用的关键。在这篇博客文章中,我们将深入探讨Node.js中间件的高级应用,包括创建自定义中间件、使用第三方中间件等。我们将从基础讲起&a…

qt vs 编程 字符编码 程序从源码到编译到显示过程中存在的字符编码及隐藏的字符编码转换

理解字符编码,请参考:unicode ucs2 utf16 utf8 ansi GBK GB2312 CSDN博客 了解windows字符显示必须了解locale概念 参考:揭密 Windows 上的各种 locale - 知乎 汉字(或者说多字节字符)的存放需求,是计算…

【CSP试题回顾】202309-2-坐标变换(其二)

CSP-202309-2-坐标变换&#xff08;其二&#xff09; 解题代码 #include <iostream> #include <vector> #include <cmath> #include <iomanip> using namespace std;struct MyOpt {double k, theta; }; int n, m, opt, s, e; double para, x, y;int …

Java项目:62 基于ssm的校园驿站管理系统+jsp

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 管理员管理快递仓库信息&#xff0c;管理待发货信息&#xff0c;管理已收快递&#xff0c;管理物流以及留言信息&#xff0c;管理员工和用户资料。 员…

C++——字符串、读写文件、结构体、枚举

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1f4c3;个人状态&#xff1a; 研发工程师&#xff0c;现效力于中国工业软件事业 &#x1f680;人生格言&#xff1a; 积跬步…

【Java】高级篇1:异常处理

异常&#xff1a;程序在执行过程中出现的非正常情况&#xff0c;如果不处理最终会导致JVM的非正常停止。 Java的异常抛出机制 Java异常体系 1、Throwable 2、Error和Exception 异常处理方式 1、try-catch-finally&#xff08;捕获异常&#xff09; 基本结构&#xff1a; 使用…

B140XW01 V8 +OZ9956B PDF

B140XW01 V8 PDF OZ9956B 14B38-COW 18650串联50欧点亮一颗灯珠

代码随想录算法训练营第11天| 20. 有效的括号,1047. 删除字符串中的所有相邻重复项,150. 逆波兰表达式求值

系列文章目录 目录 系列文章目录20. 有效的括号利用栈对称匹配将栈中元素弹出与判断栈顶元素是否匹配分开&#xff0c;比较耗时&#xff08;2ms)&#xff1a;若将栈中元素弹出与判断栈顶元素是否匹配放一起&#xff0c;比较节省时间(1ms)&#xff1a; 1047. 删除字符串中的所有…

探索区块链世界:从加密货币到去中心化应用

相信提到区块链&#xff0c;很多人会想到比特币这样的加密货币&#xff0c;但实际上&#xff0c;区块链技术远不止于此&#xff0c;它正在深刻地改变我们的生活和商业。 首先&#xff0c;让我们来简单了解一下什么是区块链。区块链是一种分布式数据库技术&#xff0c;它通过将…

MySQL的insert-on-duplicate语句详解

一、insert-on-duplicate语句语法 注意&#xff1a;ON DUPLICATE KEY UPDATE只是 MySQL的特有语法&#xff0c;并不是SQL标准语法&#xff01; INSERT INTO … ON DUPLICATE KEY UPDATE 是 MySQL 中一种用于插入数据并处理重复键冲突的语法。 这个语法适用于在 insert的时候…

操作系统核心知识点大梳理

计算机结构 现代计算机模型是基于-冯诺依曼计算机模型 计算机在运行时&#xff0c;先从内存中取出第一条指令&#xff0c;通过控制器的译码&#xff0c;按指令的要求&#xff0c;从存储器中取出数据进行指定的运算和逻辑操作等加工&#xff0c;然后再按地址把结果送到内存中去…