Skip to main
Codemasters F1 2021 시각화 프로젝트
- 프로젝트 레포지토리
- Codemasters F1 2021는 현재 플레이중인 게임의 데이터를 UDP로 전송하는 기능이 있다.
- 이 데이터는 현재 게임의
시간
, 몇바퀴 돌았는지
, 내가 어떤 플레이어인지
와 같은 게임적인 데이터부터, 차의 현재 위치
, 차의 가속도
, 핸들의 각도
와 같은 Telemetry와 같은 데이터도 전송해준다.
- Telemetry의 경우, 실제 F1에서 가져올 수 있는것과 유사한 수준의 데이터만 전송한다.
- 예를들어
네 바퀴의 회전 속도
는 전달하지만, 게임에서 계산한 각 바퀴의 마찰력
은 전달하지 않는다.
- 이는 실제 세계에서는 얻을 수 없는 정보이기 때문에 사실성을 높이기 위함으로 보인다.
- 예를들어 게임에서 차가 견딜 수 있는것보다 빠른 속도로 코너를 돌면 차가 스핀한다.
- 그렇기에 각 바퀴의 마찰력은 계산되고 게임에서 사용되고 있을 것이다.
- 따라서 단순히 기록계가 아닌 좀 더 사용하기 좋은 데이터는 “게임에서 제공하는 1차적인 정보"를 조합해서 얻어야 한다.
- 게임을 하면서 가끔씩
아 이번 코너는 정말 최적으로 돌았다
라던지, 아 이게 아닌데!
하면서 스핀하는 경우가 있다.
- 그러나 게임 자체가 너무 긴박하게 흘러가다보니, 정확히 “왜 이번 코너에서 돌았는지"를 학습하기 어려웠다.
- 따라서 “실제 F1에서 보는것 처럼 Telemetry를 시각화"하는 것을 통해서 실력을 빠른 시간내에 키울 수 있지 않을까 생각했다.
- 프로젝트는 총 2가지 시스템으로 구성되어 있다.
- 첫번째는 UDP서버로 게임에서 전송한 데이터를 받고, 나중에 가공하기 쉬운 형식으로 저장한다.
- 두번째는 시각화 내지는 계산 시스템으로, 저장해둔 데이터를 사용해 원하는 데이터를 가져오는 시스템이다.
- UDP 서버
- 게임에서 전달하는 정보는 json과 같은 데이터가 아닌 인코딩된 정보가 전달된다.
- 스펙에 따라
몇비트가 특정 값이면 특정 데이터 형식으로 디코딩
하는 과정이 필요하다
- UDP서버는 전달받은 데이터를 알맞은 디코딩 고루틴으로 보내 디코딩하고, 사용하기 쉽게 jsonl 파일로 저장한다.
- 시각화 시스템
- 시각화 시스템은 저장된 파일을 불러와 해당 차의 그래프를 그린다.
- 차의 그래프는 실제로 사용된 F1의 그래프와 비슷하게 그렸다
- 속도, 가속도, 핸들 회전 각도, 악셀, 브레이크
- 코너에서 차가 스핀한 대부분의 경우,
핸들을 너무 강하게 틀었거나, 브레이크를 너무 늦게 밟았거나, 악셀을 너무 일찍 혹은 너무 강하게 밟았기 때문
에 이정도로도 괜찮은 학습이 이루어졌다.
- 한 랩당 한 개의 그래프를 그리며, 두개 이상의 랩을 겹쳐서 랜더링 할 수 있다.
- 이렇게 해서, “코너를 도는데 성공한 랩"과 “실패한 랩"의 차이를 분석하기 쉽다.
- 결과만 놓고 본다면 나쁘지 않았다.
- “그닥 어려운것도 아닌데 왜 그렇게 브레이킹 포인트를 못잡겠던” 레드불링 1번 코너를 옆 차와 싸우면서도 잘 돌게 되었다.
- 아쉬운점은 물론 있다.
- 타이어의 접지력을 계산했으면 좋았겠으나 지식의 한계로 인해서 정확한 계산이 불가능했다.
- 도저히… 공식을 이해할 수가 없었다…
- 몇가지 차의 측정값이 필요 했으나, 게임의 한계로 이 수치들에 대한 “확신"이 없었다.
- 타이어의 너비가 과연 F1차와 동일하게 되어 있는가?
- 연료의 무게는 보여주었지만, 차의 무게는 데이터에 포함되어있지 않았다…
- 비교 데이터가 너무 빈약했다
- 나보다 잘한 선수의 데이터가 있으면 비교해볼 수 있었겠지만, AI 선수들의 데이터는 무조건 직각으로 꺾여있었다.
- 즉 최적 타이밍에 순간적으로 100으로 브레이크를 밟는다던지, 핸들의 회전 각도도 30도에서 45도로 올라가고… 비교하기엔 엉망진창이었다
- 멀티에서 데이터를 뽑을 생각도 했지만, 이 데이터는 이 빠진 구석이 너무 많았다
- 네트워크 딜레이로 인해서 일부 데이터가 빠진 것 같다.
- 직접 보간하고 다시 분석하려니, 데이터의 정확도를 신뢰하기 어려웠다
- 드라이빙 스킬 이외의 것을 분석하지 못했다.
- 전체적인 레이싱의 흐름이라던지, 선수간 페이스의 차이라던지 분석해보고 싶었다.
- 하지만 “게임을 하면서 느낄 수 있는 정보"여서, 큰 모티베이션이 되지 못했다
- 어디까지나 “내가 사용하는것"이 목적이다보니 코드적으로 아쉬운 점도 많았다
- 초당 60번씩 나오는 데이터에 jsonl 파일을 사용하니 용량이 너무 커졌다.
- 시각화 시스템을 개선해서, 필요한 계산식을 구현하기 쉽게 만들면 어떨까 하는 아쉬움이 있다.
- 아마 나중에 F1 2023을 플레이 할 때, 아쉬운 점들을 다시 해보지 않을까 싶다
- 각 타이어의 접지력은 꼭 구해보고 싶다
- 실시간으로 선수의 페이스를 분석해서, “네가 이대로 가다간 추월당한다"와 같은 알람을 주면 재밌을 것 같다.
- 혹은 “이번 랩에 피트인 해야 추월할 수 있다"와 같은 정보라던지
- 그래도 재밌었다.
블로그,
게임,
개발,
Published