Apollo 星火计划课程笔记----Routing

Apollo Routing

目的:

找到一条最佳的路径(通常是时间最短)。

和planning的区别是:Routing是起点到终点的最佳路径,而Planning是行驶过程中,当前一小段时间如何行驶,需要考虑当前路况,交通规则等。

地图:

地图是由地图引擎根据格式化的文件渲染出来的。全世界的地图文件是108GB。
  • 地图格式:
    Node 节点, way路径, relation关系, Tag标签。

    上面的格式文件,通过地图引擎,渲染出地图。

最短路径算法

其中顶点对应于交叉点并且边对应路径,权重对应于路段的长度。

A*算法

演示github:https://daohu527.github.io

Apollo Routing

  • 输入:
    • 地图数据
    • 路由请求(开始和结束位置)
  • 输出
    • 路由导航信息

主要topo_creator,core,strategy文件。地图格式是高精地图。

如何设计?

  1. 构建Topo地图
  2. A*算法查找路径
  3. 动态trick(修路) —>这部分是复杂的部分

apollo topo地图的权重放入了节点内。

工程设计:

  1. 与传统导航的区别? 自动驾驶的规划更加精细。 (考虑车道,左转右转等等)
  2. 工程上的解法可能用空间来换时间。
  3. 未来自动驾驶的路径规划肯定会上云,并且会出现新的规划方式。

一个人查询这个路径存入了数据库。当100个人查询这个路径的时候,是否需要每次都进行A*算法? 堵车的时候,怎么动态管理这些路径?比如高速路口,固定的点对点的时候,需不需要每次都进行算法查找路径?

代码讲解:

入口:routing_component.h


class RoutingComponent final
    : public ::apollo::cyber::Component {  //发一条routing 请求,产生一条消息。
 public:
  RoutingComponent() = default;
  ~RoutingComponent() = default;

 public:
  bool Init() override; //initial 
  bool Proc(const std::shared_ptr& request) override; //执行

 private:
  std::shared_ptr<::apollo::cyber::Writer> response_writer_ =      // 发消息
      nullptr;
  std::shared_ptr<::apollo::cyber::Writer>
      response_history_writer_ = nullptr; //发一个可能没有收到,因此会有个history的消息
  Routing routing_;
  std::shared_ptr response_ = nullptr; //根据请求,输出了一个答复
  std::unique_ptr<::apollo::cyber::Timer> timer_;
  std::mutex mutex_;
};

真正处理函数是通过Routing这个类来执行的:


class Routing {
  // friend class RoutingTestBase;
 public:
  Routing();

  /**
   * @brief module name
   */
  std::string Name() const;

  /**
   * @brief module initialization function
   * @return initialization status
   */
  apollo::common::Status Init();

  /**
   * @brief module start function
   * @return start status
   */
  apollo::common::Status Start();

  /**
   * @brief destructor
   */
  virtual ~Routing() = default;

  bool Process(const std::shared_ptr &routing_request,
               RoutingResponse *const routing_response);

 private:
  std::vector FillLaneInfoIfMissing(
      const RoutingRequest &routing_request);

  bool GetParkingID(const apollo::common::PointENU &parking_point,
                    std::string *parking_space_id);

  bool FillParkingID(RoutingResponse *routing_response);

 private:
  std::unique_ptr navigator_ptr_;
  common::monitor::MonitorLogBuffer monitor_logger_buffer_;

  const hdmap::HDMap *hdmap_ = nullptr;
};

上买的头文件包括core这个模块:
core里面会有topo_creator生成topo图。

  • edge_creator
  • graph_ceator
  • node_creator
  • topo_creator

A*在strategy文件夹内。

调试

routing工具提供可视化的界面,可以查看道路是否连接。 在modules\tools\routing 目录下。

一般出问题,先看以下地图上两个节点是否连接可通行的。

课后作业:
在dreamview中运行自主泊车例子。

提问:

Q1:权重放在节点上,和放在边上有什么优势? 都一样,处理方式不一样。

Q2:地图发出来怎么用?parking ID包含在了地图上。

Q3:apollo权重都是0。边的权重挪到了节点上,所以边只代表了方向。

Q4:default routing是个功能,存起来两个点,就不用每次都点两个点。

Q5:routing输入到输出做了什么操作?
读地图-->生成节点-->A*算法-->路径

Q6:Apollo地图的格式: opendriver的改进版本。考虑兼容标准。

Q7:地图制作:
LG工具,仿真用的地图。地图放在地图的目录。

你可能感兴趣的:(Apollo,人工智能,自动驾驶,机器学习)