Contenu principal

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

copy

Créer une copie complète de l'objet échantillonneur d'état gaussien

Depuis R2023b

    Description

    sampler2 = copy(sampler1) crée une copie complète de l'objet échantillonneur d'état gaussien.

    exemple

    Exemples

    réduire tout

    Échantillonnez un espace d'état SE(2) à l'aide d'un échantillonneur d'état gaussien et observez l'impact des valeurs des paramètres de l'échantillonneur sur les résultats d'échantillonnage.

    Définissez la valeur de départ pour vous assurer de générer les mêmes résultats.

    rng(50,"twister");

    Créez une carte d'occupation simple avec un passage étroit.

    map = binaryOccupancyMap;
    occupied = [5*ones(9,1),[1; 2; 3; 4; 5; 7; 8; 9; 10]];
    setOccupancy(map,occupied,1);
    figure(Position=[0, 0, 200, 200])
    show(map)

    Figure contains an axes object. The axes object with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains an object of type image.

    Définissez les limites inférieure et supérieure des variables de l'espace d'état x, y et theta à partir de la carte d'occupation.

    x = map.XWorldLimits;
    y =  map.YWorldLimits;
    theta = [-pi pi];

    Créez un objet SE(2) d'espace d'état à l'aide des variables d'espace d'état spécifiées. Vérifiez la validité des états dans l'espace d'état d'entrée à l'aide d'un validateur d'état. Définissez la distance de validation sur 0,01.

    ss = stateSpaceSE2([x; y; theta]);
    sv = validatorOccupancyMap(ss,Map=map);
    sv.ValidationDistance = 0.01;

    Exemple d'espace d'état à l'aide d'un échantillonneur d'état gaussien

    Créez un échantillonneur d'état gaussien avec les valeurs de paramètres par défaut. Par défaut:

    • Le nombre maximum de tentatives que l'échantillonneur doit effectuer pour trouver les échantillons d'état est fixé à 10.

    • Les valeurs d'écart type le long de lax,y,etθles directions sont définies respectivement sur 0,1, 0,1 et 0,0628.

    sampler_orig = stateSamplerGaussian(sv)
    sampler_orig = 
      stateSamplerGaussian with properties:
    
               StateSpace: [1x1 stateSpaceSE2]
           StateValidator: [1x1 validatorOccupancyMap]
        StandardDeviation: [0.1000 0.1000 0.0628]
              MaxAttempts: 10
    
    

    Générez 40 échantillons pour la planification de mouvement à partir de l'espace d'état d'entrée.

    states_orig = sample(sampler_orig,40);

    Vous pouvez générer des échantillons optimaux en modifiant le nombre maximum de tentatives et les valeurs d'écart type. Si les échantillons sont dispersés dans tout l'espace d'entrée, augmentez le nombre maximum de tentatives et les valeurs d'écart type pour concentrer les échantillons d'état autour de la limite de l'obstacle.

    Varier le nombre maximum de tentatives

    Créez des copies de l'objet échantillonneur d'état d'origine et modifiez le nombre maximum de tentatives, propriété de l'échantillonneur, MaxAttempts, pour étudier son impact sur les résultats d'échantillonnage. Définissez les valeurs d’écart type sur les valeurs par défaut.

    Définissez le nombre maximum de tentatives pour trouver des échantillons valides sur 100 et générez 40 nouveaux échantillons à partir de l'espace d'état d'entrée.

    sampler_2 = copy(sampler_orig);
    sampler_2.MaxAttempts = 100;
    states_2 = sample(sampler_2,40);

    Définissez le nombre maximum de tentatives pour trouver des échantillons valides sur 200 et générez 40 nouveaux échantillons à partir de l'espace d'état d'entrée.

    sampler_3 = copy(sampler_orig);
    sampler_3.MaxAttempts = 200;
    states_3 = sample(sampler_3,40);

    Affichez les résultats à l'aide de la fonction d'assistance helperDisplayStates . Notez que, à mesure que le nombre de tentatives augmente, les échantillons se concentrent davantage autour de la limite de l’obstacle.

    helperDisplayStates(map,states_orig,sampler_2,states_2,sampler_3,states_3,"MaxAttempts");

    Figure contains 3 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State. Axes object 2 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State. Axes object 3 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State.

    Varier l'écart type

    Créez des copies de l'objet échantillonneur d'état d'origine et modifiez l'écart type, propriété de l'échantillonneur, StandardDeviation, pour étudier son impact sur les résultats d'échantillonnage. Définissez le nombre maximum de tentatives sur 200.

    Générez 40 échantillons avec les valeurs d’écart type par défaut.

    sampler_orig.MaxAttempts = 200;
    states_orig = sample(sampler_orig,40);

    Définissez les valeurs d’écart type sur [0,01 0,01 0,06]. Générez 40 nouveaux échantillons à partir de l’espace d’état d’entrée.

    sampler_4 = copy(sampler_orig);
    sampler_4.StandardDeviation = [0.01 0.01 0.06];
    states_4 = sample(sampler_4,40);

    Définissez les valeurs d’écart type sur [0,5 0,5 0,06]. Générez 40 nouveaux échantillons à partir de l’espace d’état d’entrée.

    sampler_5 = copy(sampler_orig);
    sampler_5.StandardDeviation = [0.5 0.5 0.06];
    states_5 = sample(sampler_5,40);

    Affichez les résultats à l'aide de la fonction d'assistance helperDisplayStates . Notez que, à mesure que vous augmentez les valeurs d’écart type, les échantillons se concentrent davantage autour de la limite de l’obstacle. Cependant, si les valeurs d'écart type sont supérieures à la largeur des passages étroits dans l'espace d'entrée, l'échantillonneur génère des résultats incorrects.

    helperDisplayStates(map,states_orig,sampler_4,states_4,sampler_5,states_5,"Std.Deviation");

    Figure contains 3 axes objects and other objects of type uipanel. Axes object 1 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State. Axes object 2 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State. Axes object 3 with title Binary Occupancy Grid, xlabel X [meters], ylabel Y [meters] contains 2 objects of type image, line. One or more of the lines displays its values using only markers This object represents State.

     Fonction d'assistance 

    helperDisplayStates affiche les résultats à l’aide d’une fenêtre de figure personnalisée.

    function helperDisplayStates(map,states_orig,sampler_2,states_2,sampler_3,states_3,select)
    if select == "MaxAttempts"
        title_1 = "MaxAttempts = 10 (Default value)";
        title_2 = strcat("MaxAttempts = ",num2str(sampler_2.MaxAttempts));
        title_3 = strcat("MaxAttempts = ",num2str(sampler_3.MaxAttempts));
    elseif select == "Std.Deviation"
        title_1 = "StandardDeviation = [0.1 0.1 0.06] (Default value)";
        title_2 = strcat("StandardDeviation = [0.01 0.01 0.06]");
        title_3 = strcat("StandardDeviation = [0.5 0.5 0.06]");
    end
    
    fig_1 = figure(Position=[0 0 700 300]);
    movegui("center")
    panel_1 = uipanel(fig_1, ...
        Position=[0 0 0.33 1], ...
        Title=title_1);
    hPlot1 = axes(panel_1);
    show(map,Parent=hPlot1);
    hold on;
    plot(states_orig(:,1),states_orig(:,2),plannerLineSpec.state{:})
    hold off
    
    panel_2 = uipanel(fig_1, ...
        Position=[0.33 0 0.33 1], ...
        Title=title_2);
    hPlot2 = axes(panel_2);
    show(map,Parent=hPlot2);
    hold on;
    plot(states_2(:,1),states_2(:,2),plannerLineSpec.state{:})
    hold off
    
    panel_3 = uipanel(fig_1, ...
        Position=[0.66 0 0.33 1], ...
        Title=title_3);
    hPlot3 = axes(panel_3);
    show(map,Parent=hPlot3);
    hold on;
    plot(states_3(:,1),states_3(:,2),plannerLineSpec.state{:})
    hold off
    end

    Modifiez un ou plusieurs paramètres d'un échantillonneur d'état gaussien et comparez son effet sur les résultats de la planification de mouvement. Pour ce faire, vous pouvez créer une seule instance de l'objet échantillonneur d'état gaussien, puis utiliser la fonction copy de l'objet stateSamplerGaussian pour créer une copie complète de l'instance d'objet existante, modifiez les paramètres souhaités et utilisez-la avec le planificateur pour générer différents résultats.

    Définissez la valeur de départ du nombre aléatoire pour garantir la répétabilité.

    rng(50,"twister");

    Créer une carte d'occupation et rechercher des variables d'état

    Chargez une grille d'occupation de probabilité dans l'espace de travail MATLAB®.

    load("narrowPassageMap.mat","narrowPassage");

    Créez une carte d'occupation à partir de la grille d'occupation d'entrée.

    map = binaryOccupancyMap(narrowPassage,50);

    Définissez les limites inférieure et supérieure des variables de l'espace d'état x, y et theta à partir de la carte d'occupation.

    x = map.XWorldLimits;
    y =  map.YWorldLimits;
    theta = [-pi pi];

    Créer un échantillonneur d'état gaussien

    Créez un objet SE(2) d'espace d'état à l'aide des variables d'espace d'état spécifiées. Vérifiez la validité des états dans l'espace d'état d'entrée à l'aide d'un validateur d'état.

    ss = stateSpaceSE2([x; y; theta]);
    sv = validatorOccupancyMap(ss,Map=map);

    Créez un échantillonneur d'état gaussien à l'aide du validateur d'état. Vérifiez les valeurs des paramètres par défaut.

    sampler_1 = stateSamplerGaussian(sv)
    sampler_1 = 
      stateSamplerGaussian with properties:
    
               StateSpace: [1x1 stateSpaceSE2]
           StateValidator: [1x1 validatorOccupancyMap]
        StandardDeviation: [0.1030 0.0644 0.0628]
              MaxAttempts: 10
    
    

    Copier l'échantillonneur d'état et modifier les valeurs des paramètres

    Créez une copie de la première instance de l'échantillonneur d'état gaussien.

    sampler_2 = copy(sampler_1);

    Modifiez les propriétés d’écart type et de tentatives maximales de l’échantillonneur d’état gaussien.

    sampler_2.StandardDeviation = [0.3 0.1 0.1];
    sampler_2.MaxAttempts = 150;

    Configurer le planificateur de chemin PRM

    Configurez deux planificateurs de chemin PRM. Utilisez les échantillonneurs d'état gaussiens d'origine et modifiés pour échantillonner l'espace d'état d'entrée.

    planner_1 = plannerPRM(ss,sv,StateSampler=sampler_1,MaxNumNodes=900); 
    planner_2 = plannerPRM(sampler_2.StateSpace,sampler_2.StateValidator, ...
        StateSampler=sampler_2,MaxNumNodes=900); 

    Trouver le chemin optimal entre deux états

    Spécifiez le point de départ et le point d'objectif dans l'espace d'état d'entrée.

    startPose = [1 1 0];
    goalPose = [9 1 0]; 

    Calculez le chemin optimal entre le point de départ et le point d'arrivée à l'aide des planificateurs de chemin PRM.

    [pathObj_1,info_1] = plan(planner_1,startPose,goalPose);
    [pathObj_2,info_2] = plan(planner_2,startPose,goalPose);

    Comparer les résultats

    Tracez les résultats obtenus en utilisant les deux échantillonneurs d'état gaussiens différents pour la planification du mouvement. Utilisez les fonctions plannerLineSpec.start et plannerLineSpec.goal pour tracer les points de départ et d'objectif, respectivement. Si le planificateur avec les paramètres par défaut a trouvé un chemin optimal entre les états de départ et d'objectif, tracez les résultats. Utilisez la fonction plannerLineSpec.path pour spécifier la couleur par défaut et les propriétés de ligne pour tracer le chemin.

    figure
    show(map)
    hold on
    plot(startPose(1),startPose(2),plannerLineSpec.start{:}); 
    plot(goalPose(1),goalPose(2),plannerLineSpec.goal{:}); 
    if info_1.IsPathFound
        plot(pathObj_1.States(:,1),pathObj_1.States(:,2),plannerLineSpec.path{:})
        title("Using Gaussian State Sampler with Default Parameters")
        legend
    else
        disp("Path not found. Try modifying validator, sampler or planner parameters."); 
    end
    hold off

    Figure contains an axes object. The axes object with title Using Gaussian State Sampler with Default Parameters, 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 These objects represent Start, Goal, Path.

    Tracez les résultats obtenus à l'aide de l'échantillonneur d'état gaussien avec des valeurs de paramètres personnalisées.

    figure
    show(map)
    hold on
    plot(startPose(1),startPose(2),plannerLineSpec.start{:}); 
    plot(goalPose(1),goalPose(2),plannerLineSpec.goal{:}); 
    if info_2.IsPathFound
        plot(pathObj_2.States(:,1),pathObj_2.States(:,2),plannerLineSpec.path{:})
        title("Using Gaussian State Sampler with Custom Parameters")
        legend
    else
        disp("Path not found. Try modifying validator, sampler or planner parameters."); 
    end
    hold off

    Figure contains an axes object. The axes object with title Using Gaussian State Sampler with Custom Parameters, 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 These objects represent Start, Goal, Path.

    Arguments d'entrée

    réduire tout

    Objet échantillonneur d'état, spécifié comme objet stateSamplerGaussian .

    Arguments de sortie

    réduire tout

    Copie de l'objet échantillonneur d'état, renvoyée sous la forme d'un objet stateSamplerGaussian .

    Historique des versions

    Introduit dans R2023b