Ros

几种导航场景(过时)

本文中的路径/道路指DWAPlannerROS中的global_plan,即经过a_star_search后生成的路径。

对道路,rose_ros分为四种路况,变量path_case_ 指示了当前是哪种路况。

  • path_only_backward   只能使用负速度后退。是处理掉头逻辑两种方案之一。
  • path_expect_forward  期望机器人向前走
  • path_near_goal       距离目标点不到30厘米了(可能会废弃)
  • path_normal。        除上面三种之外的路况

 

一、掉头逻辑

当整条global_plan_在机器人背后,这时机器人有两种方案:一是用负速度向后退,二是用正速度掉头。rose_ros处理掉头逻辑遵循这么条原则:只要有可能了,就立即掉头,即尽可能不出现负速度后退。有这条原则是考虑到机器人会带个摄像头,摄像头往往朝向机器人前面,然后拍摄前面路况。尽早掉头能让摄像头尽快拍到“正确”图像。

方案一:负速度后退

path_case_ = path_only_backward;
path_all_back_ = false

以上是在负速度后退时,path_case_、path_all_back_的变量值。两种情况下要采用这方案,变量straight_backward_指示了这哪一种。

情况1:正处在狭长窄道,要求后退。运行实例见图2,如果机器人处在图中更往下位置,像窄道中间。在向global_plan_增加路径点后,就得出了path_case_ = path_only_backward,同时把path_all_back_ = false。

straight_backward_ = true;

如何判断正处于这种情况?——检查每个路径点,除角度满足外,路径点的栅格代价都超过140。

此情况下,机器人要尽量笔直后退。一旦转弯过大,极可能就造成不可预料后果,像横着卡住路了。为限制转弯,候选轨迹逻辑后,还要做角速度限制处理,参考DWAPlanner::findBestPath。

图2 负数速之二:判断出来不能从前面掉头

情况2:不是上面情况,但判断出来不能从前面掉头,也就是说不能用正速度。这结果不是在adjust_global_plan就得到的,而要等到后面findBestPath检查结果,参考后面“方案二:正速度掉头”。

straight_backward_ = false;

此情况下,机器人后退往往带个角度。以什么twist控制机器人靠的是候选轨迹逻辑。用的速度范围

limits.min_vel_x = -0.10;
limits.max_vel_x = -0.02;

min_vel_x = -0.10比通常0.2小,降低了min_vel_x绝对值。目的:让慢点退,不要错过一个可以转向的地方。

ajdust_traj_backward。因为已经是负速度,禁用。

方案二:正速度掉头

straight_backward_ = false;

实例见图2,机器人周围开阔点,就是正速度调头情况。是采用正速度掉头、还是采用方案一中的情况2,就看判断结果。具体是以下逻辑。

  1. 在findBestPath使用较大的theta,目前是至少30度,vel_x则使用一个较小的0.02。如果得到有效轨迹,进入步骤2,否则进入步骤4。
  2. 继续theta用45、60、75、90,同时vel_x都是0.04,看是否可行。如果这些速度都成功,进入步骤3,否则进入步骤4。
  3. 把步骤1中findBestPath得到的速度发向机器人。后绪要禁用adjust_traj_forward。
  4. 路况改为path_only_backward,然后再一次findBestPath。即认为此次地方不开阔,不适合掉头,先执行负速数后退,经过这次后退,下次或许就到一个开阔地了。
  5. 下一次computeVelocityCommands时,继续从步骤1开始。

机器人要能掉头,这地方自然得开阔点。判断方法是同时能转成功这5种角度:30、45、60、75、90。对30度,用的是vel_x是0.02。这里不置为0,是考虑到有些机器人不支持原地转,那就是给它一个不为0的微小线速度,好让候选轨迹逻辑能考虑进这个距离。后4个则vel_x都是0.04,目的是让检查的地方更开阔。

判断30度时用findBestPath,除要确定至少能转30度外,还要确定出此次旋转是逆时针还是顺时针,后面几个角度就可按这个方向去检查。findBestPath能根据本地代价地图较好得到这个方向。

此时不允许后退。目的:找到一个最近的地方转向。掉头时往往移出的距离很小,避免让因为小又改后退。

 

1.2 情况二时,和ajdust_traj_backward的拉扯问题

path_all_back_=true导致的旋转,刚path_all_back_=false,则有ajdust_traj_backward导致的旋转,一旦一个顺时针,一个逆时针,或反过来,就会出现拉扯。

 

二、path_expect_forward:优先向前

图3 路况:优先向前

在path_normal时,如果模拟走的距离小于9厘米,会认为机器人偏航角和路口角度不太对,会尝试后退,让角度更适合前面路口后,再次向前。

在图3,这个路口比较窄,如果还是按一定要达到9厘米才能向前走,可能就达不到。此时较好做法是先向前移动一点距离,然后第二次向前,可能就走出这路口了。具体到图3,期望第一次走到候选轨迹内、红线的拐弯处,第二次则走出路口。

为让第一次可移动一点距离,路况改为path_expect_forward。相比path_normal,此时距离阈值由9厘米缩小到6厘米。

 

三、在1.7秒(sim_time)算出的max_dist内,路径出现较大拐弯

图4 max_dist内较大拐弯

以max_vel_x为速度、1.7秒模拟走出的距离记为sim_time_dist,在图4、sim_time_dist对应白色轨迹覆盖区域。为拉开goal_评分,选取的global_plan_最后个路径点要超过1.7秒,目前取的是1.3*sim_time_dist,记为max_dist。

在图4,较大拐弯出现在sim_time_dist内,运行时也可能出现sim_time_dist后、但max_dist内。不论出现在哪里,如果还是取max_dist内的最后一个路径点,以这个gobal_评分得到最优轨迹将更贴近上面障碍物,很可能会会撞上。

为让减缓拐弯影响,不能再取max_dist内的最后一个路径点作为global_plan_终点。做法是判断如果有这个拐弯,那只拐出小角度是就停止。

截短是为避免碰上可能的障碍物,在空荡地方,可能也会出现这种拐弯,但那时就不必截短了。

 

四、a_star_search中,NoInformation不应该比InscribedInflatedObstacle小太多

图5 窄道掉头

在图5,机器人正处在一条竖直、狭长窄道中。本是向下走的,要求按绿色显示的全局路径掉头向上。按正确走法,机器人应该一直后退,直到离开窄道。图2中,由于未知栅格设置的cost(NoInformation)相比内切栅格(InscribedInflatedObstacle)过小,a_star_search找出的路径于是尽量离开内切栅格,选了图中黑色线指示、有较多未知栅格那条路。窄道右侧是片不能进入区域,a_star_search选路错误。

要解决这个问题,NoInformation不应该比InscribedInflatedObstacle小太多。

再设想这么种场景,在图2中这地图,机器人处在窄道中央。要求掉头向上,此时恰又出现了容错处理,导致清除本地代价地图(clearCostmap)。于是机器人只能看到所在位置周围很小的一块障碍情况。此时a_star_search要正确的话,甚至NoInformation不能小于InscribedInflatedObstacle

 

 

十、一种废弃的掉头逻辑

  1. (adjust_global_plan)判断出当前global_plan是否全在背后(路径点到机器人位置的角度和机器人yaw差值>=90度),是的话plan_all_back_=true。
  2. (DWAPlanner::findBestPath)当前所在地是否后开阔。1)开阔的话,旋转机器人。2)不开阔的话,用负的vel_x后退机器人,让path_case_=path_only_backward。

这里隐含一个逻辑:开阔的话,旋转机器人。转到global_plan不全在机器人后前时,即plan_all_back=false,再由通常逻辑让机器人yaw和global_plan对齐。

图10 一种废弃的掉头逻辑

图10这个示例,机器人yaw一开始是-90度,即向下。图中是出现用了以上逻辑上后出现了拉扯。为什么会现出拉扯,让看以下过程。

  1. 判断出来plan_all_back=true,机器人根据plan_all_back=true时候选轨迹逻辑,选择逆时针转。
  2. 转到大概图2位置,plan_all_back=false了。因为前方被阻,机器人选择了微小后退。
  3. 由于这个后退,下一次的adjust_global_plan改为判断出plan_all_back=true。
  4. 因为plan_all_back=true,机器人又要逆时针转。结果回到步骤2。

步骤2、3、4,机器人出现拉扯了。

全部评论: 0

    写评论: