daohu527 / dig-into-apollo

Apollo notes (Apollo学习笔记) - Apollo learning notes for beginners.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请问一下apollo routing模块中Routing Response消息定义内的Passage是什么含义?与真实的道路是什么样的对应关系?

Fibonacci43 opened this issue · comments

commented

@Fibonacci43
事实上,passage是lane的一个集合,向前行驶的lane和下一条lane做了合并,称为一个passage.

如果当前lane是向前,它将会和下一条lane合并为一个passage,如果当前lane是左拐或右拐,那么它和下一条lane会分别当做一个passage。也就是说passage把routing中直行的节点做了合并,对生成路径做了优化。

调用生成passage:

result_generator_->GeneratePassageRegion(
          graph_->MapVersion(), request, result_nodes, topo_range_manager_,
          response)

具体的实现:

bool ResultGenerator::ExtractBasicPassages(
    const std::vector<NodeWithRange>& nodes,
    std::vector<PassageInfo>* const passages) {
  CHECK(!nodes.empty());
  passages->clear();
  std::vector<NodeWithRange> nodes_of_passage;
  nodes_of_passage.push_back(nodes.at(0));
  for (size_t i = 1; i < nodes.size(); ++i) {
    auto edge =
        nodes.at(i - 1).GetTopoNode()->GetOutEdgeTo(nodes.at(i).GetTopoNode());
    ...
    if (edge->Type() == TET_LEFT || edge->Type() == TET_RIGHT) {
      auto change_lane_type = LEFT;
      if (edge->Type() == TET_RIGHT) {
        change_lane_type = RIGHT;
      }
      // 1. 如果当前lane是向左或向右拐弯,保存合并到一个passage的lanes,并开启新的passage
      passages->emplace_back(nodes_of_passage, change_lane_type);
      nodes_of_passage.clear();
    }
    // 2. 如果当前lane是直行,则合并当前lane为一个passage
    nodes_of_passage.push_back(nodes.at(i));
  }
  passages->emplace_back(nodes_of_passage, FORWARD);
  return true;
}