MEMS 기반의 가속도 센서와 자이로 센서는 온도 변화에 따라 출력 값이 변화합니다. 자이로 센서와 가속도 센서를 고정한 상태로 온도를 변화시키면서 AD 변환된 raw 데이터를 받아보면 다음에서와 같이 센서의 출력 데이터가 온도에 영향을 받아 변하는 현상을 볼 수 있습니다.
// temp accl_x accl_y accl_z gyro_x gyro_y gyro_z temp
53 8 437 -3733 -68 -2 0 612
51 5 420 -3730 -68 -2 0 596
52 -1 422 -3739 -68 -5 0 581
51 -6 400 -3730 -69 -3 0 566
50 -2 404 -3734 -70 -1 0 553
50 -13 394 -3739 -70 -6 0 542
49 -13 383 -3739 -71 -7 0 529
49 -15 385 -3742 -72 -5 0 518
48 -22 376 -3742 -72 -7 0 506
48 -35 379 -3750 -72 -4 0 494
47 -34 375 -3756 -73 -4 0 484
47 -36 367 -3743 -72 -6 0 475
46 -38 358 -3751 -74 -7 0 465
45 -56 359 -3753 -74 -6 0 456
46 -49 359 -3749 -74 -7 0 446
45 -49 360 -3762 -75 -7 0 438
43 -43 349 -3759 -75 -8 0 429
43 -54 340 -3759 -77 -8 0 421
43 -54 335 -3756 -77 -7 0 413
43 -68 330 -3761 -77 -8 0 406
42 -66 335 -3764 -77 -7 0 398
42 -59 330 -3761 -77 -8 0 391
43 -69 320 -3766 -76 -10 0 385
42 -70 320 -3770 -78 -8 0 378
41 -65 313 -3761 -76 -6 0 372
51 5 420 -3730 -68 -2 0 596
52 -1 422 -3739 -68 -5 0 581
51 -6 400 -3730 -69 -3 0 566
50 -2 404 -3734 -70 -1 0 553
50 -13 394 -3739 -70 -6 0 542
49 -13 383 -3739 -71 -7 0 529
49 -15 385 -3742 -72 -5 0 518
48 -22 376 -3742 -72 -7 0 506
48 -35 379 -3750 -72 -4 0 494
47 -34 375 -3756 -73 -4 0 484
47 -36 367 -3743 -72 -6 0 475
46 -38 358 -3751 -74 -7 0 465
45 -56 359 -3753 -74 -6 0 456
46 -49 359 -3749 -74 -7 0 446
45 -49 360 -3762 -75 -7 0 438
43 -43 349 -3759 -75 -8 0 429
43 -54 340 -3759 -77 -8 0 421
43 -54 335 -3756 -77 -7 0 413
43 -68 330 -3761 -77 -8 0 406
42 -66 335 -3764 -77 -7 0 398
42 -59 330 -3761 -77 -8 0 391
43 -69 320 -3766 -76 -10 0 385
42 -70 320 -3770 -78 -8 0 378
41 -65 313 -3761 -76 -6 0 372
이러한 온도 변화에 따른 가속도 센서와 자이로 센서의 바이어스는 Kalman filter로 두 센서의 출력을 융합하여 Euler 각도를 계산하는데 에러를 발생시킵니다. 만일 온도 변화에 따른 센서의 출력 데이터 변화가 선형에 가깝다면 1차 방정식으로 쉽게 보상 가능할 것입니다.
NT-ARS 센서에 온도를 올리고 내리는 실험을 통해 온도 변화에 따른 출력 데이터를 모으고 이를 엑셀의 그래프로 그려 보았습니다. 데이터가 원점 근처에 모여있는것은, 온도에서 25도를 빼고 센서 출력 데이터에서도 평균을 빼서 그래프를 그렸기 때문입니다. 가속도 센서의 데이터(accl_x_c, accl_y_c, accl_z_c)가 각속도 센서의 데이터(gyro_x_c, gyro_y_c)보다 온도 변화에 영향을 더 크게 받는 것을 볼 수 있고 그래프의 모양도 대략 선형을 띄고 있습니다. 일이 아주 쉬워질 것 같습니다. ^^
온도에 의한 바이어스를 보정하기 위해서는 수집된 데이터들로부터 각 축에 대한 1차 함수의 기울기만 구하면 됩니다. 기울기를 안다면 온도에 따른 변위를 계산하여 실측에서 빼줌으로 온도가 변하더라도 값을 일정하게 유지할 수가 있습니다. 수집한 데이터로부터 1차함수의 계수를 구하는 방법은 LMS(Least Mean Square) 방법을 사용합니다. 다음 첨부 문서를 참고하기 바랍니다.
C 코드로는 다음과 같이 간단하게 구현할 수 있습니다.
double a = 0;
double b = 0;
double c = 0;
double d = 0;
double e = 0;
double f = 0;
double b = 0;
double c = 0;
double d = 0;
double e = 0;
double f = 0;
while (반복 조건) {
double x = ReadTemperature();
double y = ReadSensorRawData();
a += x*x;
b += x;
c += x;
d += 1;
e += x*y;
f += y;
}
float s = 1.f/(a*d - b*c);
temp_coef = s*(d*e - b*f);
double x = ReadTemperature();
double y = ReadSensorRawData();
a += x*x;
b += x;
c += x;
d += 1;
e += x*y;
f += y;
}
float s = 1.f/(a*d - b*c);
temp_coef = s*(d*e - b*f);
첨부 문서에서와 같은 방법으로 1차 함수의 기울기를 구하면, 기울기를 온도계수(Temperature Coefficient)로 사용하여 다음과 같이 보정하게 됩니다.
보정된 값 = raw 값 - 온도계수 x 온도
이렇게 센서의 온도 변화에 따른 바이어스를 보정하게 되면 ARS센서가 계산한 Euler 각도가 온도 변화에 따라 틀어지는 현상을 막을 수 있으며, 또한 센서의 온도가 충분히 안정될 때까지 기다리는 워밍업 시간을 따로 둘 필요도 없어집니다.
댓글 없음:
댓글 쓰기