【基于ROS的A*算法实现路径规划】A* | ROS | 路径规划 | Python

news2025/3/25 8:58:37

### 记录一下使用Python实现ROS平台A*算法路径规划 ###

代码可自取  :Xz/little_projecthttps://gitee.com/Xz_zh/little_project.git


    目录

    一、思路分析

    二、算法实现

    三、路径规划实现


    一、思路分析

            要求使用A*算法实现路径规划,可以将该任务分为三大部分内容。首先需要对输入的图片和起点终点进行处理,其次就是通过A*算法输出规划的路径,最后再对路径进行处理并实现可视化。

            其中第一部分需要对输入的地图进行处理,将世界地图转化为栅格地图,如果是彩色地图还需要进行灰度处理并进行二值化处理(判断障碍点),存入相关信息。第二部分A*算法通过代价函数,遍历从起点到终点的路径点并找到f值最小的路径。最后需要将A*算法返回的栅格路径转化为世界地图坐标,再进行可视化。

            伪代码:

    # 初始化 ROS 节点
    初始化 ROS 节点 "astar_planner"
    订阅 "/map" 以获取 OccupancyGrid 地图
    订阅 "/move_base_simple/goal" 以获取 Rviz 选取的目标点
    发布 "/astar_path" 以发布路径
     
    # 处理地图数据
    函数 map_callback(msg):
        解析地图信息(宽度、高度、分辨率、原点)
        转换为二值栅格地图(障碍物=1, 可通行=0)
     
    # 世界坐标 <-> 栅格坐标转换
    函数 world_to_map(x, y):
        计算栅格坐标并限制范围
     
    函数 map_to_world(map_x, map_y):
        计算世界坐标
     
    # 处理选取的目标点
    函数 clicked_point_callback(msg):
        解析 Rviz 选取的点,转换为栅格坐标
        如果没有起点,设置为起点
        如果已经有起点,设置终点并运行 A* 规划
        调用 publish_path() 发送路径
     
    # A* 算法
    函数 astar(grid_map, start, end):
        初始化 开放列表 open_list,关闭集合 closed_set
        创建起点、终点节点
        while open_list 不是空:
            取出 f 最小的节点 current_node
            如果 current_node == 终点:
                回溯生成路径
                返回路径
            遍历当前节点的四个邻居:
                如果邻居是障碍物或已在 closed_set,跳过
                计算 g, h, f
                如果 f 值比 open_list 中的同位置节点更优,加入 open_list
        返回 None(无可行路径)
     
    # 发布路径
    函数 publish_path(path):
        构建 Path 消息
        依次添加路径点,转换回世界坐标
        发布 "/astar_path"

    二、算法实现

            A*算法是一种有序的搜索算法,常常用于优化问题求取最短路径。其特点主要在于对估价函数的定义上。A*算法主要通过其估价函数f^{^*}(n)来计算各点之间的代价值,从而找到代价最小的路径即为最优路径。估价函数 f(n)用于评估从起点经过当前节点 nn 到目标节点的总代价,其公式为:

    f(n)=g(n) + h(n)

    • g(n):从起点到当前节点 nn 的实际代价(已知值)。
    • h(n):从当前节点 nn 到目标节点的启发式估计代价(预测值)。通常情况下利用曼哈顿函数计算。

    这里关于A*算法的原理不在赘述。

            由于需要存储遍历点的上一节点和对应的f 值,这里可以利用类实现。每个点是Node类的对象,每个点有position(当前点的坐标)、parent(父节点坐标)、g、h、f(代价函数)。

    为了方便计算h值,封装曼哈顿函数:

    核心算法

    三、路径规划实现

    首先开启ROS核心

    启动map_server加载PGM图像

    运行A*算法代码

    Rviz实现规划路径可视化

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

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

    相关文章

    keda基于postgresql伸缩dify-api服务

    1 概述 dify-api使用postgresql来存储数据&#xff0c;在dify控制台每新建一个聊天机器的聊天框&#xff0c;就会在conversations表里新插入一条记录&#xff0c;并且不断地更新字段updated_at&#xff0c;示例如下&#xff1a; dify# select * from conversations limit 1; …

    趣味极简品牌海报艺术贴纸设计圆润边缘无衬线粗体装饰字体 Chunko Bold - Sans Serif Font

    Chunko Bold 是一种功能强大的显示字体&#xff0c;体现了大胆极简主义的原则 – 当代设计的主流趋势。这种自信的字体将粗犷的几何形状与现代的趣味性相结合&#xff0c;具有圆润的边缘和强烈的存在感&#xff0c;与当今的极简主义设计方法完美契合。无论是用于鲜明的构图还是…

    指针,数组 易混题解析(一)

    目录 一.相关知识点 1.数组名是什么&#xff1f; 两个例外&#xff1a; 2.strlen 3.sizeof 4. * ( ) 与 [ ] 的互换 二.一维数组 三.字符数组 1. 字符 &#xff08;1&#xff09;sizeof &#xff08;2&#xff09;strlen 2.字符串 &#xff08;1&#xff09;si…

    2025前端面试题记录

    vue项目目录的执行顺序是怎么样的&#xff1f; 1、package.json   在执行npm run dev时&#xff0c;会在当前目录寻找package.json文件&#xff0c;此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js   对…

    复变函数摘记2

    复变函数摘记2 3. 级数3.1 复数项级数3.2 复变幂级数3.3 泰勒级数3.4 洛朗级数 3. 级数 \quad 复数项级数的一般项 α n a n i b n \alpha_na_n\text{i}b_n αn​an​ibn​ 为复数&#xff0c;与高等数学中无穷级数的分析方式类似&#xff0c;也是通过和函数来研究级数的收敛…

    高频面试题(含笔试高频算法整理)基本总结回顾67

    干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

    Kafka--常见问题

    1.为什么要使用 Kafka&#xff0c;起到什么作用 Kafka是一个高吞吐量、分布式、基于发布订阅的消息系统&#xff0c;它主要用于处理实时数据流 Kafka 设计上支持高吞吐量的消息传输&#xff0c;每秒可以处理数百万条消息。它能够在处理大量并发请求时&#xff0c;保持低延迟和…

    优选算法的睿智之林:前缀和专题(一)

    专栏&#xff1a;算法的魔法世界 个人主页&#xff1a;手握风云 目录 一、前缀和 二、例题讲解 2.1. 一维前缀和 2.2. 二维前缀和 2.3. 寻找数组的中心下标 2.4. 除自身以外数组的乘积 一、前缀和 前缀和算法是一种用于处理数组或序列数据的算法&#xff0c;其核心思想是…

    【清华大学】AIGC发展研究(3.0版)

    目录 AIGC发展研究报告核心内容一、团队简介二、AI哲学三、国内外大模型四、生成式内容&#xff08;一&#xff09;文本生成&#xff08;二&#xff09;图像生成&#xff08;三&#xff09;音乐生成&#xff08;四&#xff09;视频生成 五、各行业应用六、未来展望 AIGC发展研究…

    JavaSE1.0(基础语法之运算符)

    算术运算符 基础运算之加 减 乘 除 取余&#xff08; - * / %&#xff09; 运算符之相加&#xff08; &#xff09; public static void main(String[] args) {System.out.println("Hello world!");int a 10;int b 20;int c a b;System.out.println(c);//…

    蓝桥与力扣刷题(蓝桥 数的分解)

    题目&#xff1a;把 2019分解成 3个各不相同的正整数之和&#xff0c;并且要求每个正整数都不包含数字 2 和 4&#xff0c;一共有多少种不同的分解方法&#xff1f; 注意交换 3 个整数的顺序被视为同一种方法&#xff0c;例如 1000100118和 1001100018 被视为同一种。 解题思…

    Java IO 流:从字节到字符再到Java 装饰者模式(Decorator Pattern),解析与应用掌握数据流动的艺术

    在 Java 编程中&#xff0c;IO&#xff08;输入输出&#xff09;流是处理数据输入输出的核心工具。无论是读取文件、网络通信&#xff0c;还是处理用户输入&#xff0c;IO 流都扮演着重要角色。本文将深入探讨 Java IO 流的核心概念、分类、经典代码实例及其应用场景&#xff0…

    爬虫案例-爬取某站视频

    文章目录 1、下载FFmpeg2、爬取代码3、效果图 1、下载FFmpeg FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。 点击下载: ffmpeg 安装并配置 FFmpeg 步骤&#xff1a; 1.下载 FFmpeg&#xff1a; 2.访问 FFmpeg 官网。 3.选择 Wi…

    nacos-未经授权创建用户漏洞

    1、修改配置文件 vim application.properties# 修改配置项 nacos.core.auth.enabledtrue nacos.core.auth.enable.userAgentAuthWhitefalse2、重启nacos systemctl restart nacos3、验证 打开nacos部署服务器输入命令 curl -XPOST -d “usernametest123&passwordtest!123…

    C++:IO库

    一、C IO库的架构 C标准库中的IO系统基于流&#xff08;Stream&#xff09;​的概念&#xff0c;分为三层结构&#xff1a; ​流对象​&#xff08;如cin, cout, fstream&#xff09;​流缓冲区​&#xff08;streambuf&#xff0c;负责底层数据处理&#xff09;​数据源/目的…

    企业级前端架构设计与实战

    一、架构设计核心原则 1.1 模块化分层架构 典型目录结构&#xff1a; src/├── assets/ # 静态资源├── components/ # 通用组件├── pages/ # 页面模块├── services/ # API服务层├── store/ # 全局状态管理├── uti…

    从入门到精通【MySQL】 CRUD

    文章目录 &#x1f4d5;1. Create 新增✏️1.1 单行数据全列插入✏️1.2 单行数据指定列插入✏️1.3 多行数据指定列插入 &#x1f4d5;2. Retrieve 检索✏️2.1 全列查询✏️2.2 指定列查询✏️2.3 查询字段为表达式✏️2.4 为查询结果指定别名✏️2.5 结果去重查询 &#x1f…

    08_双向循环神经网络

    双向网络 概念 双向循环神经网络&#xff08;Bidirectional Recurrent Neural Network, BiRNN&#xff09;通过同时捕捉序列的正向和反向依赖关系&#xff0c;增强模型对上下文的理解能力。与传统的单向网络不同,BIRNN 能够同时从过去和未来的上下文信息中学习,从而提升模型的…

    2025年Postman的五大替代工具

    虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

    (四)---四元数的基础知识-(定义)-(乘法)-(逆)-(退化到二维复平面)-(四元数乘法的导数)

    使用四元数的原因 最重要的原因是因为传感器的角速度计得到的是三个轴的角速度, 这三个轴的角速度合成一个角速度矢量, 结果就是在微小时间内绕着这个角速度矢量方向为轴旋转一定角度. 截图来源网址四元数 | Crazepony开源四轴飞行器