imu_complementary_filter를 이용한 IMU 자세 추정

IMU를 이용한 자세추정 방법은 보통 보상 필터를 많이 사용한다. 3축 가속도 센서와 3축 자이로스코프를 사용하고, 3축 지자기 센서를 이용하여 보정한다. 가속도 센서는 3축의 가속도 값 (m/s^2)을 두번 적분하여 위치를 구할수 있으나 회전 및 진동 등에 의해서 값이 변하는 단점이 있고, 자이로스코프는 3축의 각속도 (rad/s)를 한번 적분하여 회전각을 알아낼수 있지만 각 축에 포함된 화이트 노이즈 덕분에 시간이 흐를수록 값이 변한다 (일명 드리프트 현상).

따라서 각각의 센서가 가지는 장점을 뽑아서 사용하자는게 보상필터이고, 간단하게는 Low-pass filter, High-pass filter를 사용하거나, 두개의 Band-pass filter를 사용하는게 일반적이다. 이게 바로 보상 (complementary) 필터이다.

직접 구현해서 사용하는 것도 방법이긴하나, 이미 많이 알려진 알고리즘이고 ROS에 패키지로도 존재하므로 쉽게 사용이 가능하다.

사용할 패키지는 imu_complementary_filter이다. 사용 방법은 연결된 링크의 wiki 페이지에 자알~ 되어있다. 논문을 기반으로 개발된 것 같고, 간단한(?) 블록 다이러그램은 다음과 같다.

Ref: https://www.mdpi.com/1424-8220/15/8/19302

설치는 다음과 같이 하고,

$ sudo apt install ros-kinetic-imu-complementary-filter

사용은 다음과 같이,

$ rosrun imu_complementary_filter complementary_filter_node

complementary_filter_node는 /imu/data_raw (sensor_msgs/Imu)를 Subscribe 한다. 사용하려는 IMU가 위 토픽을 Publish 한다면 고맙게 사용할 수 있고, 토픽 이름이 다르다면 다음과 같이 실행하면 끝!,

$ rosrun imu_complementary_filter complementary_filter_node /imu/data:=/<your_topic_name>

결과로는 imu/data (sensor_msgs/Imu)를 Publish 한다. 결과를 살펴보면 입력 데이터에 Orientation 값이 계산되어 나옴을 확인할 수 있다.