Contenido principal

Esta página se ha traducido mediante traducción automática. Haga clic aquí para ver la última versión en inglés.

monteCarloLocalization

Localice el robot utilizando datos y mapas del sensor de distancia

Descripción

monteCarloLocalization System object™ crea un objeto de localización de Monte Carlo (MCL). El algoritmo MCL se utiliza para estimar la posición y orientación de un vehículo en su entorno utilizando un mapa conocido del entorno, datos de escaneo LIDAR y datos de sensores de odometría.

Para localizar el vehículo, el algoritmo MCL utiliza un filtro de partículas para estimar la posición del vehículo. Las partículas representan la distribución de estados probables del vehículo, donde cada partícula representa un posible estado del vehículo. Las partículas convergen alrededor de una única ubicación a medida que el vehículo se mueve en el entorno y detecta diferentes partes del entorno mediante un sensor de distancia. Un sensor de odometría mide el movimiento del vehículo.

Un objeto monteCarloLocalization toma los datos de pose y escaneo LiDAR como entradas. Los datos del sensor de escaneo LiDAR de entrada se proporcionan en su propio marco de coordenadas y el algoritmo transforma los datos de acuerdo con la propiedad SensorModel.SensorPose que debe especificar. La pose de entrada se calcula integrando los datos del sensor de odometría a lo largo del tiempo. Si el cambio de pose es mayor que cualquiera de los umbrales de actualización especificados, UpdateThresholds, entonces las partículas se actualizan y el algoritmo calcula una nueva estimación de estado a partir del filtro de partículas. Las partículas se actualizan mediante este proceso:

  1. Las partículas se propagan según el cambio de pose y el modelo de movimiento especificado, MotionModel.

  2. A las partículas se les asignan pesos según la probabilidad de recibir la lectura del sensor de rango para cada partícula. Estos pesos de probabilidad se basan en el modelo de sensor que especifique en SensorModel.

  3. Basándose en la propiedad ResamplingInterval, las partículas se vuelven a muestrear desde la distribución posterior y se eliminan las partículas de bajo peso. Por ejemplo, un intervalo de remuestreo de 2 significa que las partículas se remuestrean cada dos actualizaciones.

Los resultados del objeto son la pose y la covarianza estimadas y el valor de isUpdated. Este estado estimado es la media y la covarianza del grupo de partículas ponderado más alto. La pose de salida se da en el marco de coordenadas del mapa que se especifica en la propiedad SensorModel.Map. Si el cambio de pose es mayor que cualquiera de los umbrales de actualización, entonces la estimación del estado se ha actualizado y isUpdated es true. De lo contrario, isUpdated es false y la estimación sigue siendo la misma. Para realizar un seguimiento continuo de la mejor estimación del estado de un robot, repita este proceso de propagación de partículas, evaluación de su probabilidad y remuestreo.

Para estimar la pose y la covarianza del robot utilizando datos de escaneo LIDAR:

  1. Cree el objeto monteCarloLocalization y configure sus propiedades.

  2. Llame al objeto con argumentos, como si fuera una función.

Para más información sobre el funcionamiento de los System objects, consulte ¿Qué son los System Objects?

Creación

Descripción

mcl = monteCarloLocalization devuelve un objeto MCL que estima la posición de un vehículo utilizando un mapa, un sensor de rango y datos de odometría. De forma predeterminada, se asigna un mapa vacío, por lo que se requiere una asignación de mapa válida antes de utilizar el objeto.

ejemplo

mcl = monteCarloLocalization(Name,Value) crea un objeto MCL con opciones adicionales especificadas por uno o más argumentos de par Name,Value.

Name es un nombre de propiedad y Value es el valor correspondiente. Name debe aparecer dentro de comillas simples (''). Puede especificar varios argumentos de par nombre-valor en cualquier orden como Name1,Value1,...,NameN,ValueN.

Propiedades

expandir todo

Pose inicial del vehículo utilizada para iniciar la localización, especificada como un vector de tres elementos, [x y theta], que indica la posición y el rumbo del vehículo. Inicializar el objeto MCL con una estimación de pose inicial le permite utilizar un valor más pequeño para la cantidad máxima de partículas y aun así converger en una ubicación.

Covarianza de la distribución gaussiana para la pose inicial, especificada como una matriz diagonal. Las entradas vectoriales y escalares de tres elementos se convierten en una matriz diagonal. Esta matriz proporciona una estimación de la incertidumbre de InitialPose.

Bandera que indica si se debe realizar la localización global, especificada como false o true. El valor predeterminado, false, inicializa partículas utilizando las propiedades InitialPose y InitialCovariance. Un valor true inicializa partículas distribuidas uniformemente en todo el mapa e ignora las propiedades InitialPose y InitialCovariance. La localización global requiere una gran cantidad de partículas para cubrir todo el espacio de trabajo. Utilice la localización global solo cuando la estimación inicial de la ubicación y orientación del vehículo no esté disponible.

Número mínimo y máximo de partículas, especificado como un vector de dos elementos, [min max].

Modelo de sensor de campo de verosimilitud, especificado como un objeto likelihoodFieldSensor. El valor predeterminado utiliza el objeto predeterminado likelihoodFieldSensorModel. Después de usar el objeto para obtener la salida, llame a release en el objeto para realizar cambios en SensorModel. Por ejemplo:

mcl = monteCarloLocalization;
sm = likelihoodFieldSensorModel;
sm.Map = binaryOccupancyMap(10,10,20);
mcl.SensorModel = sm;
[isUpdated,pose,covariance] = mcl([0 0 0],ones(1,10),linspace(-pi/2,pi/2,10));
% Release object before changing motion model
release(mcl);
mcl.SensorModel.NumBeams = 120;
mcl.MotionModel.Noise = [0.25 0.25 0.4 0.4];

Modelo de movimiento de odometría para accionamiento diferencial, especificado como un objeto odometryMotionModel. El valor predeterminado utiliza el objeto predeterminado odometryMotionModel. Después de usar el objeto para obtener la salida, llame a release en el objeto para realizar cambios en MotionModel. Por ejemplo:

mcl = monteCarloLocalization;
sm = likelihoodFieldSensorModel;
sm.Map = binaryOccupancyMap(10,10,20);
mcl.SensorModel = sm;
[isUpdated,pose,covariance] = mcl([0 0 0],ones(1,10),linspace(-pi/2,pi/2,10));
% Release object before changing motion model
release(mcl);
mcl.SensorModel.NumBeams = 120;
mcl.MotionModel.Noise = [0.25 0.25 0.4 0.4];

Cambio mínimo en los estados requerido para activar la actualización, especificado como un vector de tres elementos. La localización actualiza las partículas si se cumple el cambio mínimo en cualquiera de los estados [x y theta]. La estimación de pose se actualiza solo si se actualiza el filtro de partículas.

Número de actualizaciones de filtro entre remuestreos de partículas, especificado como un entero positivo.

Utilice un objeto lidarScan como entrada de escaneo, especificado como false o true.

Uso

Descripción

[isUpdated,pose,covariance] = mcl(odomPose,scan) estima la pose y la covarianza de un vehículo utilizando el algoritmo MCL. Las estimaciones se basan en la pose calculada a partir de la odometría del vehículo especificada, odomPose, y los datos del sensor de escaneo LiDAR especificado, scan. mcl es el objeto monteCarloLocalization. isUpdated indica si la estimación se actualiza en función de la propiedad UpdateThreshold.

Para habilitar esta sintaxis, debe establecer la propiedad UseLidarScan en true. Por ejemplo:

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

ejemplo

[isUpdated,pose,covariance] = mcl(odomPose,ranges,angles) especifica los datos de escaneo LiDAR como ranges y angles.

ejemplo

Argumentos de entrada

expandir todo

Pose basada en odometría, especificada como un vector de tres elementos, [x y theta]. Esta pose se calcula integrando la odometría en el tiempo.

Lecturas de escaneo Lidar, especificadas como un objeto lidarScan.

Dependencias

Para utilizar este argumento, debe establecer la propiedad UseLidarScan en true.

mcl.UseLidarScan = true;

Valores de rango de datos de escaneo, especificados como un vector con elementos medidos en metros. Estos valores de rango son distancias desde un sensor de escaneo láser en el angles especificado. El vector ranges debe tener el mismo número de elementos que el vector angles correspondiente.

Valores de ángulo de datos de escaneo, especificados como un vector con elementos medidos en radianes. Estos valores de ángulo son los ángulos en los que se midieron los ranges especificados. El vector angles debe tener la misma longitud que el vector ranges correspondiente.

Argumentos de salida

expandir todo

Marcador para actualización de pose, devuelto como lógico. Si el cambio de pose es mayor que cualquiera de los umbrales de actualización, entonces la salida es true. De lo contrario, es false. Una salida true significa que se devuelven la pose y la covarianza actualizadas. Una salida false significa que la pose y la covarianza no se actualizan y son las mismas que en la última actualización.

Estimación de la pose actual, devuelta como un vector de tres elementos, [x y theta]. La pose se calcula como la media del grupo de partículas de mayor peso.

Estimación de covarianza para la pose actual, devuelta como una matriz. Esta matriz da una estimación de la incertidumbre de la pose actual. La covarianza se calcula como la covarianza del grupo de partículas con mayor ponderación.

Funciones del objeto

Para usar una función de objeto, especifique el System object como el primer argumento de entrada. Por ejemplo, para liberar recursos de sistema de un System object llamado obj, utilice la siguiente sintaxis:

release(obj)

expandir todo

getParticlesObtener partículas del algoritmo de localización.
setParticlesEstablecer partículas a partir del algoritmo de localización
stepEjecutar el algoritmo System object
releaseRelease resources and allow changes to System object property values and input characteristics
resetReset internal states of System object

Ejemplos

contraer todo

Crea un objeto monteCarloLocalization. Establezca la propiedad UseLidarScan en true.

mcl = monteCarloLocalization;
mcl.UseLidarScan = true;

Crea un objeto likelihoodFieldSensorModel para un sensor de rango. Asigne el modelo de sensor con un mapa de cuadrícula de ocupación al objeto monteCarloLocalization.

sm = likelihoodFieldSensorModel;
p = zeros(200,200);
sm.Map = occupancyMap(p,20);
mcl.SensorModel = sm;

Cree datos de escaneo láser de muestra.

ranges = 10*ones(1,300);
ranges(1,130:170) = 1.0;
angles = linspace(-pi/2,pi/2,300);
odometryPose = [0 0 0];

Crea un objeto lidarScan especificando los rangos y ángulos.

scan = lidarScan(ranges,angles);

Estimar la pose y la covarianza del vehículo.

[isUpdated,estimatedPose,covariance] = mcl(odometryPose,scan)
isUpdated = logical
   1

estimatedPose = 1×3

    0.0350   -0.0126    0.0280

covariance = 3×3

    0.9946   -0.0012         0
   -0.0012    0.9677         0
         0         0    0.9548

Referencias

[1] Thrun, Sebatian, Wolfram Burgard, and Dieter Fox. Probabilistic Robotics. MIT Press, 2005.

[2] Dellaert, F., D. Fox, W. Burgard, and S. Thrun. "Monte Carlo Localization for Mobile Robots." Proceedings 1999 IEEE International Conference on Robotics and Automation.

Capacidades ampliadas

expandir todo

Generación de código C/C++
Genere código C y C++ mediante MATLAB® Coder™.

Historial de versiones

Introducido en R2019b