# routing模块分析
## 功能:
基于请求,输出两点之间导航信息。
## 输入:
 * 用户的起始和终止位置。/apollo/routing_request[pb_msgs/RoutingRequest]。
 * HD map。
 * /apollo/monitor[pb_msgs/MonitorMessage]。

## 输出:
 * 请求的响应:/apollo/routing_response[pb_msgs/RoutingResponse],包含了最终的路由信息。
 * /apollo/monitor[pb_msgs/MonitorMessage]。

## 节点I/O:
![routing data flow](images/routing_node_arch.bmp)
## routing源码:
### routing.cc和routing.h
 * Name()函数:返回节点名字。
 * Routing():构造函数,初始化monitor_。
 * Init():节点初始化函数。
   * 获取路由地图文件routing_map_file。
   * 创建导航器navigator_ptr_。
   * 读取导航配置文件:modules/routing/conf/routing.pb.txt到routing_conf_。
   * 根据Adapter配置文件:modules/routing/conf/adapter.conf,创建nodehandle和响应topics。
   * 设置路由请求话题的回调函数OnRouting_Request。这里为啥不直接使用rosservice?//TODO。
 * OnRouting_Request():处理请求。
   * 输入路由请求。
   * 执行SearchRoute()函数,根据routing_request,寻找路由,并设置routing_response。
   * 发布routing_response。

### navigation.cc和navigation.h:
 * SearchRoute()函数:
   * 显示请求命令的信息。
   * 检查导航器是否ready。构造函数时打开。
   * 通过初始化函数,将请求中的点转化为graph中的格式,并存储在way_nodes和way_s。
   * 通过a star算法由way_nodes和way_s计算出路由点result_nodes。
   * 将路由点result_nodes合并到response结构。
 * SearchRouteByStrategy()函数:
 主要是利用A star算法寻找一个全局路径。
 * GetWayNodes()函数:
 将request转化为拓扑图graph_中的点。