Hybrid Astar 算法剖析和实现
Posted 穿越临界点
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hybrid Astar 算法剖析和实现相关的知识,希望对你有一定的参考价值。
在学习资料满天飞的大环境下,知识变得非常零散,体系化的知识并不多,这就导致很多人每天都努力学习到感动自己,最终却收效甚微,甚至放弃学习。我的使命就是过滤掉大量的无效信息,将知识体系化,以短平快的方式直达问题本质,把大家从大海捞针的痛苦中解脱出来。
文章目录
0 前言
本篇继续介绍节点拓展的内容,以及示例代码实现。
1 碰撞检测和边界检测
上一篇(Hybrid Astar 算法剖析和实现(五)_穿越临界点的博客-CSDN博客)讲到中间节点的存在就是为了进行相对可靠的碰撞检测。
节点每次拓展都要进行碰撞检测和边界检测(边界检测可以理解为碰撞检测的一种)。
节点每次拓展需要检测几次边界内的碰撞呢?有几个中间节点(包括最后一个节点)就要检测几次。
节点每次拓展需要做几次边界碰撞检测呢?只需要做一次。
2 节点状态离散化
按照上篇中的公式进行节点拓展后,得到的是节点连续状态空间 ( x , y , θ ) (x,y,\\theta) (x,y,θ),需要将其离散化后映射到状态栅格中,这样做是为了方便识别两个节点状态是否是同一个节点状态。
离散化请参考 Hybrid Astar 算法剖析和实现(二)_穿越临界点的博客-CSDN博客
3 代码实现
为了将抽象概念具体化,下面给出节点拓展流程的示例代码。
/*依据当前节点获得邻居节点(节点拓展)*/
void HybridAStar::GetNeighborNodes(const StateNode& curr_node,
std::vector<StateNode> &neighbor_nodes)
neighbor_nodes.clear();
/*第一次循环是对前轮转角的离散*/
for (int i = -steering_discrete_num_; i <= steering_discrete_num_; ++i)
VectorVec3d intermediate_state;
bool has_obstacle = false;
double x = curr_node.state_.x();
double y = curr_node.state_.y();
double theta = curr_node.state_.z();
const double phi = i * steering_radian_step_size_;
// forward:v取正向最大值
/*该层循环实质上是对时间t进行离散,这里用前进距离等效*/
for (int j = 1; j <= segment_length_discrete_num_; j++)
/*基于运动学模型进行中间节点拓展
(最后一个中间节点是最终的状态节点)*/
DynamicModel(move_step_size_, phi, x, y, theta);
intermediate_state.emplace_back(Vec3d(x, y, theta));
/*对每个中间节点进行碰撞检测*/
if (!CheckCollision(x, y, theta))
has_obstacle = true;
break;
/*状态节点离散化,映射到状态栅格中*/
Vec3i ids = State2Index(intermediate_state.back());
/*判断节点所处集合*/
StateNode::NODE_STATUS node_state = StateNode::NOT_VISITED;
auto pnode = visited_.find(ids);
if (pnode != visited_.end())
node_state = pnode->second.node_status_;
else
node_state = StateNode::NOT_VISITED;
/*进行边界检测并提前过滤掉已经存在于close set中的节点(提升效率)*/
if (node_state != StateNode::IN_CLOSESET &&
!BeyondBoundary(intermediate_state.back().head(2)) &&
!has_obstacle)
StateNode neighor_node(ids);
neighor_node.node_status_ = node_state;
neighor_node.intermediate_states_ = intermediate_state;
neighor_node.state_ = intermediate_state.back();
neighor_node.steering_grade_ = i;
neighor_node.direction_ = StateNode::FORWARD;
neighbor_nodes.push_back(neighor_node);
// backward: v取负向最大值情况省略
...
单个节点拓展的示例代码如下:
其中的NormalizeAngle函数实现可以参照 角度归一化实现_穿越临界点的博客-CSDN博客_角度归一化
void HybridAStar::DynamicModel(const double &step_size, const double &phi,
double &x, double &y, double &theta) const
x = x + step_size * std::cos(theta);
y = y + step_size * std::sin(theta);
theta = NormalizeAngle(theta + step_size / wheel_base_ * std::tan(phi));
4 总结
本篇主要介绍了Hybrid Astar算法节点拓展的代码实现。下一篇重点介绍碰撞检测算法。
恭喜你又坚持看完了一篇博客,又进步了一点点!如果感觉还不错就点个赞再走吧,你的点赞和关注将是我持续输出的哒哒哒动力~~
以上是关于Hybrid Astar 算法剖析和实现的主要内容,如果未能解决你的问题,请参考以下文章