로봇 센서, 못 봐서가 아니라 늦게 봐서 넘어집니다
로봇이 넘어지는 영상을 보면 못 봤나 싶습니다. 아닙니다. 봤습니다. 늦게 봤을 뿐이죠. 센서 목록을 카메라, 라이다, IMU 하는 식으로 종류별로 정리하는 대신 갱신 주기를 전부 밀리초로 바꿔 한 줄에 늘어놓아 봤더니, 로봇의 감각이 종류가 아니라 속도로 층이 갈린다는 게 그제야 눈에 들어왔습니다.
주기를 전부 밀리초로 바꿔 한 줄에 늘어놓았습니다
가장 안쪽부터 적어 보겠습니다. 모터 드라이버의 전류 루프는 초당 2만 번 돕니다. 0.05밀리초에 한 번이죠. 관절 엔코더와 위치 제어 루프는 대개 1킬로헤르츠, 1밀리초입니다. 자세를 재는 IMU도 1킬로헤르츠 이상이고, 원시 데이터는 4킬로헤르츠까지 나옵니다. 발바닥의 힘·토크 센서와 손끝의 촉각 센서도 비슷한 대역입니다. 여기까지가 한 덩어리입니다. 그다음이 문제입니다. 카메라는 초당 30프레임, 한 프레임에 33밀리초가 걸립니다. 라이다는 10에서 20헤르츠, 50에서 100밀리초죠. 0.05밀리초와 100밀리초. 같은 로봇 안에서 감각의 빠르기가 2천 배 차이 납니다. 여기에 덧붙일 정직한 각주가 하나 있습니다. 위 숫자는 센서가 값을 내놓는 주기일 뿐입니다. 그 값이 계산을 거쳐 관절 명령으로 바뀌기까지의 처리 시간과 통신 지연은 따로 붙습니다. 그러니까 실제 격차는 여기 적은 것보다 더 벌어집니다.
33밀리초 동안 로봇은 5센티미터를 갑니다
이 격차가 얼마나 큰지 걸음으로 환산해 봤습니다. 사람이 조금 빠르게 걷는 속도가 초속 1.5미터 남짓입니다. 카메라 한 프레임인 0.0333초를 곱하면 5센티미터. 로봇이 화면 한 장을 받아 보는 사이에 몸이 5센티미터를 이동한다는 뜻입니다. 이게 왜 문제인지는 발바닥 크기와 같이 놓아야 보입니다. 성인 발 길이가 25센티미터 정도이고, 서 있을 때 무게중심이 벗어나면 안 되는 지지 영역이 대략 그 안쪽입니다. 5센티미터는 그 영역의 5분의 1입니다. 게다가 균형이 무너지기 시작한 뒤 되돌릴 수 있는 시간은 수십 밀리초 단위죠. 카메라 한 프레임을 기다리면 그 창의 절반 이상을 기다리는 데 써 버립니다. 그래서 실제 휴머노이드에서 넘어지지 않는 일은 카메라가 맡지 않습니다. IMU와 관절 엔코더, 그리고 발바닥 힘 센서가 맡습니다. 발바닥 힘 센서를 쓰면 카메라가 지면 변화를 알아채기 40~60밀리초 전에 걸음을 고칠 수 있다는 보고가 있습니다. 카메라는 넘어지지 않기 위한 장치가 아니라 어디로 갈지 정하는 장치입니다.
그래서 센서는 종류가 아니라 층으로 나뉩니다
이렇게 놓고 보면 분류가 다시 그려집니다. 교과서는 센서를 접촉식과 비접촉식, 혹은 시각·촉각·관성으로 나눕니다. 로봇을 만드는 쪽에서 실제로 쓰는 구분은 다릅니다. 자기 몸을 재는 감각과 바깥을 재는 감각, 두 층입니다. 앞쪽은 엔코더, IMU, 힘·토크 센서가 맡습니다. 빠르고, 값이 정확하고, 조명이나 날씨에 흔들리지 않죠. 뒤쪽은 카메라와 라이다와 뎁스 센서입니다. 느리고, 조건에 취약하고, 대신 세상을 알려 줍니다. 사람도 똑같이 나뉩니다. 발목이 접질리는 순간 우리는 눈으로 보고 대응하지 않습니다. 척수 반사가 먼저 근육을 당기고, 눈은 한참 뒤에 상황을 파악하죠. 촉각은 원래 안쪽 층에 속해야 하는 감각인데, 로봇에서는 아직 층을 다 채우지 못했습니다. 손끝 몇 군데에만 겨우 촉각을 붙이고 있는 단계라, 사람 피부처럼 온몸이 1밀리초마다 접촉을 보고하는 상태와는 거리가 있습니다. 이 층 구분은 부품을 고를 때도 그대로 적용됩니다. 안쪽 층의 센서는 값이 늦으면 로봇이 넘어지므로 주기와 지연이 무엇보다 중요하고, 그래서 관절 안에 붙여 배선을 짧게 만듭니다. 바깥 층은 조금 늦어도 괜찮은 대신 정보의 양이 중요하니 해상도와 시야각을 삽니다. 두 층에 같은 잣대를 들이대면 엉뚱한 결론이 나옵니다. 카메라 해상도를 두 배로 올려도 균형은 조금도 좋아지지 않고, 오히려 처리 시간이 늘어 반응이 느려질 수 있습니다.
늦은 센서를 쓰는 방법은 하나뿐입니다
느린 센서를 빠르게 만들 수 없다면 남는 답은 예측입니다. 로봇의 상태 추정기는 IMU 값을 1밀리초마다 적분해 지금 몸이 어디에 어떤 자세로 있는지를 계속 갱신합니다. 적분만 하면 오차가 쌓이니, 33밀리초마다 도착하는 카메라 값으로 그 누적 오차를 잡아 줍니다. 칼만 필터든 팩터 그래프든 구조는 같습니다. 빠른 센서가 현재를 메우고, 느린 센서가 가끔 바로잡는 방식이죠. 뒤집어 말하면 로봇은 대부분의 시간을 추측으로 삽니다. 눈으로 확인한 세계에 사는 게 아니라, 1밀리초 전 자기 관절 각도에서 밀어낸 예측 위에 서 있습니다. 이 추측이 틀리는 조건, 이를테면 예상보다 미끄러운 바닥이나 예상보다 높은 문턱을 만나면 넘어집니다. 그래서 요즘 개발이 시뮬레이터 안에서 수만 번 먼저 넘어져 보는 쪽으로 옮겨 간 것도 자연스럽습니다. 실제 세계에서 예측이 깨지는 경우를 미리 겪게 하는 일이니까요.
맺음말
로봇 센서 사양표를 볼 때 우리는 대개 해상도부터 봅니다. 몇 메가픽셀인지, 라이다가 몇 미터까지 보는지. 정작 그 로봇이 넘어지느냐 마느냐를 정하는 숫자는 그 옆에 작게 적힌 헤르츠입니다. 초당 몇 번 값을 내놓는가. 감각의 목록이 아니라 감각의 시계표가 로봇의 운동 능력을 결정합니다. 다음에 로봇이 비틀거리는 영상을 보게 되면 무엇을 못 봤는지 대신 언제 알았는지를 떠올려 보시기 바랍니다. 대개는 알고 있었고, 다만 늦었습니다.
참고 자료
- Firgelli, "Humanoid Robot Actuators: The Complete Engineering Guide" — 모터 드라이버 전류 루프 20kHz, IMU 1kHz 이상, 인지 센서 10~30Hz 및 발바닥 힘 센서의 40~60ms 선행 — 원문 링크
- Analog Devices, "Enhancing Robotic Localization with IMUs" — IMU 원시 출력이 최대 4kHz까지 제공되는 점 — 원문 링크
- Fallon 외, "Drift-Free Humanoid State Estimation Fusing Kinematic, Inertial and LIDAR Sensing", MIT CSAIL — 빠른 관성·기구학 값과 느린 라이다를 융합하는 상태 추정 구조 — 원문 링크