Main Content

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

Desde R2019b

Descripción

El monteCarloLocalization System object™ crea un objeto de localización 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 la pose y los datos de 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. Estas ponderaciones de probabilidad se basan en el modelo de sensor que especifique en SensorModel.

  3. Con base en la propiedad ResamplingInterval , se remuestrean las partículas de 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 proporciona 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 actualizó 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 establezca sus propiedades.

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

Para obtener más información sobre cómo funcionan los System objects, consulte What Are System Objects?

Creación

Descripción

ejemplo

mcl = monteCarloLocalization devuelve un objeto MCL que estima la pose de un vehículo utilizando un mapa, un sensor de distancia 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.

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

Name es un nombre de propiedad y Value es el valor correspondiente. Name debe aparecer entre comillas simples (''). Puede especificar varios argumentos de pares 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 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 da una estimación de la incertidumbre del InitialPose.

Indicador que indica si se debe realizar la localización global, especificada como false o true. El valor predeterminado, false, inicializa las partículas usando 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 probabilidad, especificado como un objeto likelihoodFieldSensor . El valor predeterminado utiliza el objeto likelihoodFieldSensorModel predeterminado. Después de usar el objeto para obtener resultados, 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 odometryMotionModel predeterminado. Después de usar el objeto para obtener resultados, 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

ejemplo

[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 especificada del vehículo, odomPose, y los datos del sensor de escaneo lidar especificados, 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.

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 la misma cantidad 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 supera cualquiera de los umbrales de actualización, entonces el resultado 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 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 utilizar una función de objeto, especifique System object como primer argumento de entrada. Por ejemplo, para liberar recursos del sistema de un System object llamado obj, use esta sintaxis:

release(obj)

expandir todo

getParticlesObtener partículas 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

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

mcl = monteCarloLocalization;
mcl.UseLidarScan = true;

Cree 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];

Cree 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

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

Historial de versiones

Introducido en R2019b