Fuentes de errores del codificador de ruedas
Explore las diversas fuentes de error de los codificadores de ruedas y cómo afectan la estimación de la odometría de las ruedas. Después de definir una trayectoria ground-truth, cambie los parámetros de polarización del radio de la rueda, ruido de posición de la rueda, deslizamiento de la rueda y ancho de vía para los distintos objetos del codificador de rueda. Observe los efectos de cambiar estos parámetros en la trayectoria de salida de los modelos de sensor de codificador de rueda.
Trayectoria ground-truth
Cree una trayectoria de ground-truth que se utilizará al examinar los parámetros de error. Trazar la trayectoria.
Fs = 100; wps = [0 0 0; 20 0 0; 20 5 0; 0 5 0; 0 0 0]; toa = cumsum([0 10 1.25*pi 10 1.25*pi]).'; vels = [2 0 0; 2 0 0; -2 0 0; -2 0 0; 2 0 0]; traj = waypointTrajectory(wps,... 'SampleRate',Fs,'ReferenceFrame','ENU', ... 'TimeOfArrival',toa,'Velocities',vels); % Fetch pose values. [pos,orient,vel,acc,angvel] = lookupPose(traj,toa(1):1/Fs:toa(end)); angvelBody = rotateframe(orient,angvel); % Plot ground truth position. figure plot(pos(:,1),pos(:,2)) title('Position (Ground Truth)') xlabel('X (m)') ylabel('Y (m)') axis equal
Sesgo en el radio de la rueda
Cree un sensor de codificador de rueda para un modelo de monociclo como un objeto wheelEncoderUnicycle
. Especifique un WheelRadiusBias
distinto de cero y examine cómo afecta la estimación de odometría. Especificar un sesgo positivo hace que el algoritmo de odometría subestime la circunferencia de la rueda. Esto da como resultado que la odometría estime una distancia recorrida menor.
encoder = wheelEncoderUnicycle; encoder.WheelRadiusBias = 0.05; odom = wheelEncoderOdometryUnicycle(encoder); ticks = encoder(vel, angvel, orient); estPose = odom(ticks, angvelBody(:,3)); % Plot ground truth and estimated positions. figure plot(pos(:,1),pos(:,2),estPose(:,1),estPose(:,2)) title('Position (Wheel Radius Bias)') xlabel('X (m)') ylabel('Y (m)') legend('Ground truth','Odometry') axis equal
Ruido en la medición de la posición de las ruedas
Especifique un WheelPositionAccuracy
distinto de cero y examine cómo afecta la estimación de odometría. Este ruido agrega desviaciones aleatorias a los ticks medidos por el codificador de rueda.
encoder = wheelEncoderUnicycle; encoder.WheelPositionAccuracy = 0.1; % Use a local random stream to reproduce results. encoder.RandomStream = 'mt19937ar with seed'; odom = wheelEncoderOdometryUnicycle(encoder); ticks = encoder(vel,angvel,orient); estPose = odom(ticks,angvelBody(:,3)); % Plot ground truth and estimated positions. figure plot(pos(:,1),pos(:,2),estPose(:,1),estPose(:,2)) title('Position (Wheel Position Noise)') xlabel('X (m)') ylabel('Y (m)') legend('Ground truth', 'Odometry') axis equal
Patinaje y derrape de las ruedas
Especifique un SlipRatio
distinto de cero y examine cómo afecta la estimación de odometría. Especificar un valor mayor que cero simula el deslizamiento de la rueda. Este deslizamiento da como resultado que la odometría estime una mayor distancia recorrida. Un valor negativo de la relación de deslizamiento indica derrape.
encoder = wheelEncoderUnicycle; encoder.SlipRatio = 0.25; odom = wheelEncoderOdometryUnicycle(encoder); ticks = encoder(vel, angvel, orient); estPose = odom(ticks, angvelBody(:,3)); % Plot ground truth and estimated positions. figure plot(pos(:,1),pos(:,2),estPose(:,1),estPose(:,2)) title('Position (Wheel Slippage)') xlabel('X (m)') ylabel('Y (m)') legend('Ground truth', 'Odometry') axis equal
Sesgo en el ancho de vía
Especifique un TrackWidthBias
distinto de cero y examine cómo afecta la estimación de odometría. Especificar un sesgo positivo hará que el algoritmo de odometría sobreestime el ángulo de giro del vehículo. Esta sobreestimación del giro da como resultado que la deriva se acumule en la estimación de la odometría en los giros. Para este escenario, se necesita un vehículo con un eje, así que use el objeto wheelEncoderDifferentialDrive
.
encoder = wheelEncoderDifferentialDrive; encoder.TrackWidthBias = 0.1; odom = wheelEncoderOdometryDifferentialDrive(encoder); ticks = encoder(vel,angvel,orient); estPose = odom(ticks); % Plot ground truth and estimated positions. figure plot(pos(:,1),pos(:,2), estPose(:,1), estPose(:,2)) title('Position (Track Width Bias)') xlabel('X (m)') ylabel('Y (m)') legend('Ground truth', 'Odometry') axis equal
Diferentes sesgos en las ruedas
Especifique diferentes valores distintos de cero para WheelRadiusBias
y examine cómo afecta la estimación de odometría. La especificación de diferentes sesgos hace que la estimación de odometría se desvíe a lo largo de toda la trayectoria. Para este escenario, se necesitan dos ruedas, así que use el objeto wheelEncoderDifferentialDrive
.
encoder = wheelEncoderDifferentialDrive; encoder.WheelRadiusBias = [-0.01, 0.001]; odom = wheelEncoderOdometryDifferentialDrive(encoder); ticks = encoder(vel, angvel, orient); estPose = odom(ticks); % Plot ground truth and estimated positions. figure plot(pos(:,1),pos(:,2), estPose(:,1), estPose(:,2)) title('Position (Different Wheel Biases)') xlabel('X (m)') ylabel('Y (m)') legend('Ground truth', 'Odometry') axis equal