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

### 记录一下使用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.mzph.cn/diannao/74289.shtml

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

    相关文章

    2025-03-23 吴恩达机器学习3——多维特征

    文章目录 1 多元引入2 矢量化2.1 示例2.2 非矢量化实现2.3 矢量化实现2.4 应用 3 特征缩放3.1 举例3.2 必要性3.3 方法3.3.1 最大最小值缩放&#xff08;Min-Max Scaling&#xff09;3.3.2 均值归一化&#xff08;Mean Normalization&#xff09;3.3.3 Z 分数归一化&#xff08…

    正点原子内存管理学习和修改

    由于项目需要用到内存管理进行动态申请和释放&#xff0c;今天又重新学习了一下正点原子的内存管理实验&#xff0c;温习了一下内存管理的实质。首先先上正点原子内存管理的源代码&#xff1a; malloc.c文件&#xff1a; #include "./MALLOC/malloc.h"#if !(__ARMC…

    时空观测者:俯身拾贝

    目录 中华文明时空贝壳集&#xff08;按时间排序&#xff09;1. 良渚玉琮&#xff08;约公元前3300-2300年&#xff09;2. 三星堆青铜神树&#xff08;公元前1200年&#xff09;3. 殷墟甲骨文&#xff08;约公元前14世纪&#xff09;4. 京杭大运河&#xff08;公元前486年始建&…

    护网期间监测工作全解析:内容与应对策略

    护网期间监测工作全解析&#xff1a;内容与应对策略 一、引言 在数字化浪潮中&#xff0c;网络安全的重要性愈发凸显&#xff0c;护网行动作为保障关键信息基础设施安全的关键举措&#xff0c;备受瞩目。护网期间&#xff0c;监测工作是发现潜在威胁、防范攻击的重要防线。全…

    【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05

    兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 5.zabbix监控HCL模拟网络设备 在保证zabbix-server与HCL网络相通的情况下进行如下操作。 5.1创建主机群 配置-主机群-创建主机群 图 19 取名&#xff0c;添加。 图 20 5.2 创建监控…

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

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

    Spring Boot(十七):集成和使用Redis

    Redis(Remote Dictionary Server,远程字典服务器)是一个开源的、基于内存的数据结构存储系统,它可以用作数据库、缓存和消息中间件。Spring Boot 中集成和使用Redis主要涉及以下几个步骤: 添加依赖 在项目的pom.xml文件中添加Redis的依赖。Spring Boot提供了对Redis的集…

    2025-03-21 Unity 序列化 —— 自定义2进制序列化

    文章目录 前言1 项目结构1.1 整体1.2 代码 2 实现2.1 Processor2.1.1 BaseType2.1.2 CollectionType2.1.3 CustomType 2.2 ByteFormatter2.3 ByteHelper 3 使用 前言 ​ BinaryFormatter 类可以将 C# 类对象快速转换为字节数组数据。 ​ 在网络开发时&#xff0c;不会使用 Bi…

    为WordPress自定义一个留言板

    要在WordPress中创建一个留言反馈表单&#xff0c;并实现后台管理功能&#xff0c;您可以按照以下步骤进行操作&#xff1a; 1. 创建留言反馈表单 首先&#xff0c;您需要使用一个表单插件来创建表单。推荐使用 Contact Form 7 或 WPForms。以下是使用 Contact Form 7 的示例…

    嵌入式项目:利用心知天气获取天气数据实验方案

    【实验目的】 1、利用心知天气服务器获取指定位置天气数据 2、将天气数据解析并可视化显示到OLED屏幕 【实验原理】 【实验步骤】 官网注册

    go-zero学习笔记

    内容不多&#xff0c;只有部分笔记&#xff0c;剩下的没有继续学下去&#xff0c;包括路由与处理器、日志中间件、请求上下文 文章目录 1、go-zero核心库1.1 路由与处理器1.2 日志中间件1.3 请求上下文 1、go-zero核心库 1.1 路由与处理器 package mainimport ("github…

    【Go】Go语言继承-多态模拟

    继承&#xff08;结构体嵌入&#xff09;多态&#xff08;接口实现和空接口&#xff09; 1. 继承&#xff08;结构体嵌入&#xff09; Go 语言没有传统的面向对象的继承机制&#xff0c;但可以通过“结构体嵌入”实现类似继承的效果。 结构体嵌入&#xff1a;在结构体中嵌入另…

    kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?

    kotlin中inline、noinline、crossinline 关键字的作用 在 Kotlin 里&#xff0c;inline、noinline 和 crossinline 这几个关键字和高阶函数紧密相关&#xff0c;它们能够对高阶函数的行为进行优化和控制。下面为你详细阐述它们的作用和原理。 inline 关键字 inline 关键字用…

    LabVIEW FPGA与Windows平台数据滤波处理对比

    LabVIEW在FPGA和Windows平台均可实现数据滤波处理&#xff0c;但两者的底层架构、资源限制、实时性及应用场景差异显著。FPGA侧重硬件级并行处理&#xff0c;适用于高实时性场景&#xff1b;Windows依赖软件算法&#xff0c;适合复杂数据处理与可视化。本文结合具体案例&#x…

    深度解析 Android Matrix 变换(二):组合变换 pre、post

    前言 在上一篇文章中&#xff0c;我们讲解了 Canvas 中单个变换的原理和效果&#xff0c;即缩放、旋转和平移。但是单个旋转仅仅是基础&#xff0c;Canvas 变换最重要的是能够随意组合各种变换以实现想要的效果。在这种情况下&#xff0c;就需要了解如何组合变换&#xff0c;以…

    Java并发编程之CountDownLatch

    1. 基本原理 计数器 CountDownLatch 在创建时需要指定一个初始计数值。这个值通常代表需要等待完成的任务数或线程数。 等待与递减 等待&#xff1a;调用 await() 方法的线程会被阻塞&#xff0c;直到计数器变为 0。递减&#xff1a;每当一个任务完成后&#xff0c;应调用 cou…

    C++|GLog开源库的使用 如何实现自定义类型消息日志

    参考&#xff1a; C glog使用教程与代码演示 C第三方日志库Glog的安装与使用超详解 GLOG从入门到入门 glog 设置日志级别_glog C版本代码分析 文章目录 日志等级自定义消息创建使用宏定义 日志等级 在 glog 中&#xff0c;日志的严重性是通过 LogSeverity 来区分的&#xff0c…

    FAQ - VMware vSphere Web 控制台中鼠标控制不了怎么办?

    问题描述 在VMware vSphere vCenter Server 的 Web 控制台中新建了一台 Windows Server 2008 R2 虚拟机&#xff0c;但是鼠标进入控制台后&#xff0c;可以看见鼠标光标&#xff0c;但是移动却没有反应。 根因分析 暂无。 解决方案 选中虚拟机>操作>编辑设置>添加新…

    Rust+WebAssembly:开启浏览器3D渲染新时代

    引言 在当今的 Web 开发领域&#xff0c;随着用户对网页交互体验的要求日益提高&#xff0c;3D 渲染技术在 Web 应用中的应用愈发广泛。从沉浸式的 Web 游戏&#xff0c;到逼真的虚拟展示场景&#xff0c;3D 渲染引擎承担着将虚拟 3D 世界呈现到用户浏览器中的关键任务。其性能…

    在小米AX6000中添加tailscale monitor

    经过测试&#xff0c;发现小米路由器中的tailscale可能会因为某种原因状态异常&#xff0c; 为了让tailscale恢复正常&#xff0c;所以又写了monitor用来监控&#xff1a; #!/bin/sh# Define Tailscale related paths TAILSCALED_PATH"/tmp/tailscale/tailscale_1.80.3_a…