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 페이지에 자알~ 되어있다. 논문을 기반으로 개발된 것 같고, 간단한(?) 블록 다이러그램은 다음과 같다.
설치는 다음과 같이 하고,
$ 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 값이 계산되어 나옴을 확인할 수 있다.
imu_filter_madgwick와 비교했을 때 성능은 어떤가요?
서로 비교 검증해보진 않았습니다. 요즘에 IMU를 사용할 일이 생겨 이번엔 imu_filter_madgwick를 사용중입니다. ^^
궁금한 것이 있어서 질문드립니다.
위에 말씀해주신 imu_complementary_filter를 이용하면, odometry도 그릴 수 있을까요?
센서 자체적으로 orientation을 쿼터니언으로 받긴 하는데, imu 자체가 그리는 x,y,z의 odometry를 알고 싶어서요
위 패키지는 IMU의 현재 자세(Pose)를 추정해줄 뿐입니다. 말씀하신 odometry를 계산하기 위해선, 이 자세 및 가속도 값을 이중 적분하는 알고리즘을 사용하셔야 합니다. robot_pose_ekf 가 그 예시중 하나입니다.
답장 주셔서 감사합니다.
한번 해보도록 하겠습니다.