AHRS는 Attitude and Heading Reference System의 약자로, 세 축으로 나타낼 수 있는 센서로 이루어져 있어 Roll, Pitch, Yaw의 정보를 수집하는 센서이다. 이는 각각 3축의 자이로스코프(각속도계), 가속도계, 자기계 센서가 MEMS(microelectromechanical systems)로 실리콘 기판 위에 집적화된 것이다.
IMU와 AHRS의 차이점은, 단순히 자세(attitude)와 방위(heading) 만 측정해 센싱 데이터를 전달하는 IMU와는 다르게, AHRS는 on-board 프로세싱 과정을 거쳐 전달해준다. 세 개의 센서로부터의 출력 데이터를 필터 등으로 필터링/융합한 뒤 데이터가 전달되므로 일반 IMU보다 고가이다.
3축 gyroscope(16bit), 3축 acclerometer(16bit), 3축 magnetometer(13bit)로 이루어진 AHRS로, USB 포트에 꽂아 사용한다.
해당 기기는 축으로 NED 타입을 사용하여, IMU에선 자북에 대해 x(north), y(east), z(down)으로 표기한다.
ROS를 지원하지 않는 오리지널 소스는 GitHub에서 확인할 수 있으며(https://github.com/withrobot/myAHRS_plus), 3D 시각화 도구도 포함되어 있다.
ROS에서 myAHRS+를 사용할 수 있도록 만들어진 드라이버 패키지가 있다.
이 패키지는 ROS에서 사용되는 ENU 좌표계(오른손 법칙 따름)로 변환한 뒤 메시지를 퍼블리시한다. IMU에서 사용되는 ENU 좌표계는 자북을 기준으로 x(east, forward), y(north, left), z(up)이다.
GitHub에서 myAHRS의 드라이버 패키지를 내려받아 설치한다.
$ cd ~/catkin_ws/src
$ git clone https://github.com/robotpilot/myahrs_driver.git
$ catkin_make
[ 1 ] USB로 기기를 컴퓨터에 연결한다.
[ 2 ] USB 포트 이름을 확인한다. 보통 허브 없이 바로 USB-5pin 케이블로 컴퓨터에 연결하면 ttyACM0
로 뜬다.
$ ls /dev/tty*
[ 3 ] 기기에 실행 권한을 부여한다.
$ sudo chmod 777 /dev/tty*
[ 4 ] 기기를 작동시킨다. 만약 포트 관련 에러가 난다면 myahrs_driver.launch
파일의 파라미터에서 포트 이름을 위에서 조회한 이름(ttyACM1
등)으로 변경해주어야 한다.
$ roslaunch myahrs_driver myahrs_driver.launch
# lauch 파일로, Rviz도 함께 실행된다.
[ 5 ] Rviz로 축을 확인한다. Rviz는 launch 파일 실행과 동시에 함께 켜질 것이다. 좌측에서 Axes
, Imu
의 체크박스를 각각 선택하면 아래 사진처럼 크게 분홍색 화살표가 보일 것이다. 현재 IMU가 가리키고 있는 방향이다.
IMU화살표가 너무 커서 축이 잘 보이지 않는다. Imu
의 옵션에서 Alpha
값을 0.3 정도로 조정하면 축이 보일 것이다.
위 패키지로 실행하는 노드는 /myahrs_driver
이다.
노드에서 퍼블리시하는 토픽은 아래와 같다.
토픽 | 자료형 | 내용 |
---|---|---|
imu/data_raw | sensor_msgs/Imu | 각속도와 가속도에 대한 raw 데이터 |
imu/data | sensor_msgs/Imu | orientation, 각속도, 가속도 데이터 |
imu/mag | sensor_msgs/MagneticField | 지자기계 데이터 |
imu/temperature | std_msgs/Float64 | 온도 데이터 |
우선 가장 많이 쓰일 /imu/data
의 값을 살펴보자. 해당 토픽은 IMU의 각속도 센서와 가속도 센서로부터 받아오는 값이다.
자료형은 sensor_msgs/Imu으로, 토픽 /imu/data_raw
도 동일한 형식이다.
header
orientation
x
, y
, z
, w
orientation_covariance
angular_velocity
x
, y
, z
angular_velocity_covariance
linear_acceleration
x
, y
, z
linear_acceleration_covariance
해당 토픽 메시지 예시는 다음과 같다.
header:
seq: 41812
stamp:
secs: 1637586719
nsecs: 256241647
frame_id: "imu_link"
orientation:
x: -0.808913316208
y: -0.435244439802
z: 0.232719446609
w: 0.319473290984
orientation_covariance: [4.592449e-06, 0.0, 0.0, 0.0, 4.592449e-06, 0.0, 0.0, 0.0, 4.592449e-06]
angular_velocity:
x: 0.0127835633439
y: 0.00745707887733
z: 0.00639178167193
angular_velocity_covariance: [5.895184e-06, 0.0, 0.0, 0.0, 5.895184e-06, 0.0, 0.0, 0.0, 5.895184e-06]
linear_acceleration:
x: -0.97686408796
y: -7.06311058604
z: -6.97212800034
linear_acceleration_covariance: [0.0007199025610000001, 0.0, 0.0, 0.0, 0.0007199025610000001, 0.0, 0.0, 0.0, 0.0007199025610000001]
이 토픽은 지자기 센서로부터 받아오는 값이다. /imu/data
의 메시지 타입은 sensor_msgs/MagneticField이다.
header
magnetic_field
x
, y
, z
magnetic_field_covariance
아래는 토픽의 예시값이다.
header:
seq: 109509
stamp:
secs: 1637587396
nsecs: 451413832
frame_id: "imu_link"
magnetic_field:
x: 0.000173223052979
y: 0.0003
z: -2.22205276489e-05
magnetic_field_covariance: [1.07247080196e-11, 0.0, 0.0, 0.0, 1.07247080196e-11, 0.0, 0.0, 0.0, 1.07247080196e-11]
그럼 직접 해당 사항들을 살펴보자.
launch 파일이 실행중인 터미널은 그대로 두고, 다른 터미널을 하나 더 열어 rqt 그래프부터 확인하자. 아래 사진은 각각 Dead sinks
를 체크하지 않은 모습이다.
$ rqt_graph
또한 토픽들의 메시지 내용을 rostopic echo
명령어를 통해 알아보자. 출력 종료는 ctrl
+ C
이다.
$ rostopic echo /imu/data
$ rostopic echo /imu/mag
런치 파일에 정의된 파라미터들이다. 특별히 따로 설정해야 할 부분은 없고, 단지 IMU가 연결된 포트 이름인 port
만 신경써서 변경해주면 된다.
파라미터 | 자료형 | default값 | 설명 | |
---|---|---|---|---|
port | string | default | /dev/ttyACM0 | IMU를 실행할 포트 |
baud_rate | int | 115200 | 시리얼 기기의 보 레이트(baud rate) | |
frame_id | string | imu_link | 출력 메시지의 frame ID | |
parent_frame_id_ | string | base_link | tf를 사용하는 frame_id의 부모 frame ID | |
linear_acceleration_stddev | double | 0.026831 | \(\mathrm{m}/\mathrm{s}^{2}\) 단위의 선가속도 공분산 대각 요소의 제곱근 | |
angular_velocity_stddev | double | 0.002428 | \(\mathrm{rad}/\mathrm{s}\) 단위의 각속도 공분산 대각 요소의 제곱근 | |
magnetic_field_stddev | double | 0.00000327486 | T(Tesla) 단위의 지자기계 공분산 대각 요소의 제곱근 | |
orientation_stddev | double | 0.002143 | 라디안 단위의 자세 방향 공분산 대각 요소의 제곱근 |
자기계(compass)는 AHRS의 yaw 각도를 측정하는 데 사용되는데, 이때 기기의 캘리브레이션(calibration)이 필요하다.
자기계의 측정은 왜곡에 영향을 받는데, 이 왜곡에는 hard iron 왜곡과 soft iron 왜곡이 있다. hard iron 에러는 주변에 자석, 전선 등 자기장이 있을 경우 발생하고, 이는 측정 오프셋 에러(measurement offset error)를 일으킨다. soft iron 에러는 주변에 강자성 물체(ferromagnetic materials)가 있어 지구 자기장의 밀도를 왜곡시키고, 이는 스케일링 오프셋 에러(scaling offset errors)를 일으킨다.
myAHRS+ 제조사에서 제공하는 프로그램에 따라 캘리브레이션을 수행하는 방법은 YouTube 영상에서 확인할 수 있다.