> 文档中心 > Far planner代码系列(31)is_covered

Far planner代码系列(31)is_covered

        今天讲的是UpdateNavGraph函数里的分析每个node的is_covered属性is_frontier属性。

我们看代码,代码里把near_nav_nodes里的点挨个都取出来判断该node是不是is_covered,通过IsNodeFullyCovered函数来判断。

        

         IsNodeFullyCoveredIsNodeFullyCovered函数首先判断输入的node是不是odom或者navpoint或者该node的is_covered属性本身就为true。如果是的话,直接返回true

        我们建立一个check_odom_list去接收internav_near_nodes_,并且把odom本身也push进去,即check_odom_list = [internav_near_nodes_ , odom_node_ptr_]

        开始循环提取check_odom_list的点,取叫near_optr,如果near_optrnode的距离小于kMatchDist(即1.75) 那么返回true

        当距离大于1.75时,进行下面的判断:

         如果该node不是PILLAR,我们就从near_optr的edge_votes找到该node(其实也就是从potential_edges连接的点,正常情况下,该node和near_optr都互为对方的potential_edge,所以通过edge_votes能找到对方的node)

        如果在near_optr的edge_votes找到了该node,且该连接是有效的,那么我们取一个由near_optr指向node_ptr的向量,叫diff_p

        进入函数IsInCoverageDirPairs 进行判断:

        取diff_p的单位向量norm_dir,取出node的surf_dirs

        由于默认FARUtil::kAngleNoise * 2.0f 为30°,则dist * sin(margin_angle_noise) >= 1.75*0.5 = 0.875(因为之前小于1.75直接返回true了,只有距离大于1.75的时候才会进入IsInCoverageDirPairs函数),0.875大于kNearDist的,所以返回30°,即margin_angle_noise=30°

        然后我们计算dot_value,其实dot_value就是surf_dir.first和surf_dir.second的夹角再加上margin_angle_noise的cos值,

        在这里就是cos{theta(surf_dir.first,surf_dir.second)+margin_angle_noise}

        如图所示:

         接着,当node类型为CONVEX(凸多变形)时(我们只分析一个):

        norm_dir*(-surf_dirs.second) > dot_value 的意思就是 我从-surf_dirs.second开始到一点p,这个cos()> dot_value,由于cos函数在0到180°单调递减的原因,即角度小于acos(dot_value)。如果我们取到刚好和acos(dot_value)的角度,也即从-surf_dirs.second开始,取Margin_theta的角度,在这个范围内,都满足要求。

        同样的,我们也从-surf_dirs.first开始,取Margin_theta的角度,在这个范围内,也都满足要求,于是,两个角度夹着的紫色区域就为is_covered的区域。只要odom或者internav_node落在这个紫色的区域内,那么这个nav_node的is_covered属性就是true,否则为false