Main Content

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

controllerVFH

Évitez les obstacles à l'aide de l'histogramme de champ vectoriel

Depuis R2019b

Description

Le controllerVFH System object™ permet à votre véhicule d'éviter les obstacles en fonction des données du capteur de distance à l'aide d'histogrammes de champ vectoriel (VFH). Compte tenu des lectures du balayage laser et d'une direction cible vers laquelle se diriger, l'objet calcule une direction de direction sans obstacle.

controllerVFH utilise spécifiquement l'algorithme VFH+ pour calculer une direction sans obstacle. Tout d’abord, l’algorithme prend les distances et les angles des données de balayage laser et crée un histogramme polaire pour l’emplacement des obstacles. Ensuite, les seuils d'histogramme d'entrée sont utilisés pour calculer un histogramme binaire qui indique les directions occupées et libres. Enfin, l'algorithme calcule un histogramme masqué, calculé à partir de l'histogramme binaire basé sur le rayon de braquage minimum du véhicule.

L'algorithme sélectionne plusieurs directions de direction en fonction de l'espace ouvert et des directions de conduite possibles. Une fonction de coût, avec des pondérations correspondant aux directions précédente, actuelle et cible, calcule le coût des différentes directions possibles. L'objet renvoie alors une direction sans obstacle avec un coût minime. En utilisant la direction sans obstacle, vous pouvez saisir des commandes pour déplacer votre véhicule dans cette direction.

Pour utiliser cet objet pour votre propre application et environnement, vous devez régler les propriétés de l'algorithme. Les valeurs des propriétés dépendent du type de véhicule, du capteur de distance et du matériel que vous utilisez.

Pour trouver une direction sans obstacle :

  1. Créez l'objet controllerVFH et définissez ses propriétés.

  2. Appelez l'objet avec des arguments, comme s'il s'agissait d'une fonction.

Pour en savoir plus sur le fonctionnement des objets système, voir What Are System Objects?

Création

Description

exemple

VFH = controllerVFH renvoie un objet histogramme de champ vectoriel qui calcule la direction de direction sans obstacle à l'aide de l'algorithme VFH+ .

VFH = controllerVFH(Name,Value) renvoie un objet histogramme de champ vectoriel avec des options supplémentaires spécifiées par une ou plusieurs paires Name,Value . Name est le nom de la propriété et Value est la valeur correspondante. Le nom doit apparaître entre guillemets simples (' '). Vous pouvez spécifier plusieurs arguments de paire nom-valeur dans n'importe quel ordre comme Name1,Value1,...,NameN,ValueN. Les propriétés non spécifiées conservent leurs valeurs par défaut.

Propriétés

développer tout

Nombre de secteurs angulaires dans l'histogramme du champ vectoriel, spécifié sous forme scalaire. Cette propriété définit le nombre de groupes utilisés pour créer les histogrammes. Cette propriété n'est pas réglable. Vous ne pouvez définir cela que lorsque l'objet est initialisé.

Limites des lectures de portée, spécifiées sous forme de vecteur à 2 éléments avec des éléments mesurés en mètres. Les lectures de portée spécifiées lors de l'appel de l'objet ne sont prises en compte que si elles se situent dans les limites de distance. Utilisez la limite de distance inférieure pour ignorer les faux positifs dus à de mauvaises performances du capteur à des portées inférieures. Utilisez la limite supérieure pour ignorer les obstacles trop éloignés du véhicule.

Rayon du véhicule en mètres, spécifié sous forme de scalaire. Cette dimension définit le plus petit cercle pouvant circonscrire votre véhicule. Le rayon du véhicule est utilisé pour tenir compte de la taille du véhicule lors du calcul de la direction sans obstacle.

Distance de sécurité autour du véhicule, exprimée sous forme d'un scalaire en mètres. Il s'agit d'une distance de sécurité à laisser autour de la position du véhicule en plus de la valeur du paramètre RobotRadius . La somme du rayon du véhicule et de la distance de sécurité est utilisée pour calculer la direction sans obstacle.

Rayon de braquage minimum en mètres pour le véhicule se déplaçant à sa vitesse actuelle, spécifié sous forme de scalaire.

Pondération de la fonction de coût pour se déplacer vers la direction cible, spécifiée sous forme de scalaire. Pour suivre une direction cible, définissez ce poids pour qu'il soit supérieur à la somme des propriétés CurrentDirectionWeight et PreviousDirectionWeight . Pour ignorer le coût de la direction cible, définissez ce poids sur zéro.

Poids de la fonction de coût pour déplacer le robot dans la direction de cap actuelle, spécifié sous forme de scalaire. Des valeurs plus élevées de ce poids produisent des chemins efficaces. Pour ignorer le coût de direction actuel, définissez ce poids sur zéro.

Poids de la fonction de coût pour se déplacer dans la direction de direction précédemment sélectionnée, spécifié sous forme de scalaire. Des valeurs plus élevées de ce poids produisent des chemins plus fluides. Pour ignorer le coût de la direction précédente, définissez ce poids sur zéro.

Seuils pour le calcul d'histogramme binaire, spécifiés sous forme de vecteur à 2 éléments. L'algorithme utilise ces seuils pour calculer l'histogramme binaire à partir de la densité d'obstacles polaires. Les valeurs de densité d'obstacles polaires supérieures au seuil supérieur sont représentées sous forme d'espace occupé (1) dans l'histogramme binaire. Les valeurs inférieures au seuil inférieur sont représentées par de l'espace libre (0). Les valeurs comprises entre les limites sont définies sur les valeurs de l'histogramme binaire précédent, la valeur par défaut étant l'espace libre (0).

Utilisez l'objet lidarScan comme entrée d'analyse, spécifié comme true ou false.

Utilisation

Description

exemple

steeringDir = vfh(scan,targetDir) trouve une direction de direction sans obstacle à l'aide de l'algorithme VFH+ pour l'objet d'entrée lidarScan , scan. Une direction cible est donnée en fonction de l'emplacement cible.

Pour activer cette syntaxe, vous devez définir la propriété UseLidarScan sur true. Par exemple:

mcl = monteCarloLocalization('UseLidarScan',true);
...
[isUpdated,pose,covariance] = mcl(odomPose,scan);

steeringDir = vfh(ranges,angles,targetDir) définit le scan lidar avec deux vecteurs : ranges et angles.

Arguments en entrée

développer tout

Lectures d'analyse Lidar, spécifiées comme objet lidarScan .

Dépendances

Pour utiliser cet argument, vous devez définir la propriété UseLidarScan sur true.

mcl.UseLidarScan = true;

Valeurs de plage à partir des données d'analyse, spécifiées sous forme de vecteur en mètres. Ces valeurs de plage sont les distances d'un capteur à un angles donné. Le vecteur doit avoir la même longueur que le vecteur angles correspondant.

Valeurs d'angle issues des données numérisées, spécifiées sous forme de vecteur en radians. Ces valeurs d'angle sont les angles spécifiques du ranges donné. Le vecteur doit avoir la même longueur que le vecteur ranges correspondant.

Direction cible du véhicule, spécifiée sous forme de scalaire en radians. La direction avant du véhicule est considérée comme zéro radian, avec des angles positifs mesurés dans le sens inverse des aiguilles d'une montre.

Arguments de sortie

développer tout

Direction de direction du véhicule, spécifiée sous forme de scalaire en radians. Cette direction sans obstacle est calculée sur la base de l'algorithme VFH+. La direction avant du véhicule est considérée comme zéro radian, avec des angles positifs mesurés dans le sens inverse des aiguilles d'une montre.

Fonctions d'objet

Pour utiliser une fonction objet, spécifiez le System object comme premier argument d'entrée. Par exemple, pour libérer les ressources système d'un System object nommé obj, utilisez cette syntaxe :

release(obj)

développer tout

showDisplay VectorFieldHistogram information in figure window
stepRun System object algorithm
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Exemples

réduire tout

Cet exemple montre comment calculer une direction de direction en fonction des données de balayage laser d'entrée.

Créez un objet controllerVFH . Définissez la propriété UseLidarScan sur true.

vfh = controllerVFH;
vfh.UseLidarScan = true;

Saisissez les données de numérisation laser et la direction de la cible.

ranges = 10*ones(1,500);
ranges(1,225:275) = 1.0;
angles = linspace(-pi,pi,500);
targetDir = 0;

Créez un objet lidarScan en spécifiant les plages et les angles.

scan = lidarScan(ranges,angles);

Calculez une direction de direction sans obstacle.

steeringDir = vfh(scan,targetDir);

Visualisez le calcul VectorFieldHistogram .

h = figure;
set(h,'Position',[50 50 800 400])
show(vfh)

Références

[1] Borenstein, J., and Y. Koren. "The Vector Field Histogram - Fast Obstacle Avoidance for Mobile Robots." IEEE Journal of Robotics and Automation. Vol. 7, Number 3, 1991, pp.278–88.

[2] Ulrich, I., and J. Borenstein. "VFH : Reliable Obstacle Avoidance for Fast Mobile Robots." Proceedings. 1998 IEEE International Conference on Robotics and Automation. (1998): 1572–1577.

Capacités étendues

Historique des versions

Introduit dans R2019b