# Wheel Encoder Error Sources

Explore the various error sources of wheel encoders and how they affect the wheel odometry estimate. After defining a ground truth trajectory, change parameters for wheel radius bias, wheel position noise, wheel slippage, and track width for the various wheel encoder objects. Notice the affects of changing these parameters on the output trajectory from the wheel encoder sensor models.

### Ground Truth Trajectory

Create a ground truth trajectory to be used when examining the error parameters. Plot the trajectory.

```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``` ### Bias in the Wheel Radius

Create a wheel encoder sensor for a unicycle model as a `wheelEncoderUnicycle` object. Specify a non-zero `WheelRadiusBias` and examine how it affects the odometry estimate. Specifying a positive bias causes the odometry algorithm to underestimate the circumference of the wheel. This results in the odometry estimating a smaller distance traveled.

```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``` ### Noise in the Wheel Position Measurement

Specify a non-zero `WheelPositionAccuracy` and examine how it affects the odometry estimate.This noise adds random deviations to the measured ticks from the wheel encoder.

```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``` ### Wheel Slippage and Skidding

Specify a non-zero `SlipRatio` and examine how it affects the odometry estimate. Specifying a value greater than zero simulates wheel slipping. This slippage results in the odometry estimating a larger distance traveled. A negative value for slip ratio inidates skidding.

```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``` ### Bias in the Track Width

Specify a non-zero `TrackWidthBias` and examine how it affects the odometry estimate.Specifying a positive bias will cause the odometry algorithm to overestimate the turning angle of the vehicle. This overestimation of turning results in drift acumulating in the odometry estimate at turns. For this scenario, a vehicle with an axle is needed, so use the `wheelEncoderDifferentialDrive` object.

```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``` ### Differing Biases in the Wheels

Specify different non-zero values for the `WheelRadiusBias` and examine how it affects the odometry estimate.Specifying different biases causes the odometry estimate to drift throughout the entire trajectory. For this scenario, two wheels are needed, so use the `wheelEncoderDifferentialDrive` object.

```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``` 