Maison >Périphériques technologiques >IA >Une analyse approfondie de la stratégie de changement de voie d'Apollo et de son application pratique
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.
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
La machine d'état de changement de voie actuelle d'Apollo est la suivante :
Il y a quelques points à noter à propos la machine d'état :
Chemin de code pertinent : modules/planification/tâches/décideurs/lane_change_decider. /http://lane_change_decider.cc
reference_line_info
est une exception vide.reference_line_info
为空的异常情况.reckless_change_lane
为true
, 则直接更新 Reference Line.prev_status
, 刚进入程序时, 可能prev_status
没有状态信息(!prev_status->has_status()
), 此时直接认为处于换道完成状态.reference_line_info
的数量为 1(即has_change_lane
为false
), 说明自车处在巡迹状态, 自车当前所在的车道拥有唯一的车道线, 周围没有可变车道, 所以直接更新换道状态即可.ChangeLaneStatus::IN_CHANGE_LANE
: 如果上一帧自车所在的 Lane 和这一帧所在的 Lane 相同, 说明自车还在往目标车道上走. 反之如果上一帧自车所在的 Lane 和这一帧所在的 Lane 不同, 说明自车已经在目标车道上了, 切换已经完成.ChangeLaneStatus::CHANGE_LANE_FAILED
: 如果换道失败, 则冻结状态一段时间, 然后切换到正在换道状态, 为下一次换道做准备.ChangeLaneStatus::CHANGE_LANE_FINISHED
: 换道成功后同样冻结一段时间, 然后切换到正在换道状态, 为下一次换道做准备. 这里冻结时间是为了避免频繁换道.IsClearToChangeLane
reckless_change_lane
est true
, puis mettez directement à jour la ligne de référence.prev_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é 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 ChangeLaneStatus::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 🎜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 :🎜 🎜🎜🎜🎜IsChangeLanePath
, 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
, 利用上面计算的投影关系来忽略目标参考线的车道之外的障碍物.same_direction
. 根据障碍物与自车的行驶方向的关系和速度关系分别计算前向安全距离和后向安全距离.HysteresisFilter
是一种 Open Close 逻辑, 目的是增加安全判断结果的稳定性(上一帧判断结果认为是安全的, 那么这一帧就更倾向于给出是安全的判断, 反之亦然).需要重写的内容是:LaneChangeDecider::PrioritizeChangeLane
<span> </span>is_prioritize_change_lane
. 如果is_prioritize_change_lane
为true
, 则找自车要切换的目标参考线. 反之如果is_prioritize_change_lane
为false
, 则找自车当前位置所在的 Lane 所在的参考线.reference_line_info->splice(reference_line_info->begin(),*reference_line_info, iter)
;将步骤 1 找到的iter
所指向的参考线放在链表的最前面. 由于 Planning 后续模块使用的都是reference_line_info().front()
, 所以链表的最前面就表示当帧就是使用的参考线. splice
的使用详细说明见C++ 基础.ReferenceLineInfo
same_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).
Le contenu qui doit être réécrit est : LaneChangeDecider : :PrioritizeChangeLane
<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 iter
La 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!