混合A*路径规划器 (Hybrid A* Path Planner)

混合A路径规划器 (Hybrid A Path Planner)

本仓库包含了一个用于非完整约束车辆(non-holonomic vehicles)的实时路径规划代码,该代码使用了混合A*(Hybrid-A*)算法。关于混合A*算法的描述,请参见《自动驾驶路径规划中的实用搜索技术》。

项目背景

此代码是自动地面车辆(AGV)研究小组的一个项目成果。我们已经在实验室的测试车辆Eklavya上成功测试了这段代码。在实验中,我们使用GPS航点作为目标,并通过安装在车辆前端的激光雷达(LIDAR)生成二进制障碍物地图。传感器接口方面,我们采用了ROS(机器人操作系统)。

算法描述

混合A算法使用了一个三维离散搜索空间,但与传统的A不同的是,它为每个网格单元关联了一个连续的三维车辆状态。这样可以确保生成的路径是可行驶的(而标准A*只能产生分段线性的路径)。

搜索过程由两个启发式规则指导:

  1. 无障碍物非完整约束(Non-Holonomic Without Obstacles):采用Dubin’s路径长度计算方法,忽略障碍物的存在。
  2. 有障碍物完整约束(Holonomic With Obstacles):使用Dijkstra算法在二维平面上计算最短路径,同时忽略了车辆的完整约束条件。

为了提高搜索速度,算法会在接近目标时,利用Dubins路径分析扩展节点,并检查这些路径是否与当前的障碍物地图发生碰撞。

在这里插入图片描述

改进点
  • 3D离散搜索空间:相较于传统A*,混合A*不仅考虑位置信息,还考虑了方向和姿态等连续状态变量,从而保证了路径的实际可执行性。
  • 双重启发式规则:结合了非完整约束下的最优路径估算以及考虑障碍物的最短路径规划,提高了搜索效率和路径质量。
  • 快速收敛机制:针对靠近目标区域的节点,采用解析方法进行扩展,减少了不必要的计算开销,加快了搜索进程。
    在这里插入图片描述
应用场景
#include "../include/Gui.hpp"

GUI::GUI(int rows, int cols){
	display_size=cv::Size(rows, cols);
	display=Mat(display_size, CV_8UC3, Scalar(220,220,220));
}

void GUI::drawCar(State src){
	RotatedRect rotRect = RotatedRect(Point2f(src.x*display_size.width/MAPX, src.y*display_size.height/MAPY), Size2f(BOT_L*display_size.width/MAPX, BOT_W*display_size.height/MAPY), src.theta*Theta_Res);
	Point2f vert[4];
	rotRect.points(vert);
	for(int i=0;i<4;i++)
		line(display, vert[i], vert[(i+1)%4], Scalar(200, 0, 0));

	circle(display, Point2f((src.x + 17*cos(src.theta*2.0*PI/Theta))*display_size.width/MAPX, (src.y + 17*sin(src.theta*2.0*PI/Theta))*display_size.width/MAPX), 5, Scalar(255, 0, 0));
}

void GUI::drawObs(Map map){
	for(int i=0;i<MAPX;i++)
		for(int j=0;j<MAPY;j++)
			if(map.obs_map[i][j]){

				for(int k=i*display_size.width/MAPX;k<(i+1)*display_size.width/MAPX;k++)
					for(int l=j*display_size.height/MAPY;l<(j+1)*display_size.height/MAPY;l++){
						display.at<Vec3b>(l,k)={128, 128, 128};
					}
			}
}

void GUI::markPoint(int i, int j){
	if(i<0 || i>MAPX || j<0 || j>MAPY)
		return;

	for(int k=i*display_size.width/MAPX;k<(i+1)*display_size.width/MAPX;k++)
		for(int l=j*display_size.height/MAPY;l<(j+1)*display_size.height/MAPY;l++){
						display.at<Vec3b>(k,l)={0, 255, 0};
					}
}

void GUI::show(int t){
	Mat temp=display;
	//resize(display, temp, display_size);
	imshow("Display", temp);
	waitKey(t);
	return;
}

该路径规划器适用于各种需要精确路径规划的应用场景,特别是在复杂环境下的自主导航任务中表现出色。例如,在城市道路、工业厂房或农业领域内,对于无人配送车、自动叉车或者智能农机等设备来说,混合A*算法能够提供安全可靠的路径解决方案。
在这里插入图片描述

请注意,上述内容基于原文进行了翻译和适当扩充,以确保信息完整性和表达清晰度。实际应用和技术细节可能会随着研究进展而有所变化。

### 动态A*路径规划算法在ROS中的实现 #### 背景介绍 动态A*(Dynamic A* Lite 或者 D* Lite)是一种用于实时环境下的路径重规划算法,在机人导航领域应用广泛。该算法能够在环境中存在未知障碍物的情况下,有效地找到从起点到终点的最佳路径[^1]。 #### 实现概述 为了实现在ROS环境下运行D* Lite或类似的动态A*算法,通常需要创建一个ROS包来封装此功能。这个包会订阅来自激光雷达或其他传感的数据以更新地图信息,并发布计算得到的新路径给移动平台执行。此外还需要配置launch文件以便启动所有必要的节点和服务。 #### 关键组件说明 - **Costmap_2d**: 使用costmap_2d库可以方便地处理二维栅格地图上的代价函数表示法,这对于支持任何基于网格的地图都是至关重要的。 - **Move_base**: move_base是一个集成多种导航模块的核心框架,它能够接收全局目标位置并调用局部避障生成安全轨迹;对于自定义路径规划来说,则可以通过插件机制将其接入move_base体系内工作。 - **Custom Planner Node (C++)** 下面给出了一段简化版的代码片段作为例子展示如何编写这样一个定制化的路径规划节点: ```cpp #include <ros/ros.h> // ...其他头文件... class DynamicPlanner { public: void initialize() { /* 初始化逻辑 */ } std::vector<geometry_msgs::PoseStamped> makePlan(const geometry_msgs::PoseStamped& start, const geometry_msgs::PoseStamped& goal) { // 这里放置具体的D* Lite/A*算法实现... return path; } private: nav_core::BaseLocalPlanner* local_planner_; }; int main(int argc, char** argv){ ros::init(argc, argv, "dynamic_astar_node"); DynamicPlanner planner; planner.initialize(); while(ros::ok()){ // 主循环体... } } ``` 上述代码展示了基本结构,实际开发过程中还需考虑更多细节如参数服务设置、TF变换监听等功能接口的设计。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值