Maison >Périphériques technologiques >IA >Une analyse approfondie de la stratégie de changement de voie d'Apollo et de son application pratique

Une analyse approfondie de la stratégie de changement de voie d'Apollo et de son application pratique

WBOY
WBOYavant
2023-11-07 11:37:05607parcourir

1. Introduction

1.1. La fonction du changement de voie

En termes simples, la fonction du changement de voie est de sélectionner l'une des lignes de référence parmi les lignes de référence à sélectionner pour être utilisée par les modules de planification suivants.

Une analyse approfondie de la stratégie de changement de voie dApollo et de son application pratique

Il est à noter que le code de changement de voie open source d'Apollo a été fortement réduit, ne laissant qu'un simple cadre. De nombreuses fonctions, telles que le changement de voie actif, le changement de voie passif (en raison d'obstacles), la machine d'état relativement complète, la fenêtre de changement de voie et la sélection d'écart, etc., manquent. Cet article technique affiche uniquement le contenu du framework existant. Concernant le contenu des autres fonctions de changement de voie, veuillez attendre avec impatience les articles suivants

1.2. Machine d'état de changement de voie

La machine d'état de changement de voie actuelle d'Apollo est la suivante :

Une analyse approfondie de la stratégie de changement de voie dApollo et de son application pratique

Il y a quelques points à noter à propos la machine d'état :

  • Le IN_CHANGE_LANE comprend ici à la fois les étapes d'exécution du changement de voie et de préparation du changement de voie. Dans des circonstances normales, Apollo adopte d'abord la méthode de commutation de ligne de référence, puis d'exécution de l'action de changement de voie. adoptera également la méthode d'exécution du changement de voie en premier. L'action réside dans la méthode de changement de ligne de référence (l'avantage est qu'au moment où la ligne de référence est changée, la distance latérale de votre propre voiture est proche de 0).
  • Le code actuel ne reflète pas le moment où le changement de voie échouera. Il y a également des raisons de croire que cela est dû à la suppression du code concerné.
  • L'état complet du changement de voie doit au moins inclure : la préparation du changement de voie, la voie. exécution du changement, maintenance du changement de voie, annulation du changement de voie, achèvement du changement de voie et autres statuts.

2. Analyse du code

2.1.Processus global

Chemin de code pertinent : modules/planification/tâches/décideurs/lane_change_decider. /http://lane_change_decider.cc

  1. Processingreference_line_info est une exception vide.reference_line_info为空的异常情况.
  2. 如果配置了强制换道reckless_change_lanetrue, 则直接更新 Reference Line.
  3. 获取上一帧的换道状态prev_status, 刚进入程序时, 可能prev_status没有状态信息(!prev_status->has_status()), 此时直接认为处于换道完成状态.
  4. 如果reference_line_info的数量为 1(即has_change_lanefalse), 说明自车处在巡迹状态, 自车当前所在的车道拥有唯一的车道线, 周围没有可变车道, 所以直接更新换道状态即可.
  5. 切换换道的状态机
  • 上一帧处在换道状态ChangeLaneStatus::IN_CHANGE_LANE: 如果上一帧自车所在的 Lane 和这一帧所在的 Lane 相同, 说明自车还在往目标车道上走. 反之如果上一帧自车所在的 Lane 和这一帧所在的 Lane 不同, 说明自车已经在目标车道上了, 切换已经完成.
  • 上一帧处在换道失败状态ChangeLaneStatus::CHANGE_LANE_FAILED: 如果换道失败, 则冻结状态一段时间, 然后切换到正在换道状态, 为下一次换道做准备.
  • 上一帧处在换道完成状态ChangeLaneStatus::CHANGE_LANE_FINISHED: 换道成功后同样冻结一段时间, 然后切换到正在换道状态, 为下一次换道做准备. 这里冻结时间是为了避免频繁换道.

2.2. 安全检查

IsClearToChangeLane

Si le changement de voie forcé est configuréreckless_change_lane est true, puis mettez directement à jour la ligne de référence.
  1. Obtenez la voie du cadre précédent change stateprev_status, lorsque vous entrez dans le programme pour la première fois, il peut s'agir de prev_status n'a aucune information d'état (!prev_status->has_status()), à ce moment-là, c'est directement considéré que le changement de voie est terminé
  2. Si reference_line_info est 1 (c'est-à-dire has_change_lane est false), indiquant que le véhicule est en état de patrouille, et la voie où se trouve actuellement le véhicule a la seule ligne de voie, il n'y a pas de voies variables autour, il suffit donc de mettre à jour directement l'état de changement de voie
Changer la machine d'état de changement de voie

Une analyse approfondie de la stratégie de changement de voie dApollo et de son application pratique

    Le cadre précédent était dans le. état de changement de voieChangeLaneStatus::IN_CHANGE_LANE : Si ci-dessus Si la voie où le véhicule se trouve dans un cadre est la même que la voie où il se trouve dans ce cadre, cela signifie que le véhicule continue de marcher vers le voie cible. Au contraire, si la voie où se trouve le véhicule dans le cadre précédent est différente de la voie où se trouve le véhicule dans ce cadre, cela signifie que le véhicule s'est déjà déplacé sur la voie cible, le commutateur s'est déplacé. été terminé. 🎜🎜L'image précédente était dans un état d'échec de changement de voieChangeLaneStatus::CHANGE_LANE_FAILED : si le changement de voie échoue, l'état sera gelé pendant un certain temps, puis passera à l'état de changement de voie . Préparez-vous pour le prochain changement de voie. 🎜🎜L'image précédente est dans l'état d'achèvement du changement de voieChangeLaneStatus::CHANGE_LANE_FINISHED : une fois le changement de voie réussi, il se bloquera également pendant un certain temps, puis changera à l'état de changement de voie pour le prochain changement de voie. Préparez-vous aux changements de voie ici pour éviter les changements de voie fréquents 🎜

2.2. p>IsClearToChangeLane détermine si le changement de voie est de sécurité.🎜🎜🎜Cette méthode de jugement de sécurité ne prend pas en compte les obstacles virtuels (Virtual Obstacles) et les obstacles statiques (Static Obstacles).🎜🎜Calculez la projection des obstacles dynamiques sur le Ligne de référence. La signification géométrique de la projection est celle indiquée dans la figure ci-dessous :🎜 🎜🎜🎜🎜
  1. Si votre voiture change de voieIsChangeLanePath, utilisez la relation de projection calculée ci-dessus pour ignorer en dehors de la voie de la ligne de référence cible obstacles.IsChangeLanePath, 利用上面计算的投影关系来忽略目标参考线的车道之外的障碍物.
  2. 判断障碍物的行驶方向是否和自车相同same_direction. 根据障碍物与自车的行驶方向的关系和速度关系分别计算前向安全距离和后向安全距离.
  3. 如果自车和障碍物之间的距离大于上面计算的安全距离, 则认为可以安全换道的. HysteresisFilter是一种 Open Close 逻辑, 目的是增加安全判断结果的稳定性(上一帧判断结果认为是安全的, 那么这一帧就更倾向于给出是安全的判断, 反之亦然).

2.3. 更新 Reference Line

需要重写的内容是:LaneChangeDecider::PrioritizeChangeLane

  1. 输入:<span> </span>is_prioritize_change_lane. 如果is_prioritize_change_lanetrue, 则找自车要切换的目标参考线. 反之如果is_prioritize_change_lanefalse, 则找自车当前位置所在的 Lane 所在的参考线.
  2. reference_line_info->splice(reference_line_info->begin(),*reference_line_info, iter);将步骤 1 找到的iter所指向的参考线放在链表的最前面. 由于 Planning 后续模块使用的都是reference_line_info().front(), 所以链表的最前面就表示当帧就是使用的参考线. splice的使用详细说明见C++ 基础.
  3. 输出: ReferenceLineInfo
  4. Déterminez si l'obstacle se déplace dans la même direction que le véhiculesame_direction. Calculer séparément en fonction de la relation entre l'obstacle et la direction et la vitesse de conduite du véhicule Distance de sécurité avant et distance de sécurité arrière.

Si la distance entre le véhicule et l'obstacle est supérieure à la distance de sécurité calculée ci-dessus, il est considéré comme sécuritaire de changez de taoïste. HysteresisFilter est une sorte de logique Open Close, le but est d'augmenter la stabilité du résultat du jugement de sécurité (le résultat du jugement de la trame précédente est considéré comme sûr, alors ceci frame sera plus enclin à donner un jugement sûr, et vice versa).Une analyse approfondie de la stratégie de changement de voie dApollo et de son application pratique

2.3 Mettre à jour la ligne de référence

Le contenu qui doit être réécrit est : LaneChangeDecider : :PrioritizeChangeLane

🎜🎜Input :<span> </span>is_prioritize_change_lane. Ifis_prioritize_change_lane est true, puis recherchez la ligne de référence cible à changer. Sinon, si is_prioritize_change_lane est false, puis recherchez la ligne de référence de la voie où se trouve la position actuelle de la voiture.🎜🎜reference_line_info->splice(reference_line_info->begin(),* reference_line_info, iter) ; Modifiez le iterLa ligne de référence pointée est placée au début de la liste chaînée. Depuis la planification des modules suivants, utilisez reference_line_info().front(), donc le devant de la liste chaînée Cela signifie que le cadre est la ligne de référence utilisée.<span> </span><code style="background-color: rgb(231, 243, 237); padding: 1px 3px ; border-radius : 4px ; overflow-wrap : break-word ; text-indent : 0px ; display : inline-block;">splice Pour des instructions détaillées, voir les bases de C++.🎜🎜Sortie : ReferenceLineInfo liste chaînée. 🎜🎜🎜🎜🎜🎜Lien original : https://mp.weixin.qq.com/s/IQkBV8iadaU4Qy70F3Xs3Q🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer