混合式A星代码解析_2 规划主程序Planner.cpp

2023-11-20

3.规划程序 Planner.cpp

在main.cpp中,起主要作用的就是:

HybridAStar::Planner hy;
hy.plan();

规划算法都是在HybridAStar::Planner这个类内部进行运算的.所以主要分析以下Planner类.

3.0 实例化的对象

在planner.h中,定义了很多对象,用于最终生成规划路径.

hybridA星生成的路径:

Path path;

用于优化路径的平滑器:

Smoother smoother;

平滑后的路径:

Path smoothedPath = Path(true);

搜索的可视化:

Visualize visualization;

障碍物检测:

CollisionDetection configurationSpace;

voronoi图:

The voronoi diagram

规划时的珊格占用点:

nav_msgs::OccupancyGrid::Ptr grid;

3.1 构造函数 Planner::Planner( )

主要是订阅和发布消息

(1)订阅消息

  • 规划起点:/initialpose
  • 规划终点:/move_base_simple/goal
  • 地图:/map

(2)发布消息

  • 规划起点:/move_base_simple/start

3.2 (核心)规划函数 plan( )

规划路径主函数

3.2.1 外围框架

采用结构的是

if (validStart && validGoal) { }
else{ }

只有当规划的起点和终点都有效时,才会规划路径.

这里就涉及到如何判断规划的起点和终点是否有效的问题.

  • 起点有效的条件有两个(有一个满足就ok):
  1. 如果是在动态地图工作模式下,如果受到了地图消息,就会在回调函数 setMap()中,对start点的有效性进行判断,此时start点会设置成机器的坐标/base_link,如果机器人的坐标位于地图范围内,则start有效.否则无效.
  2. 如果是在静态地图工作模式下,则只在回调函数setStart()中进行判断.
  • 判断终点是否有效的条件就1个,那就是只在回调函数setGoal()中进行判断

3.2.2 定义栅格的尺寸和离散的数量

// ___________________________

// LISTS ALLOWCATED ROW MAJOR ORDER

int width = grid->info.width;

int height = grid->info.height;

int depth = Constants::headings;

int length = width * height * depth;

// define list pointers and initialize lists

Node3D* nodes3D = new Node3D[length]();

Node2D* nodes2D = new Node2D[width * height]();

3.2.3 取出规划的goal和start

// ________________________

// retrieving goal position

float x = goal.pose.position.x / Constants::cellSize;

float y = goal.pose.position.y / Constants::cellSize;

float t = tf::getYaw(goal.pose.orientation);

// set theta to a value (0,2PI]

t = Helper::normalizeHeadingRad(t);

const Node3D nGoal(x, y, t, 0, 0, nullptr);
// _________________________

// retrieving start position

x = start.pose.pose.position.x / Constants::cellSize;

y = start.pose.pose.position.y / Constants::cellSize;

t = tf::getYaw(start.pose.pose.orientation);

// set theta to a value (0,2PI]

t = Helper::normalizeHeadingRad(t);

Node3D nStart(x, y, t, 0, 0, nullptr);

3.2.4 (核心)开始规划并计时

(1)计时:

ros::Time t0 = ros::Time::now();

(2)初始化

// CLEAR THE VISUALIZATION

visualization.clear();

// CLEAR THE PATH

path.clear();

smoothedPath.clear();

(3)(核心)寻找路径(hybridAstar的核心算法)
返回的是符合中goal要求的节点的指针.

// FIND THE PATH

Node3D* nSolution = Algorithm::hybridAStar(nStart, nGoal, nodes3D, nodes2D, width, height, configurationSpace, dubinsLookup, visualization);

(4)跟踪路径
根据goal节点的指针,回溯整个路径.

// TRACE THE PATH

smoother.tracePath(nSolution);

(5)更新路径

// CREATE THE UPDATED PATH

path.updatePath(smoother.getPath());

(6)平滑路径

// SMOOTH THE PATH

smoother.smoothPath(voronoiDiagram);

(7)更新路径

// CREATE THE UPDATED PATH

smoothedPath.updatePath(smoother.getPath());

(8)结束计时

ros::Time t1 = ros::Time::now();

ros::Duration d(t1 - t0);

std::cout << "TIME in ms: " << d * 1000 << std::endl;

(9)发布结果

// _________________________________

// PUBLISH THE RESULTS OF THE SEARCH

path.publishPath();

path.publishPathNodes();

path.publishPathVehicles();

smoothedPath.publishPath();

smoothedPath.publishPathNodes();

smoothedPath.publishPathVehicles();

visualization.publishNode3DCosts(nodes3D, width, height, depth);

visualization.publishNode2DCosts(nodes2D, width, height);

(10)删除节点

delete [] nodes3D;

delete [] nodes2D;

3.3 setGoal()

设置goal,同时判断是否有效.

3.4 setStart()

设置start,同时判断是否有效.

3.5 setMap()

存储地图,如果是动态地图,则判断start是否有效.

3.6 initializeLookups()

没有用到.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合式A星代码解析_2 规划主程序Planner.cpp 的相关文章

随机推荐

  • 华为OD机试 - 食堂供餐(Java)

    题目描述 某公司员工食堂以盒饭方式供餐 为将员工取餐排队时间降低为0 食堂的供餐速度必须要足够快 现在需要根据以往员工取餐的统计信息 计算出一个刚好能达成排队时间为0的最低供餐速度 即 食堂在每个单位时间内必须至少做出多少价盒饭才能满足要求
  • H5微信分享记录

    最近做H5微信分享 用的微信jssdk来做 现记录下一些过程和遇到的问题 一 公众号配置 微信官方文档 已经说明了使用步骤 公众号配置比较模糊 主要是要配置ip白名单和绑定js接口安全域名 1 检查分享接口权限是否已获得 在微信公众号的 设
  • 考虑载波和采样频率的2PSK调制 MATLAB仿真

    功能 生成psk调制信号 创建日期 2016 7 27 创建人 Alice 764499604 qq com clear all close all clc max 100 g zeros 1 max g randint 1 max 长度为
  • CentOS 7 安装 Python 3

    文章目录 前言 操作系统说明 在线安装 离线安装 环境 组件说明 组件用途说明 安装步骤 详细步骤 准备安装 搜集 下载 安装依赖 安装 Python 安装 virtualenv 异常处理 异常信息 原因分析 处理方法 小技巧 前言 推荐在
  • 大学生简单个人静态HTML网页设计作品 DIV布局个人介绍网页模板代码 DW学生个人网站制作成品下载 HTML5期末大作业 (1)

    HTML5期末大作业 动漫电影主题 电影动漫言叶之庭 4页 带音乐 HTML CSS JavaScript 期末作业HTML代码 学生网页课程设计期末作业下载 web网页设计制作成品 大学生毕设网页设计源码HTML 1 临近期末 你还在为H
  • element 中 datepicker设置,只能选中今天以及之前日期

    1 只能选择当前及以后的日期
  • 六,RBAC简介

    六 RBAC RBAC 基于角色的权限控制 role base access control 是一种设计模式 是用来设计和管理权限相关数据的一种模型 RBAC权限数据的管理 都是重复的CRUD的操作 这里我们就不再重复的从0到1开发 我们只
  • 在预训练时使用Warm Up的理解以及loss plateau。

    在预训练时使用Warm Up的理解 之前在wikitext 103上预训练Bert base的时候 发现loss曲线会平一段然后再下降 大概是像下图这样 横轴是step 纵轴是loss 当时的warm up是前16K step 一直以为第二
  • Python3 pip

    Python3 中的 pip 是一个常用的包管理工具 它可以用来下载 安装和卸载 Python 包 以下是一些常用的 pip 命令 1 安装包 pip install package name 例如 要安装 Flask 框架 可以使用命令
  • C++中vector删除指定位置的元素

    1 可以用erase方法删除vector指定位置的元素 2 例程 include
  • IAR 编译异常记录

    问题一 问题描述 WARNING the connected j link is defective proper operation cannot be guaranteed 连接的J Link不良 无法保证正确操作 问题原因 驱动版本与
  • 138-139-----JS基础-----二级菜单-完成基本功能、过渡效果

    一 代码 这两节的代码还是有点的难度的 有这样的需求时 按照类似的接口去做即可 不一定要和他的需求完全一样 因为我看他的需求好像点开另一个 已经打开的选项会被自动关闭 这样感觉不好 因为可能用户有时想要看到所有的选项的要求
  • 五大学科竞赛(五)2018年第二十四届全国青少年信息学奥林匹克联赛初赛

  • 音频增加噪声低通滤波降噪的过程

    啊 clear all close all clc s Fsample B wavread music wav Ts 1 Fsample M length s 获取音频的数据长度 m 0 M 1 figure subplot 3 1 1 p
  • 微服务框架

    微服务框架 1 SOA思想 面向服务的架构 SOA 是一个组件模型 它将应用程序的不同功能单元 称为服务 进行拆分 并通过这些服务之间定义良好的接口和协议联系起来 接口是采用中立的方式进行定义的 它应该独立于实现服务的硬件平台 操作系统和编
  • 区块链数据的存储和更新

    目录 1 引言 2 主要流程 2 1数据库读取 2 1 1 从数据库加载块数据 2 1 2从数据库读取账户信息 2 2 区块链数据更新与回滚 2 2 1 交易数据 2 2 2 块数据 1 引言 在第一篇文章里我们从静态的角度讲解了以太坊的数
  • elasticsearch ES搜索权重设置(boost参数)

    摘要 7 Elasticsearch boost的搜索条件权重 lm324114的专栏 CSDN博客 boost es 摘要2 elasticsearch boost 简书 摘要3 Elasticsearch 10 Boost 提升权重 简
  • flutter ListView 滚动到最后一个items位置

    flutter 想要实现一个listview初始化时和数据变化后显示到列表的最末 简单地说就是像聊天窗或者是日志输出那样的情景 要在Flutter中实现在初始化时和数据变化后将ListView自动定位到最后一个item的位置 你可以使用Sc
  • 基于位置的 AR 应用程序开发最完整指南

    几年前 全世界都为 Pokemon Go 疯狂 虽然这款游戏令人难以置信的受欢迎程度正在缓慢下降 但增强现实已成为科技界的新趋势 并且正在自信地抢占市场份额 2020年 AR市场规模超过141亿美元 预计到2022年底将达到2092亿美元
  • 混合式A星代码解析_2 规划主程序Planner.cpp

    3 规划程序 Planner cpp 在main cpp中 起主要作用的就是 HybridAStar Planner hy hy plan 规划算法都是在HybridAStar Planner这个类内部进行运算的 所以主要分析以下Plann