> 文档中心 > Far planner代码系列(30)TopTwoContourConnector

Far planner代码系列(30)TopTwoContourConnector

我们知道,nav_node里的potential_contours中可能有许多个nodes,而TopTwoContourConnector函数主要是把nav_node和potential_contours里得分最高的两个nodes进行关联。

        这个是graph_manager_.UpdateNavGraph里的一个小函数,我们先讲一下,会对大体的流程有一定的了解。


        假设我们有两个ctnode 分别叫做ctnodeA和ctnodeB,他们再经过一次更新后变成了navnodeA和navnodeB,并加入了global_graph(也可以叫他们contour_nodeA和contour_nodeB)。而且他们互相在对方的potential_contours和contours_votes里。如下图我们用nodeA和nodeB表示

         那么:

        A的potential_contours就有(B,*,*,*) 

        B的potential_contours就有(A,*,*,*)

        注:*号代表和该node有潜在连接关系的node

        A的contour_votes里就会有(,,....)

        B的contour_votes里就会有(,,....)

        注:node_id(B)代表是B点的node_id,后面的111101是每次判断连接的一个数字,1代表连接,0代表不连接,判断连接是否有效 则取sum(1,1,1,1,0,1)= 5, 看看5占了这个deque的size大小的多少,比如现在deque的size为6 我们就可以确定他们是一个validconnect

        回到函数里,我们循环NodeA所有的contour_votes,如果是有效连接(即deque里面1的总和与deque的size的比例达到一定,我们就认为nodeA到nodeX的连接有效),我们就计算他们各自的votes分数,并存到votesc容器里,在对votesc进行一个从大到小的排序。

         接着我们进行一个循环,把nodeA的潜在contour_node挨个取出来,比如我们取到了B点,

那么:

        const auto it  node_ptr->contour_votes.find(cnode_ptr->id)

        就是node_ptr->contour_votes.find(nodeB_id) 

        因为nodeB是nodeA的potential_contour之一,那么肯定能找到它的id,不然就报错。

        找到了以后我们就计算nodeB的vote的得分,记为itc,如果itc的分数在votesc里是最高的两个之一,且nodeB到nodeA的连接是有效的:

        1、我们把它们互相加到对方的contour_connect里,并把两个node组成NavEdge点对,加入到global_contour_set_中。

        2、把它们互相加到对方的connect_nodes里