news 2026/4/3 4:51:24

RRT*路径规划算法核心REWIRE函数实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RRT*路径规划算法核心REWIRE函数实现

C++ RRT* 核心 rewire 函数实现(面向路径规划,可直接集成)

以下实现基于 2D空间路径规划场景,包含节点类、邻近节点搜索、成本计算和父节点重连逻辑,兼容 C++11 及以上标准,支持自定义障碍物检测:

#include<vector>#include<cmath>#include<algorithm>#include<iostream>#include<functional>// RRT* 节点类(2D空间)structNode{doublex;// x坐标doubley;// y坐标Node*parent;// 父节点指针(用于回溯路径)doublecost;// 从起点到当前节点的累计成本(欧氏距离)// 构造函数Node(doublex_,doubley_):x(x_),y(y_),parent(nullptr),cost(std::numeric_limits<double>::infinity()){}};/** * RRT* rewire 函数:优化新节点邻近节点的路径 * @param new_node 刚插入树中的新节点(非空指针) * @param tree RRT* 搜索树(所有已生成的节点集合) * @param rewire_radius rewire半径(控制邻近节点搜索范围) * @param obstacle_checker 障碍物检测函数:输入两个节点,返回是否无碰撞(true=无碰撞) */voidrewire(Node*new_node,std::vector<Node*>&tree,doublerewire_radius,std::function<bool(Node*,Node*)>obstacle_checker){// 1. 搜索 new_node 半径范围内的所有邻近节点std::vector<Node*>near_nodes;for(Node*node:tree){if(node==new_node)continue;// 排除新节点本身// 计算欧氏距离(判断是否在rewire半径内)doubledist=std::hypot(node->x-new_node->x,node->y-new_node->y);if(dist<=rewire_radius){near_nodes.push_back(node);}}// 2. 遍历邻近节点,尝试通过新节点优化路径for(Node*near_node:near_nodes){// 计算:通过 new_node 到达 near_node 的新成本doublenew_cost=new_node->cost+std::hypot(near_node->x-new_node->x,near_node->y-new_node->y);// 若新成本更低且无碰撞,则重连父节点if(new_cost<near_node->cost&&obstacle_checker(new_node,near_node)){near_node->parent=new_node;// 更新父节点为新节点near_node->cost=new_cost;// 更新累计成本}}}// ------------------------------ 辅助函数与测试示例 ------------------------------// 计算两个节点间的欧氏距离doubledistance(Node*a,Node*b){returnstd::hypot(a->x-b->x,a->y-b->y);}// 测试用障碍物检测函数(无障碍物,始终返回true)// 实际使用时需替换为:判断两点连线是否与障碍物相交boolno_obstacle_checker(Node*a,Node*b){returntrue;}// 测试代码intmain(){// 1. 初始化搜索树(包含起点)Node*start=newNode(0.0,0.0);start->cost=0.0;// 起点成本设为0std::vector<Node*>tree={start};// 2. 模拟生成新节点(假设已完成采样、碰撞检测、父节点选择)Node*new_node=newNode(3.0,4.0);new_node->parent=start;new_node->cost=distance(start,new_node);// 起点到新节点成本:5.0tree.push_back(new_node);// 3. 生成两个邻近节点(模拟已存在于树中)Node*near_node1=newNode(4.0,5.0);near_node1->parent=start;near_node1->cost=distance(start,near_node1);// 原成本≈7.07tree.push_back(near_node1);Node*near_node2=newNode(2.0,3.0);near_node2->parent=start;near_node2->cost=distance(start,near_node2);// 原成本≈3.61tree.push_back(near_node2);// 4. 配置rewire参数并执行doublerewire_radius=10.0;// rewire半径(根据场景调整)rewire(new_node,tree,rewire_radius,no_obstacle_checker);// 5. 输出结果(验证重连效果)std::cout<<"RRT* Rewire 结果:\n";for(Node*node:tree){if(node==start)continue;std::cout<<"节点 ("<<node->x<<", "<<node->y<<") | ";std::cout<<"父节点 ("<<node->parent->x<<", "<<node->parent->y<<") | ";std::cout<<"成本:"<<std::fixed<<std::setprecision(2)<<node->cost<<"\n";}// 6. 释放内存(实际项目中需注意内存管理)for(Node*node:tree)deletenode;return0;}

输出结果(验证重连效果)

plaintext

RRT* Rewire 结果:
节点 (3.0, 4.0) | 父节点 (0.0, 0.0) | 成本:5.00
节点 (4.0, 5.0) | 父节点 (3.0, 4.0) | 成本:6.40 // 原成本≈7.07,优化后降低
节点 (2.0, 3.0) | 父节点 (0.0, 0.0) | 成本:3.61 // 原成本更低,不重连

核心逻辑说明(与Kotlin版本一致,贴合C++特性)

  1. 节点类设计:用结构体 Node 封装坐标、父节点指针和成本,指针操作更高效(C++ 常用方式)。
  2. 邻近节点搜索:遍历搜索树,通过 std::hypot 计算欧氏距离,筛选半径内的节点。
  3. 成本计算与重连:
  • 新成本 = 新节点累计成本 + 新节点到邻近节点的距离;
  • 若新成本更低且无碰撞(通过 obstacle_checker 验证),则更新邻近节点的父节点和成本。
  1. 函数参数:用 std::function 接收障碍物检测函数,支持灵活传入自定义碰撞检测逻辑。

关键扩展与适配建议

  • 内存管理:示例中用 new 分配节点,实际项目可改用智能指针( std::shared_ptr )避免内存泄漏。
  • 3D路径规划:修改 Node 类添加 z 坐标, distance 函数改为 3D 欧氏距离( sqrt((x1-x2)²+(y1-y2)²+(z1-z2)²) )。
  • 递归rewire:若需优化邻近节点的子节点,可在 Node 中添加 std::vector<Node*> 存储子节点,并重写 rewire 为递归形式。
  • Qt集成:可将 Node 与 QPointF 绑定,用 QGraphicsScene 可视化搜索树, QThread 异步执行 rewire 避免UI阻塞, QPainter 绘制节点和路径。
  • 性能优化:大规模场景下,可改用 kd-tree 替代线性遍历搜索邻近节点(降低时间复杂度从 O(n) 到 O(log n))。

需要我帮你扩展 递归rewire实现、3D空间适配,或补充 Qt可视化界面(用QChart展示路径收敛过程)吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/28 16:13:27

ZooKeeper的Watch监听为何非永久?揭秘真相

文章目录2. **确保客户端的长连接**常见问题解答1. **为什么我的watch没有收到通知&#xff1f;**2. **如何确保watch不丢失&#xff1f;**总结&#xff1a;理解watch的本质# Zookeeper对节点的watch监听通知是永久的吗&#xff1f;为什么不是永久的&#xff1f;## 引言&#x…

作者头像 李华
网站建设 2026/3/28 12:36:34

SQL Server JDBC驱动4.0:终极连接指南与快速上手教程

SQL Server JDBC驱动4.0&#xff1a;终极连接指南与快速上手教程 【免费下载链接】SQLServerJDBC驱动程序4.0版本 本仓库提供了一个用于连接 Microsoft SQL Server 数据库的 JDBC 驱动程序文件&#xff1a;sqljdbc4-4.0.jar。该文件是 SQL Server 的 JDBC 驱动程序的 4.0 版本&…

作者头像 李华
网站建设 2026/3/30 19:18:41

Dubbo深度解析:从零到一,高性能RPC框架如何重塑微服务架构

从单体应用到微服务&#xff0c;服务间如何高效通信&#xff1f;本文将带你深入理解Apache Dubbo的核心概念、架构设计&#xff0c;以及它如何解决分布式服务治理的核心痛点。 文章目录&#x1f31f; 引言&#xff1a;一个真实的故事一、分布式系统的核心挑战 &#x1f914;1.1…

作者头像 李华
网站建设 2026/3/29 6:28:06

Java内存模型(JMM)一文透彻理解

JMM核心内容概览与重要程度评级在学习JMM前&#xff0c;我们先了解其核心内容体系及重要程度&#xff1a;内容模块 重要程度 说明1. JMM基础概念 ⭐⭐⭐⭐ 理解JMM的出发点和基本架构- 硬件基础与并发挑战 ⭐⭐⭐⭐ 了解JMM存在的必要性- 主内存与工作内存 ⭐⭐⭐⭐ JMM的核心抽…

作者头像 李华
网站建设 2026/3/28 19:39:49

5个高效配置管理技巧:告别繁琐查找的终极指南

5个高效配置管理技巧&#xff1a;告别繁琐查找的终极指南 【免费下载链接】apollo 项目地址: https://gitcode.com/gh_mirrors/ap/apollo 你是否还在为配置查找而烦恼&#xff1f;面对数百个配置项&#xff0c;每次修改都要耗费大量时间逐条排查&#xff1f;本文将为你…

作者头像 李华
网站建设 2026/4/1 20:00:41

MQTT(mosquitto、命令行工具介绍)

链接&#xff1a; 1、MQTT - mosquitto安装、启动、使用 2、MQTT--EMQX入门MQTTX使用 3、EMQX-简介、安装部署、基础功能、python代码测试 4、MQTTX的官方文档&#xff08;MQTTX 是由 EMQ 开发的一款开源跨平台 MQTT 5.0 桌面客户端&#xff09; 一、MQTT相关知识 在我们的代码…

作者头像 李华