강릉 ITS 세계총회 부스에서 닷새를 보냈다.

로봇이 움직일 때마다 사람이 모였다. 멈춰 있는 로봇은 전시물이고, 걷는 로봇은 공연이었다.

ITS 전시장에 로봇은 거의 없었다. 자율주행차와 신호 제어 사이에서 네발로 걷는 로봇 한 대가 오히려 눈에 띄었다. ITS가 검지한 사고에 마지막으로 대응하는 것이 로봇이라는 이야기가 먹혔다. MBC와 KBS 뉴스에 부스가 나왔고, 기사도 났다.

우리가 보여준 것은 한 줄이다. 카메라가 통제구역 침입을 잡고, 상황판에 뜨고, 사람이 배차를 승인하면 실물 로봇이 출동했다가 돌아온다. 네 분야 중 강릉만 실물이고 나머지 셋은 시뮬레이션이라고 화면에 적어 두었다.

아래 흐름의 단계를 누르면 그 단계에서 실제로 겪은 일이 뜬다.

검지에서 복귀까지 — 출동 흐름단계 클릭

03 · 승인

무엇이 일어나나

사람이 배차를 승인해야 로봇이 나간다. 자동 출동 경로가 생기면 테스트가 막는다.

실제로 겪은 것

자동 출동 로직이 열일곱 분 동안 실물 로봇에 임무 예순여덟 건을 보낸 사고가 있었다. 승인 버튼은 그 뒤에 생겼다.

잘 된 이야기는 여기까지다. 이 글은 안 된 이야기다.

#문제는 화면 밖에 있었다

전시 전에 가장 걱정한 것은 우리 화면이었다. 검지가 멈추거나, 영상이 끊기거나, 터치가 먹지 않거나.

막상 현장에서 화면은 거의 멀쩡했다. 문제의 대부분은 로봇 주행과 무선 구간에서 왔다.

원인은 셋이었다.

첫째, 로봇 플랫폼이 부스 안 웨이포인트를 제대로 잡지 못했다. 로봇이 험지와 벽을 인지하지 못하고 엉뚱한 방향으로 갔다. 충전 도크에 들어가는 데 거듭 실패한 것도 같은 축이다.

둘째, 로봇 플랫폼의 로컬 서버와 우리 서버가 와이파이로 붙어 있었다. 전시장 신호 노이즈에 토큰 발급, 명령, 상태 조회가 끊겼다.

셋째, 로봇 AP와 로컬 서버 사이도 와이파이였다.

세 번째가 보일 때까지 우리는 첫 번째와 두 번째만 의심했다. 무선 구간이 셋이면 어디서 끊겼는지 알 수 없다. 먹통이 될 때마다 추측만 했다.

결론은 한 줄로 줄었다. 무선은 로봇과 AP 사이 한 구간만 남기고, 나머지는 전부 선으로 잇는다.

구간을 누르면 이번 전시의 배선과 다음 전시의 배선이 비교된다.

어디서 끊겼나 — 부스 통신 구간구간 클릭 · 전/후 전환
무선 × 3
유선무선무선무선영상분석 서버관제 화면로봇 플랫폼 로컬 서버로봇 AP로봇

관제 화면 → 로봇 플랫폼 로컬 서버

이번 전시 · 무선

토큰 발급, 임무 명령, 로봇 상태가 전부 이 구간을 지난다. 전시장 와이파이 노이즈에 끊기면 화면은 '먹통'으로만 보였다.

#그래도 화면이 틀린 곳

화면은 멀쩡했다고 썼지만 다 맞는 말은 아니다. 현장에서 고친 것이 열 가지 남짓 있다.

로컬 서버에 IP로 붙으니 빈 200이 돌아왔다. 서버가 호스트 이름으로 라우팅하고 있었고 우리는 그 이름을 몰랐다. hosts 파일에 이름을 적고 주소를 이름으로 바꿨다. 설치 전에 받아 둘 것에 접속 이름 하나가 늘었다.

다시 붙었는데 화면에는 몇 분 전 오류가 계속 떠 있었다. 연동 서버가 성공해도 마지막 오류를 지우지 않았다. 관람객 앞에서 과거 오류는 설명거리만 늘린다.

화면은 지금 상태만 보여 준다. 이걸 원칙으로 굳혔다. 같은 이유로 영상 타일의 8fps 표시도 뺐다. 그 숫자는 질문만 불렀다.

밤사이 정전이 났다. 맥북이 배터리로 넘어가 화면이 꺼지고 잠겼다. 아침에 잠금 화면을 보고 나서야 상시 전원인지 확인하는 항목이 체크리스트에 들어갔다.

가장 뼈아픈 것은 우리 손으로 만든 회귀다. 돌아갈 때 로봇 영상이 어디 갔냐는 현장 피드백을 받고, 복귀 중에도 상황판을 유지하게 고쳤다. 그 수정이 다른 세 화면의 기본값을 건드려 도로와 재난 화면이 까맣게 됐다. 렌더마다 새 배열이 만들어져 무한 렌더에 빠진 것이다.

고치는 데는 오래 걸리지 않았다. 문제는 고친 화면만 보고 다른 화면을 열어 보지 않은 것이다.

운영 중 코드 수정은 요청이 있을 때만, 반영 전에 네 화면을 전부 연다. 전시 첫날 오후에 세운 규칙이다.

#전시 전에 이미 한 번씩 겪은 일들

돌아보면 현장의 문제는 대부분 준비 기간에 작은 형태로 한 번씩 왔었다.

준비 초기에 검지 결과로 로봇을 자동 출동시키던 로직이 열일곱 분 동안 실물 로봇에 임무 예순여덟 건을 보냈다. 그 뒤로 출동은 사람의 승인으로만 나가고, 자동 출동 경로가 생기면 테스트가 막는다. 전시장에서 배차 승인 버튼을 왜 사람이 눌러야 하느냐고 묻는 관람객이 있었다. 그 사고 이야기를 했다.

10월 초 로봇 플랫폼 실험실에서는 거부된 키로 2초마다 토큰을 두드려 상대 서버를 잠가 버렸다. 올바른 키를 넣어도 못 들어가는 상태를 우리가 만들었다. 401은 지금 안 된다가 아니라 이 키로는 영영 안 된다는 뜻이다. 두 번 거부되면 멈추게 했다.

같은 날 배운 것이 하나 더 있다. 키가 이미 폐기됐는데 900초짜리 토큰이 살아 있어서 멀쩡해 보였다. 연동 서버를 재기동하자 드러났다. 되는 동안에는 재기동하지 않는다.

전시 엿새 전 원격 테스트에서는 로봇 임무 화면이 실영상이 아니라 한 달 전 녹화본을 틀고 있었다. 거기서는 다 잘 나온다는 말의 정체였다.

그때 세운 원칙이 있다. 연동된 로봇은 목데이터로 메우지 않는다. 꺼진 로봇에 통신 정상이라고 적으면 관람객이 물었을 때 대답할 말이 없다.

이 원칙은 현장에서 한 번 더 시험받았다. 미니맵의 복귀 애니메이션은 시간 기준이라 도킹에 실패해도 복귀 완료로 끝났다. 로봇은 도크 앞에서 헤매는데 화면은 끝났다고 했다. 화면이 거짓말을 한 몇 안 되는 순간이었다.

#다음에는

다음 전시 체크리스트는 길지 않다.

망은 데스크톱, 맥, 로봇 플랫폼 로컬 서버, 로봇 AP를 한 스위치에 전부 유선으로 잇는다. 무선은 로봇과 AP 사이 하나뿐이고, 그 채널은 설치일에 혼잡도를 재서 고른다. 여분 랜선과 스위치를 챙긴다.

로봇 쪽은 설치 전에 접속 이름, 키, 로봇 이름, 지정 업무를 받아 둔다. 부스 도면을 미리 넘기고, 설치일에 지도와 웨이포인트를 같이 잡아 실제로 걸려 보는 시간을 반나절 잡는다. 이번에는 리허설 네 시간 안에 그것까지 하려 했다.

도크는 바닥에 테이프로 고정한다. 키오스크로 쓰는 맥은 잠자기, 화면 잠금, 자동 업데이트, 창 타일링, 핫코너를 끄고 상시 전원에 꽂는다. 이번에 명령 일곱 줄을 손으로 쳤고 철수할 때 하나를 빠뜨렸다. 스크립트 하나로 만든다.

부스 운영은 자문으로 오신 교수님 말이 맞았다. 홍보 영상은 관제 화면이 아니라 전용 TV에서 상시 돌린다. 로봇은 가만두지 않는다. 정해진 시간에 출동 시연을 하고, 관람객이 카메라 구역에 들어가 직접 이벤트를 만들게 한다. 배차 승인은 그래도 사람이 누른다. 사람이 모이는 순간에 내밀 연락처 QR을 만든다.

개발 쪽 숙제는 셋이다. 미니맵 복귀를 실제 도킹과 충전 상태로 그린다. 로봇과 마지막으로 통신한 지 몇 초인지 상황판에 적는다. 이벤트 좌표를 로봇 지도 좌표로 바꿔 좌표로 출동시킨다. 셋째는 로봇 플랫폼이 임의 좌표 이동을 지원하는지 확인한 뒤다.

해외에서 온 교수님 한 분이 물었다. 매번 사전 매핑을 해야 하느냐고, GIS로 바로 출동할 수는 없느냐고. 실외는 RTK-GPS 웨이포인트로 가능하고 실내는 아직 지도가 필요하다고 답했다.

그래도 질문의 방향이 맞다. 지도를 새로 만드는 것이 아니라 있는 지도를 겹쳐 로봇이 쓰게 하는 것. 지구본에서 현장 화면으로 들어가는 지금 구조는 그 껍데기다.

닷새 동안 화면은 거의 멈추지 않았다. 멈춘 것은 로봇이었고, 로봇이 왜 멈췄는지 화면은 말하지 못했다.

다음에는 그 한 줄을 화면이 먼저 말하게 할 것이다.