Main Content

Cette page a été traduite par traduction automatique. Cliquez ici pour voir la dernière version en anglais.

plannerControlRRT

Planificateur RRT basé sur le contrôle

Depuis R2021b

    Description

    L'objet plannerControlRRT est un planificateur d'arbre aléatoire à exploration rapide (RRT) pour résoudre des problèmes de planification cinématique et dynamique (kinodynamique) à l'aide de contrôles. L'algorithme RRT est une routine de planification de mouvement basée sur un arbre qui développe progressivement un arbre de recherche. Dans les planificateurs cinématiques, l'arbre se développe en échantillonnant aléatoirement les états dans l'espace de configuration du système, puis tente de propager le nœud le plus proche vers cet état. Le propagateur d'état échantillonne les commandes permettant d'atteindre l'état sur la base du modèle cinématique et des politiques de commande. Au fur et à mesure que l'arborescence ajoute des nœuds, les états échantillonnés s'étendent sur l'espace de recherche et connectent finalement les états de départ et d'objectif.

    Voici les étapes de l'algorithme RRT basé sur le contrôle :

    • Le planificateur, plannerControlRRT, demande un état à l'espace d'état.

    • Le planificateur trouve l'état le plus proche dans l'arborescence de recherche en fonction du coût.

    • Le propagateur d'état, mobileRobotPropagator, échantillonne les commandes de contrôle et les durées à propager vers l'état cible.

    • Le propagateur d'état se propage vers l'état cible.

    • Si le propagateur renvoie une trajectoire valide vers l'état, ajoutez l'état à l'arborescence.

    • "Facultatif": Tentative d'orienter la trajectoire vers l'objectif final en fonction des propriétés NumGoalExtension et GoalBias .

    • Continuez la recherche jusqu'à ce que l'arborescence de recherche atteigne l'objectif ou satisfasse à d'autres critères de sortie.

    L'avantage d'un planificateur kinodynamique comme plannerControlRRT est qu'il est garanti de renvoyer une séquence d'états, de commandes et de références qui comprennent un chemin cinématiquement ou dynamiquement réalisable. L'inconvénient d'un planificateur kinodynamique est que les propagations cinématiques ne peuvent garantir que les nouveaux états sont exactement égaux aux états cibles à moins qu'il n'existe une représentation analytique d'une séquence de commandes qui pilotent le système entre deux configurations avec une erreur résiduelle nulle. Cela signifie que les planificateurs kinodynamiques sont généralement asymptotiquement complets et garantissent la faisabilité cinématique, mais ne peuvent souvent pas garantir l'optimalité asymptotique.

    Création

    Description

    exemple

    controlPlanner = plannerControlRRT(propagator) crée un planificateur RRT kinodynamique à partir d'un objet propagateur d'état et définit la propriété StatePropagator .

    controlPlanner = plannerControlRRT(propagator,Name=Value) spécifie des propriétés supplémentaires à l'aide d'arguments nom-valeur. Par exemple, plannerControlRRT(propagator,ContinueAfterGoalReached=1) continue de rechercher des chemins alternatifs une fois que l'arbre a atteint l'objectif.

    Propriétés

    développer tout

    Propagateur d'état de robot mobile, spécifié comme un objet mobileRobotPropagator ou un objet d'une sous-classe de nav.StatePropagator.

    Optimisation après avoir atteint l'objectif, spécifié comme un 0 (false) ou 1 (true). S'il est spécifié comme vrai, le planificateur continue de rechercher des chemins alternatifs après avoir atteint l'objectif. Le planificateur se termine quelle que soit la valeur de cette propriété s'il atteint le nombre maximum d'itérations ou le nombre maximum de nœuds d'arborescence.

    Types de données : logical

    Temps maximum autorisé pour la planification, spécifié sous forme d'un scalaire positif en secondes.

    Types de données : single | double

    Nombre maximum de nœuds dans l'arborescence de recherche, à l'exclusion du nœud racine, spécifié sous la forme d'un entier positif.

    Types de données : single | double

    Nombre maximum d'itérations, spécifié sous forme d'entier positif.

    Types de données : single | double

    Le nombre maximum de fois que le planificateur peut se propager vers l'objectif, spécifié sous la forme d'un entier positif. Après avoir ajouté avec succès un nouveau nœud à l'arborescence, le planificateur tente de propager le nouveau nœud vers l'objectif en utilisant la fonction objet propagateWhileValid du propagateur d'état. Le planificateur continue de se propager jusqu'à ce que la fonction renvoie un vecteur d'état vide indiquant qu'aucun contrôle valide n'est trouvé, que le planificateur atteint l'objectif ou que la fonction a été appelée NumGoalExtension fois.

    Pour désactiver ce comportement, définissez la propriété sur 0. La désactivation de ce comportement entraînera une propagation aléatoire plutôt que vers l'objectif.

    Types de données : single | double

    Probabilité de choisir l'état objectif lors de l'échantillonnage d'état, spécifiée comme un scalaire réel dans la plage [0, 1]. Cette propriété détermine la probabilité que le planificateur choisisse l'état objectif réel lors de la sélection aléatoire d'états dans l'espace d'états. Vous pouvez commencer par définir la probabilité sur une petite valeur, telle que 0.05.

    Types de données : single | double

    Fonction de rappel pour déterminer si l'objectif est atteint, spécifiée comme handle de fonction. Vous pouvez créer votre propre fonction d'objectif atteint. La fonction doit suivre cette syntaxe :

     isReached = myGoalReachedFcn(planner,currentState,goalState)

    où:

    • planner — est l'objet de planificateur créé, spécifié comme objet plannerControlRRT .

    • currentState — est l'état actuel, spécifié comme un vecteur réel d'élément s. s est le nombre de variables d'état dans l'espace d'état.

    • goalState — est l'état objectif, spécifié comme un vecteur réel d'élément s. s est le nombre de variables d'état dans l'espace d'état.

    • isReached — est un booléen qui indique si l'état actuel a atteint l'état objectif, renvoyé sous la forme true ou false.

    Types de données : function handle

    Fonctions d'objet

    planPlanifier un chemin cinématiquement réalisable entre deux états
    copyCrée une copie complète de l'objet du planificateur

    Exemples

    réduire tout

    Planifiez des trajectoires de contrôle pour un modèle cinématique de vélo avec l'objet mobileRobotPropagator . Spécifiez une carte pour l'environnement, définissez des limites d'état et définissez un emplacement de départ et un emplacement objectif. Planifiez un chemin à l'aide de l'algorithme RRT basé sur le contrôle, qui utilise un propagateur d'état pour planifier le mouvement et les commandes de contrôle requises.

    Définir les paramètres d'état et de propagateur d'état

    Chargez une matrice de carte ternaire et créez un objet occupancyMap . Créez le propagateur d'état à l'aide de la carte. Par défaut, le propagateur d'état utilise un modèle cinématique de vélo.

    load('exampleMaps','ternaryMap')
    map = occupancyMap(ternaryMap,10);
    
    propagator = mobileRobotPropagator(Environment=map); % Bicycle model

    Définissez les limites d'état sur l'espace d'état en fonction des limites du monde cartographique.

    propagator.StateSpace.StateBounds(1:2,:) = ...
                        [map.XWorldLimits; map.YWorldLimits];

    Planifier le chemin

    Créez le planificateur de chemin à partir du propagateur d'état.

    planner = plannerControlRRT(propagator);

    Spécifiez les états de départ et d’objectif.

    start = [10 15 0];
    goal  = [40 30 0];

    Planifiez un chemin entre les États. Pour des résultats reproductibles, réinitialisez le générateur de nombres aléatoires avant de planifier. La fonction plan génère un objet navPathControl , qui contient les états, les commandes de contrôle et les durées.

    rng("default")
    path = plan(planner,start,goal)
    path = 
      navPathControl with properties:
    
        StatePropagator: [1x1 mobileRobotPropagator]
                 States: [192x3 double]
               Controls: [191x2 double]
              Durations: [191x1 double]
           TargetStates: [191x3 double]
              NumStates: 192
            NumSegments: 191
    
    

    Visualisez les résultats

    Visualisez la carte et tracez les états du chemin.

    show(map)
    hold on
    plot(start(1),start(2),"rx")
    plot(goal(1),goal(2),"go")
    plot(path.States(:,1),path.States(:,2),"b")
    hold off

    Figure contains an axes object. The axes object with title Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 4 objects of type image, line. One or more of the lines displays its values using only markers

    Affichez les entrées de contrôle [v psi] de la vitesse d'avancement et de l'angle de braquage.

    plot(path.Controls)
    ylim([-1 1])
    legend(["Velocity (m/s)","Steering Angle (rad)"])

    Figure contains an axes object. The axes object contains 2 objects of type line. These objects represent Velocity (m/s), Steering Angle (rad).

    Références

    [1] S.M. Lavalle, J.J. Kuffner, "Randomized kinodynamic planning", International Journal of Robotics Research, vol. 20, no. 5, pp. 378-400, May 2001

    [2] Kavraki, L. and S. LaValle. "Chapter 5 Motion Planning", 1st ed., B. Siciliano et O. Khatib, Ed. New York: Springer-Verlag Berlin Heidelberg, 2008, pp. 109-131.

    Capacités étendues

    Génération de code C/C++
    Générez du code C et C++ avec MATLAB® Coder™.

    Historique des versions

    Introduit dans R2021b