Main Content

IMU 측정값 시뮬레이션 소개

이 예제는 imuSensor System object를 사용하여 IMU(관성 측정 장치) 측정값을 시뮬레이션하는 방법을 보여줍니다. IMU에는 자이로스코프, 가속도계, 자력계를 포함한 개별 센서의 조합이 포함될 수 있습니다. 각각 gyroparams, accelparams, magparams를 사용하여 개별 센서의 속성을 지정할 수 있습니다.

별도의 설명이 없는 한, 다음 플롯에서는 x축 측정값만 표시됩니다. 슬라이더를 사용하여 대화형 방식으로 파라미터를 조정합니다.

디폴트 파라미터

자이로스코프 모델의 디폴트 파라미터는 이상적인 신호를 시뮬레이션합니다. 정현파 입력값이 주어진 경우, 자이로스코프 출력값이 정확히 일치해야 합니다.

params = gyroparams
params = 
  gyroparams with properties:

    MeasurementRange: Inf             rad/s      
          Resolution: 0               (rad/s)/LSB
        ConstantBias: [0 0 0]         rad/s      
    AxesMisalignment: [3⨯3 double]    %          

                   NoiseDensity: [0 0 0]           (rad/s)/√Hz
                BiasInstability: [0 0 0]           rad/s      
                     RandomWalk: [0 0 0]           (rad/s)*√Hz
                      NoiseType: "double-sided"               
    BiasInstabilityCoefficients: [1⨯1 struct]                 

           TemperatureBias: [0 0 0]    (rad/s)/°C    
    TemperatureScaleFactor: [0 0 0]    %/°C          
          AccelerationBias: [0 0 0]    (rad/s)/(m/s²)

% Generate N samples at a sampling rate of Fs with a sinusoidal frequency
% of Fc.
N = 1000;
Fs = 100;
Fc = 0.25;

t = (0:(1/Fs):((N-1)/Fs)).';
acc = zeros(N, 3);
angvel = zeros(N, 3);
angvel(:,1) = sin(2*pi*Fc*t);

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Ideal Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Ideal Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

하드웨어 파라미터 조정

다음 파라미터는 하드웨어 제한 사항 또는 결함을 모델링합니다. 일부 파라미터는 보정을 통해 수정할 수 있습니다.

MeasurementRange는 자이로스코프에 의해 보고되는 최대 절댓값을 결정합니다. 더 큰 절댓값은 포화됩니다. 측정 범위를 정현파 ground-truth 각속도의 진폭보다 작은 값으로 설정할 때 그러한 효과가 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.MeasurementRange = 0.5; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Saturated Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Saturated Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

Resolution에 따라 디지털 측정값의 스텝 크기가 달라집니다. 이 파라미터를 사용하여 ADC(아날로그-디지털 변환기)에서 양자화 효과를 모델링합니다. 파라미터를 일반적인 값보다 훨씬 큰 값으로 늘릴 때 그러한 효과가 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.Resolution = 0.5; % (rad/s)/LSB

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Quantized Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Quantized Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

AxesMisalignment는 센서 축에서의 왜도 크기입니다. 이러한 왜도는 일반적으로 센서가 PCB에 장착될 때 발생하며 보정을 통해 수정할 수 있습니다. x축을 약간 기울이고 x축과 y축 모두를 플로팅할 때 그러한 효과가 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
xMisalignment = 2; % percent
imu.Gyroscope.AxesMisalignment = [xMisalignment, 0, 0]; % percent

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1:2), '--', t, gyroData(:,1:2))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Misaligned Gyroscope Data')
legend('x (ground truth)', 'y (ground truth)', ...
    'x (gyroscope)', 'y (gyroscope)')

Figure contains an axes object. The axes object with title Misaligned Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 4 objects of type line. These objects represent x (ground truth), y (ground truth), x (gyroscope), y (gyroscope).

ConstantBias는 하드웨어 결함으로 인해 센서 측정값에서 발생합니다. 이러한 편향은 온도와 같은 환경적 요인 때문에 생기는 것이 아니므로 보정을 통해 수정할 수 있습니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
xBias = 0.4; % rad/s
imu.Gyroscope.ConstantBias = [xBias, 0, 0]; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Biased Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

랜덤 잡음 파라미터 조정

다음 파라미터는 센서 측정값의 랜덤 잡음을 모델링합니다. 이러한 파라미터에 대한 자세한 내용은 Allan 분산을 사용하여 관성 센서 잡음 분석 예제에서 확인할 수 있습니다.

NoiseDensity는 센서 측정값의 백색 잡음 양입니다. 자이로스코프에 대한 각도 무작위 행보 또는 가속도계에 대한 속도 무작위 행보로 불리기도 합니다.

rng('default')

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.NoiseDensity = 0.0125; % (rad/s)/sqrt(Hz)

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('White Noise Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title White Noise Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

BiasInstability는 센서 측정값의 핑크 잡음 또는 플리커 잡음 양입니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.BiasInstability = 0.02; % rad/s

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Bias Instability Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Bias Instability Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

RandomWalk는 센서 측정값의 브라운 잡음 양입니다. 자이로스코프에 대한 속도 무작위 행보 또는 가속도계에 대한 가속도 무작위 행보로 불리기도 합니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.RandomWalk = 0.091; % (rad/s)*sqrt(Hz)

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Random Walk Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Random Walk Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

환경 파라미터 조정

다음 파라미터는 센서 환경의 변화로 인해 발생하는 잡음을 모델링합니다.

TemperatureBias는 디폴트 작동 온도와의 온도 차이로 인해 센서 측정값에 추가된 편향입니다. 대부분의 센서 데이터시트에는 디폴트 작동 온도가 섭씨 25도로 나와 있습니다. 파라미터를 0이 아닌 값으로 설정하고 작동 온도를 섭씨 25도가 넘는 값으로 설정할 때 이러한 편향이 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.TemperatureBias = 0.06; % (rad/s)/(degrees C)
imu.Temperature = 35;

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Temperature-Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Temperature-Biased Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

TemperatureScaleFactor는 작동 온도의 변화로 인한 센서 스케일링 인자의 오차입니다. 이로 인해 측정값 스케일링에서 오차가 발생합니다. 바꿔 말하면 아이디얼(ideal) 값이 작을수록 큰 값보다 오차가 작습니다. 온도가 선형적으로 증가할 때 이러한 오차가 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.TemperatureScaleFactor = 3.2; % %/(degrees C)

standardTemperature = 25; % degrees C
temperatureSlope = 2; % (degrees C)/s

temperature = temperatureSlope*t + standardTemperature;

gyroData = zeros(N, 3);
for i = 1:N
    imu.Temperature = temperature(i);
    [~, gyroData(i,:)] = imu(acc(i,:), angvel(i,:));
end

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Temperature-Scaled Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Temperature-Scaled Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

AccelerationBias는 선가속도로 인해 자이로스코프 측정값에 추가된 편향입니다. 이 파라미터는 자이로스코프에 한정됩니다. 파라미터를 0이 아닌 값으로 설정하고 0이 아닌 입력 가속도를 사용할 때 이러한 편향이 나타납니다.

imu = imuSensor('SampleRate', Fs, 'Gyroscope', params);
imu.Gyroscope.AccelerationBias = 0.3; % (rad/s)/(m/s^2)

acc(:,1) = 1;

[~, gyroData] = imu(acc, angvel);

figure
plot(t, angvel(:,1), '--', t, gyroData(:,1))
xlabel('Time (s)')
ylabel('Angular Velocity (rad/s)')
title('Acceleration-Biased Gyroscope Data')
legend('x (ground truth)', 'x (gyroscope)')

Figure contains an axes object. The axes object with title Acceleration-Biased Gyroscope Data, xlabel Time (s), ylabel Angular Velocity (rad/s) contains 2 objects of type line. These objects represent x (ground truth), x (gyroscope).

참고 항목

| | |