2015년 7월 22일 수요일

IMU 센서 사용법

IMU센서 테스트 관련된 내용을 정리해 놓습니다.

참고로 아두이노, 프로세싱을 주로 사용하는 데, 이와 관련된 내용은 관련 사이트나 해당 도구 활용 사례를 정리한 레퍼런스를 참고하시길 바랍니다.

1. 개요
IMU는 inertial measurement unit (관성측정장치)의 약자이다.
다음과 같이, 자세 변환, 위치 이동에 대한 변화속도, 변위량을 측정할 수 있다.

   
IMU (www.ni.com)


그러므로, 로봇이나 측정된 센서 값의 자세나 위치를 제어(보정)할 때 많이 사용된다. IMU센서는 측정할 수 있는 값의 종류에 따라 DoF (degree of freedum. 자유도)가 높아진다. 예를 들어, Adafuit 10-DoF 칩은 L3GD20H (3축 자이로 센서), LSM303 (3축 컴파스 및 3축 가속도계), BMP180 (기압계)로 구성되어 있고, 측정 값이 3 + 3 + 3 + 1 이므로 10 DoF 센서로 표시됩니다 .아래는 SD746 IMU 센서이며, 6 DoF를 가진다.

센서에서 얻은 값은 오차가 포함되어 있다. 그러므로, 가속도를 그대로 누적한다고, 정확한 이동거리가 나오지 않는다. 그러나, 오차가 정규분포를 가진다면, 그 평균값으로 어느 정도 정밀한 이동거리를 얻을 수 있다. 이를 수학적으로 계산하는 방법이 칼만필터이다.

이 글에서는 IMU 센서를 이용해, 3차원 포인트 클라우드를 표시하는 방법만 정리해 본다.


2. 개발
간단한 실험을 위해, Adafuit 10-DoF IMU 센서를 사용해서, 관련 레퍼런스를 참고하여, 작업한다.

1) 우선 IMU센서 핀을 납땜하고, 아두이노 보드 입력핀과 결선한다.


센서 보드 핀의 SCL핀은 아두이노 보드 A5로 결선.
센서 보드 핀의 SDA핀은 아두이노 보드 A4로 결선.
센서 보드 핀의 VIN은 아두이노 보드 5V로 결선.
센서 보드 핀의 GND는 아두이노 보드 GND로 결선.


참고로, 나머지 센서 핀들을 인터럽트 및 READY 핀들이다. 자세한 사항은 Adafuit IMU 10-DoF 센서를 구성하는 아래 데이터시트를 참고한다.
2) 아래의 Adafruit 센서 라이브러리를 아두이노 라이브러리에 설치한다.

아울러, 센서 예제 데모인 Adafruit_AHRS 소스를 아래 링크에서 다운로드 받아, 아두이노 폴더의 라이브러리에 설치한다.


그 결과, 라이브러리 폴더 안에는 다음과 같은 폴더들이 포함될 것이다.


3) Adafruit 센서 예제 데모를 실행하기 위해 필요한 아래의 프로세싱 라이브러리를 설치한다.

4) Adafruit_AHRS 예제 데모 소스에서 ahrs_10dof 폴더의 소스를 아두이노에 로드하고 빌드해, 아두이노 보드에 전송한다.

5) Adafruit_AHRS 예제 데모 소스에서 processing 폴더의 bunnyrotate 폴더 내 10-DoF 센서 프로세싱 예제를 실행한다.

6) 다음과 같은 3차원 Bunny 모델이 센서 자세에 따라 회전하는 것을 확인할 수 있다.

 그림. 좌측 그림(Roll=0도 일때 모습)   우측 그림(Roll=90도 일때 모습)

만약, 제대로 동작 안되면, 테스터 등을 이용해 결선이 제대로 되었는 지 등을 확인한다.



3. 결론
센서에서 몇몇 튀는 값들이 있어, 이 부분은 필터링해야 한다. 본인은 간단히 아래 함수로 평균값 처리하였다.

void smoothIMUdata(String[] list)
{
  roll  = float(list[1]);
  pitch = float(list[2]);
  yaw   = float(list[3]);
  
  if(totalIMUdata < 10)
  {
    rolls[totalIMUdata] = roll;
    pitchs[totalIMUdata] = pitch;
    yaws[totalIMUdata] = yaw;        
    totalIMUdata++;
  }
  else
  {
    int i = 0;
    for(; i < 9; i++)
    {
      rolls[i] = rolls[i + 1];
      pitchs[i] = pitchs[i + 1];
      yaws[i] = yaws[i + 1];
    }
    rolls[i] = roll;
    pitchs[i] = pitch;
    yaws[i] = yaw;

    roll = pitch = yaw = 0.0F;
    for(i = 0; i < 10; i++)
    {
      roll += rolls[i];
      pitch += pitchs[i];
      yaw += yaws[i];
    }  
    
    roll = roll / (float)totalIMUdata;
    pitch = pitch / (float)totalIMUdata;
    yaw = yaw / (float)totalIMUdata;
  }  
}

정밀도는 IMU센서 가격이 비례하는 부분이 있다. 다만, 시작품 개발 정도는 이정도도 충분하다.

이제, 3차원 포인트 클라우드를 취득하는 라이다나 RGB-D센서 자세를 고려해, 그 좌표값들을 보정할 수 있다. 다음부터는 RGB-D 및 RPLiDAR를 이용해, 좌표값 보정을 해보도록 한다. 가속도를 사용해, SLAM을 처리하는 것은 그 다음이다.


4. 참고자료
1. 포인트 정합 관련 자료
2. 실내 맵핑
3. IMU캘리브레이션
4. Gimbol 처리
5. Kalman Filter 처리
6. Kalman Filter 소스
7. Balancing Robot
8. RTIMULib








댓글 2개:

  1. 아두이노와 저렇게 연결하고 프로세싱하면 한점에서 고정된채 움직이는것이 아니라 3차원으로 움직이는것도 가능한가요?

    답글삭제
  2. 늦게 발견해 보았네요. 프로세싱은 3차원은 물론 지원하고, 다양한 라이브러리를 통해 키넥트, 센서 등도 쉽게 지원됩니다. 매우 강력하고, 맥 환경에서 syphon 을 사용하면, 프로젝션 맵핑도 됩니다. 관련 내용은 아래 링크를 참고하시면 됩니다.

    1. https://www.youtube.com/watch?v=bujvmvPyQiM
    2. http://daddynkidsmakers.blogspot.nl/2016/01/processing-kinect-syphon-vpt.html?view=sidebar

    답글삭제