디버그로 그린 선에 차가 부딪혔습니다
2020년에 42dot에서 자율주행 센서 검증용 시뮬레이터를 만들고 있었습니다. UE4 위에 CARLA를 얹어서 LiDAR와 레이더, 카메라를 붙이고 벤치마크를 돌리는 일이었어요.
그때 CARLA 본체에 보낸 PR이 하나 있습니다. 바뀐 줄은 딱 한 줄인데, 원인을 찾는 과정이 기억에 남아서 적어둡니다.
1. 차가 아무것도 없는 곳에서 튕겼습니다
파이썬 API의 world.debug.draw_line으로 차량 경로랑 센서 범위를 그려놓고 시나리오를 돌렸습니다. 눈으로 보면서 확인하려고 켠 거예요.
그런데 차가 이상하게 굴었습니다. 아무것도 없어야 할 자리에서 튕기고, 궤적이 미묘하게 틀어졌습니다.
디버그 그리기를 끄면 멀쩡했습니다.
2. 그린 선에 물리가 붙어 있었습니다
UE4는 디버그 셰이프를 PersistentLineBatcher라는 컴포넌트에 모아서 그립니다. 이름 그대로 선을 배치로 묶어 한 번에 그리는 컴포넌트예요.
문제는 이게 그냥 프리미티브 컴포넌트라 충돌이 기본으로 켜져 있다는 겁니다. 선을 그리면 물리 씬에 형상이 같이 올라가고, 차량이 거기에 부딪힙니다.
화면에 그린 것뿐이라고 생각했는데 실제로는 시뮬레이션 세계에 물체를 하나 놓고 있었던 셈입니다.
3. 고친 건 한 줄입니다
디버그 셰이프를 그리는 FShapeVisitor 생성자에서 배처의 충돌을 꺼줬습니다.
World->PersistentLineBatcher->SetCollisionEnabled(ECollisionEnabled::NoCollision);
Windows 10과 Ubuntu 16.04, Python 3.7.7, UE 4.24에서 확인했고 2020년 6월에 머지됐습니다.
한 줄이지만 이게 안 고쳐졌으면 디버그 시각화를 켜고 잰 숫자는 전부 다시 봐야 했을 겁니다. 시뮬레이터에서 제일 곤란한 종류의 버그가 이런 거라고 생각해요. 결과가 틀리는 게 아니라, 보려고 켠 것 때문에 결과가 바뀌는 것. 틀린 값은 언젠가 눈에 띄지만 이건 켜놓고 재는 동안 계속 그럴듯한 숫자가 나옵니다.
4. 봇이 CHANGELOG를 요구했습니다
PR을 열자마자 봇이 CHANGELOG를 갱신해달라고 코멘트를 남겼습니다. 그래서 한 줄 추가하고 다시 올렸어요.
처음엔 형식적인 절차라고 생각했는데, 지금 보면 이게 꽤 합리적입니다. 코드 한 줄짜리 수정은 리뷰어가 “그래서 이게 사용자에게 뭐가 달라지는데”를 diff에서 읽어내기 어렵거든요. CHANGELOG 한 줄이 그걸 대신 설명해줍니다.
💡 팁 / 주의할 점
- 팁: 시뮬레이션이나 벤치마크에서 이상한 결과가 나오면 관측을 위해 켜둔 것부터 꺼보세요. 디버그 드로잉, 로깅, 프로파일러, 녹화가 대상을 건드리는 경우가 생각보다 흔합니다.
- 주의할 점: 엔진에서 화면에 뭔가를 그리는 컴포넌트는 대부분 프리미티브 컴포넌트입니다. 그린다는 건 씬에 올린다는 뜻이고, 충돌이나 오버랩, 컬링 같은 게 기본값으로 따라옵니다.
정리
기여 규모로 보면 4줄짜리 PR이고, 그중 절반은 CHANGELOG입니다.
그래도 오픈소스에 보낼 만한 수정이었던 건, 저만 겪은 문제가 아니었기 때문이에요. 디버그 드로잉은 시뮬레이터를 쓰는 사람이면 거의 다 켜는 기능이고, 증상은 “차가 이상하게 움직인다”로만 나타납니다. 원인을 여기까지 따라오기가 쉽지 않아요.
사내 코드에 우회를 하나 넣고 넘어갈 수도 있었는데, 위쪽에 올린 게 맞았다고 생각합니다.
태그: #오픈소스, #CARLA, #UnrealEngine, #자율주행, #시뮬레이션, #UE4, #C++, #디버깅, #물리엔진, #센서