Hybrid A*——ROS实现带有车辆运动学约束的路径规划算法

本文旨在帮助读者完成2D栅格地图上的RS-A*路径规划算法,便于进行车辆导航。

废话不多说,直接开始!

一、2D栅格地图准备

2D栅格地图有两种途径:

1. 2D激光SLAM算法直接获取;

2. 3D激光SLAM算法获取点云地图后投影获取:3D激光SLAM点云地图pcd转导航可用的2D栅格地图_pcd2pgm-CSDN博客

二、Hybrid A*算法

安装Hybrid A*:

#创建工作空间
mkdir -p ~/hy_astar/src
cd ~/hy_astar/src
catkin_init_workspace
 
#克隆代码
git clone https://github.com/zm0612/Hybrid_A_Star.git

将所得的2D栅格地图pgm文件复制到Hybrid_A_Star/maps下,并替换Hybrid_A_Star/maps下的yaml文件。

一般情况下我们的栅格地图的分辨率均为0.05,将Hybrid_A_Star/src/hybrid_a_star_flow.cpp中的:

        const double map_resolution = 0.2;
        kinodynamic_astar_searcher_ptr_->Init(
                current_costmap_ptr_->info.origin.position.x,
                1.0 * current_costmap_ptr_->info.width * current_costmap_ptr_->info.resolution,
                current_costmap_ptr_->info.origin.position.y,
                1.0 * current_costmap_ptr_->info.height * current_costmap_ptr_->info.resolution,
                current_costmap_ptr_->info.resolution,
                map_resolution
        );

        unsigned int map_w = std::floor(current_costmap_ptr_->info.width / map_resolution);
        unsigned int map_h = std::floor(current_costmap_ptr_->info.height / map_resolution);
        for (unsigned int w = 0; w < map_w; ++w) {
            for (unsigned int h = 0; h < map_h; ++h) {
                auto x = static_cast<unsigned int> ((w + 0.5) * map_resolution
                                                    / current_costmap_ptr_->info.resolution);
                auto y = static_cast<unsigned int> ((h + 0.5) * map_resolution
                                                    / current_costmap_ptr_->info.resolution);

                if (current_costmap_ptr_->data[y * current_costmap_ptr_->info.width + x]) {
                    kinodynamic_astar_searcher_ptr_->SetObstacle(w, h);
                }
            }
        }

修改为:

        const double map_resolution = 0.05;
        kinodynamic_astar_searcher_ptr_->Init(
                current_costmap_ptr_->info.origin.position.x,
                1.0 * current_costmap_ptr_->info.width * current_costmap_ptr_->info.resolution,
                current_costmap_ptr_->info.origin.position.y,
                1.0 * current_costmap_ptr_->info.height * current_costmap_ptr_->info.resolution,
                current_costmap_ptr_->info.resolution,
                map_resolution);
        unsigned int map_w = std::floor(current_costmap_ptr_->info.width);
        unsigned int map_h = std::floor(current_costmap_ptr_->info.height);

        for (unsigned int w = 0; w < map_w; ++w)
        {
            for (unsigned int h = 0; h < map_h; ++h)
            {
                if (current_costmap_ptr_->data[h * current_costmap_ptr_->info.width + w] > 0)
                {                   
                    kinodynamic_astar_searcher_ptr_->SetObstacle(w, h); 
                }
            }
        }   

注意这里的map_resolution应与yaml中一致,修改之后完成编译:

cd ~/hy_astar
catkin_make

三、运行

编译完成后运行代码:

cd ~/hy_astar
source devel/setup.bash
roslaunch hybrid_a_star run_hybrid_a_star.launch

运行成功打开rviz界面,在地图的可行区域内用rviz中的2D Pose Estimate设置规划起点,用2D Nav Goal设置终点,短暂等待后规划出一条基于RS曲线的符合车辆运动学约束的路径:

至此,便完成了符合车辆运动学约束的路径规划!

如需适配到其他模块,例如自动生成轨迹,替换由手动给定起始末端位姿方式,则需修改Hybrid_A_Star/src/hybrid_a_star_flow.cpp中订阅的/initialpose和/move_base_simple/goal话题!

另外以上代码在碰撞检测时,将车辆轮廓限定为矩形,矩形大小通过Hybrid_A_Star/src/hybrid_a_star.cpp的SetVehicleShape函数设定,适配自己的车型需要修改其函数参数。

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
人工势场法是一种基于势场理论的路径规划算法,通过定义势场和势能函数来规划机器人的路径。人工势场法主要分为引力场和斥力场两部分。 引力场用于吸引机器人朝目标点前进,斥力场则避免机器人与障碍物发生碰撞。在ROS中,可以实现人工势场法结合A*算法进行路径规划。 首先,通过ROS提供的激光雷达或者摄像头等传感器获取环境信息,将障碍物的位置信息传入人工势场算法中。 其次,定义势场,引力场和斥力场可以用公式表示。引力场通过计算机器人与目标点之间的距离,产生一个吸引机器人朝目标点前进的力。斥力场则通过计算机器人与障碍物之间的距离,产生一个使机器人远离障碍物的力。 然后,将引力场和斥力场的力叠加起来,得到机器人在当前位置的合力向量。该合力向量会影响机器人的运动方向和速度。 接下来,通过A*算法来寻找机器人的路径。A*算法是一种启发式搜索算法,可以在有向图中寻找最短路径。在ROS中,可以使用navfn或global_planner等已有的A*算法实现路径搜索。 最后,将A*算法得到的路径与人工势场法得到的合力向量结合起来,得到机器人的最佳移动路径。通过控制机器人按照最佳移动路径进行移动,完成路径规划。 综上所述,ROS可以实现人工势场法结合A*算法进行路径规划。使用激光雷达或者摄像头等传感器获取环境信息,定义势场,计算合力向量,进行A*算法路径搜索,最终得到机器人的最佳移动路径。这种方法可以在复杂环境下高效地规划机器人的路径
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值