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
Crea un sensor 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 la 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 la odometría. Este ruido agrega desviaciones aleatorias a los ticks medidos desde el codificador de la 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 la 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 para 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 la odometría. Especificar un sesgo positivo hará que el algoritmo de odometría sobreestime el ángulo de giro del vehículo. Esta sobreestimación de los giros da como resultado una acumulación de deriva en la estimación de la odometría en los giros. Para este escenario, se necesita un vehículo con eje, así que utilice 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 la odometría. La especificación de diferentes sesgos hace que la estimación de la odometría se desvíe a lo largo de toda la trayectoria. Para este escenario, se necesitan dos ruedas, así que utilice 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
