Симулируйте инерционные показания датчика из ведущего сценария

Сгенерируйте синтетические данные о датчике из IMU, GPS и использования энкодеров колеса ведущие инструменты генерации сценария от Automated Driving Toolbox™. drivingScenario объект симулирует ведущий сценарий, и данные о датчике сгенерированы от imuSensor, gpsSensor и wheelEncoderAckermann объекты.

Задайте сценарий

Создайте ведущий сценарий с одним транспортным средством. Задайте waypoints, чтобы иметь транспортное средство, продвигаются и делают поворот. Чтобы симулировать показания GPS, задайте ссылочное местоположение в геодезических координатах. Сгенерируйте траекторию транспортного средства с smoothTrajectory объектная функция. Постройте waypoints.

lla0 = [42 -71 50];
s = drivingScenario('GeoReference',lla0);
v = vehicle(s);

waypoints = [-11 -0.25 0;
    -1 -0.25 0;
    -0.6 -0.4 0;
    -0.6 -9.3 0];
speed = [1.5;0;0.5;1.5];
smoothTrajectory(v,waypoints,speed);

figure
plot(waypoints(:,1),waypoints(:,2),'-o')
xlabel('X (m)')
ylabel('Y (m)')
title('Vehicle Position Waypoints')

Figure contains an axes object. The axes object with title Vehicle Position Waypoints contains an object of type line.

Создайте датчики

Создайте IMU, GPS и датчики энкодера колеса. Задайте местоположение смещения и углы IMU и GPS. Они могут быть отредактированы, чтобы сменить монтирующееся положение и ориентацию датчиков на транспортном средстве.

mountingLocationIMU = [1 2 3];
mountingAnglesIMU = [0 0 0];
% Convert orientation offset from Euler angles to quaternion.
orientVeh2IMU = quaternion(mountingAnglesIMU,'eulerd','ZYX','frame');
% ReferenceFrame must be specified as ENU.
imu = imuSensor('SampleRate',1/s.SampleTime,'ReferenceFrame','ENU');

mountingLocationGPS = [1 2 3];
mountingAnglesGPS = [50 40 30];
% Convert orientation offset from Euler angles to quaternion.
orientVeh2GPS = quaternion(mountingAnglesGPS,'eulerd','ZYX','frame');
% The GeoReference property in drivingScenario is equivalent to
% the ReferenceLocation property in gpsSensor.
% ReferenceFrame must be specified as ENU.
gps = gpsSensor('ReferenceLocation',lla0,'ReferenceFrame','ENU');

encoder = wheelEncoderAckermann('TrackWidth',v.Width,...
    'WheelBase',v.Wheelbase,'SampleRate',1/s.SampleTime);

Запустите симуляцию

Запустите симуляцию и регистрируйте сгенерированные показания датчика.

% IMU readings.
accel = [];
gyro = [];
% Wheel encoder readings.
ticks = [];
% GPS readings.
lla = [];
gpsVel = [];
% Define the rate of the GPS compared to the simulation rate.
simSamplesPerGPS = (1/s.SampleTime)/gps.SampleRate;
idx = 0;
while advance(s)
    groundTruth = state(v);
    
    % Unpack the ground truth struct by converting the orientations from
    % Euler angles to quaternions and converting angular velocities form
    % degrees per second to radians per second.
    posVeh = groundTruth.Position;
    orientVeh = quaternion(fliplr(groundTruth.Orientation), 'eulerd', 'ZYX', 'frame');
    velVeh = groundTruth.Velocity;
    accVeh = groundTruth.Acceleration;
    angvelVeh = deg2rad(groundTruth.AngularVelocity);
    
    % Convert motion quantities from vehicle frame to IMU frame.
    [posIMU,orientIMU,velIMU,accIMU,angvelIMU] = transformMotion( ...
        mountingLocationIMU,orientVeh2IMU, ...
        posVeh,orientVeh,velVeh,accVeh,angvelVeh);
    [accel(end+1,:), gyro(end+1,:)] = imu(accIMU,angvelIMU,orientIMU); 
    
    ticks(end+1,:) = encoder(velVeh, angvelVeh, orientVeh); 
    
    % Only generate a new GPS sample when the simulation has advanced
    % enough.
    if (mod(idx, simSamplesPerGPS) == 0)
        % Convert motion quantities from vehicle frame to GPS frame.
        [posGPS,orientGPS,velGPS,accGPS,angvelGPS] = transformMotion(...
            mountingLocationGPS, orientVeh2GPS,...
            posVeh,orientVeh,velVeh,accVeh,angvelVeh);
        [lla(end+1,:), gpsVel(end+1,:)] = gps(posGPS,velGPS);
    end
    idx = idx + 1;
end

Визуализация результатов

Постройте сгенерированные показания датчика.

figure
plot(ticks)
ylabel('Wheel Ticks')
title('Wheel Encoder')

Figure contains an axes object. The axes object with title Wheel Encoder contains 4 objects of type line.

figure
plot(accel)
ylabel('m/s^2')
title('Accelerometer')

Figure contains an axes object. The axes object with title Accelerometer contains 3 objects of type line.

figure
plot(gyro)
ylabel('rad/s')
title('Gyroscope')

Figure contains an axes object. The axes object with title Gyroscope contains 3 objects of type line.

figure
geoplot(lla(:,1),lla(:,2))
title('GPS Position')

Figure contains an axes object. The axes object contains an object of type line.

figure
plot(gpsVel)
ylabel('m/s')
title('GPS Velocity')

Figure contains an axes object. The axes object with title GPS Velocity contains 3 objects of type line.