프레임

라이다가 "1m 앞에 벽"이라고 하면, 그건 누구의 앞일까?

프레임

원점과 축 방향을 정한 기준

위치를 숫자로 적으려면 먼저 기준이 있어야 합니다. 어디가 0인지(원점), 어느 쪽이 x이고 y인지(축)를 정한 것이 프레임(frame), 곧 좌표계입니다. 같은 점도 기준을 정해야 (2, 1) 같은 숫자가 됩니다.

ROS에서 길이는 미터, 각도는 라디안이 기본 단위입니다.

축의 약속

x는 앞, y는 왼쪽, z는 위

ROS의 약속(REP 103)에서 로봇 몸의 프레임은 x가 앞, y가 왼쪽, z가 위입니다. 위에서 내려다볼 때 반시계 방향으로 도는 것이 + 각도입니다. 이 약속 덕분에 남이 만든 노드와도 방향이 맞습니다.

RViz는 x를 빨강, y를 초록, z를 파랑으로 그립니다. 이 강의 그림은 x 붉은색, y 청록입니다.

부품마다

몸통, 바퀴, 센서마다 프레임

로봇은 프레임 하나가 아니라 여러 개의 묶음입니다. 몸통의 기준인 base_link, 라이다가 붙은 자리인 base_scan, 바퀴마다 붙은 프레임이 따로 있습니다. 센서는 자기 프레임 기준으로 잰 값을 내보냅니다.

TurtleBot3의 실제 프레임 이름입니다. 14강에서 이 로봇을 띄웁니다.

바깥에도

세상에도 기준점이 있습니다

로봇 몸 밖에도 프레임이 필요합니다. 지도의 원점인 map, 로봇이 출발한 자리를 기준으로 삼는 odom이 대표적입니다. 로봇은 이 바깥 프레임들 위를 움직입니다.

map과 odom이 왜 따로 있는지는 5편에서 봅니다.

같은 장애물

기준이 바뀌면 숫자가 바뀝니다

로봇 정면 2m에 있는 장애물은 로봇 기준으로 (2.0, 0.0)입니다. 그런데 지도 기준으로는 (3.2, 2.0)입니다. 점은 하나인데 숫자는 기준마다 다릅니다. 그래서 위치 값에는 늘 어느 프레임 기준인지가 함께 붙어 다닙니다.

숫자는 설명을 위해 고른 예시입니다. 메시지의 header.frame_id가 그 이름표입니다(4강 4편).

TF2

프레임 사이 관계를 한곳에서 관리

프레임 사이 관계를 모아 두고, 물으면 계산해 주는 ROS 2 라이브러리가 TF2(tf2)입니다. 노드들은 관계를 /tf, /tf_static 토픽으로 알리고, 필요한 노드는 "A 기준으로 B는 어디?"라고 묻기만 하면 됩니다.

ROS 1 시절의 tf를 새로 고쳐 만든 2세대라서 이름이 tf2입니다.

다음 편

로봇 기준 (2.0, 0.0)은 어떤 계산을 거쳐 지도 기준 숫자가 될까요?

3편이 점은 누구 기준인가 12강 목록