CatCity (175.♡.11.210)
2026년 6월 11일 AM 02:56
루비(Rouvy)처럼 실사 영상 기반 가상 라이딩이 가능한 인사이클리스트(Incyclist)라는 프로그램이 있습니다. 루비 같은 증강현실(AR) 요소도 없고 다른 라이더 없이 나 홀로 적막강산 라이딩만 가능한 대신, 가입-구독-결제가 없는 오픈소스 프로그램입니다. (즈위프트의 .zwo 파일을 이용한 워크아웃도 가능합니다.) 오래전 등장했지만 아직 윈도우와 맥, 리눅스에서만 가능하고, 안드로이드용 버전은 여전히 개발 중이라고만 나오네요. 구글 플레이스토어에서 확인해 보면 .gpx 파일을 이용한 스트리트뷰 라이딩을 살짝 보여주는 사전 체험판만 있습니다.
번듯한 코스 파일만 확보하면 라이딩은 느낌이 제법 나는 수준입니다.
Incyclist는 설치할 때 기본 제공되거나 추가로 다운받을 수 있는 코스가 수십 개지만, 검색해 보면 몇 테라바이트를 채울 수 있을 만큼 많은 코스 파일이 다양한 경로로 공개돼 있습니다.

(과거 탁스 TTS 시절의 가상 사이클링 환경들을 염두에 두고 상업적으로 제작됐다가 루비, 즈위프트, 탁스 데스크탑 같은 구독형 서비스가 대세가 되는 바람에 밀려나 오래전에 공개로 전환된 것들이 많아 보입니다.)
게다가 가장 중요한 점으로, 사용자의 라이딩 영상(블박 영상 포함)과 당시의 GPS 기록만 있으면 간단한 무지성 작업으로 Incyclist용 가상 라이딩 코스를 만들어서 쓸 수도 있습니다. 오픈소스의 개방성과 투명성 덕분이죠. 라이딩 영상과 GPS 로그 파일만 준비한 뒤 텍스트 몇 줄만 입력해 간단하게 .xml 파일을 만들 수 있고, 이 xml 파일을 Incyclist에 한 번 등록하면 끝납니다.
사실, 이전에는 루비 구독자가 코스를 직접 제작해 업로드할 수 있는 Rouvy Virtual Training Editor란 툴이 있었죠. 그러다가 작년에는 Rouvy Routes Creator라는 툴이 나온 덕분에 개인 영상에 루비의 근사한 AR 환경까지 입혀서 가상 라이딩을 할 수 있게 됐더군요. Rouvy 유료 구독이 필요한 것만 빼면 사실 그 이상 좋을 수가 없겠죠…ㅋ
하지만 가입과 결제가 강요되지 않는 오픈소스의 힘을 무시할 수 없죠. 돈 안 드는 Incyclist용 가상 라이딩 코스를 간단히 만들어 본 김에 방법을(해외에 이미 알려져 있던 것이긴 합니다만) 공유해 봅니다. 장마철이나 혹한기에 잠깐 써먹을 가상 코스 정도는 어렵지 않게 만들 수 있게 돼 있더군요.
<필수 준비물>
- Incyclist 프로그램 다운로드 ( https://incyclist.com/download/index.html 윈도우/맥OS/리눅스 지원)
- 라이딩 영상(H.264 코덱의 *.mp4 파일)
- 촬영 당시의 GPS 로그 파일: .fit이나 .tcx 등에서 .gpx로 변환하면 됩니다. GPS 속도계에서 데이터 크기를 줄이기 위한 스마트레코딩보다는 1초 단위의 꼼꼼한 기록을 하는 것이 좋습니다.
- GUID 생성 (코스마다 부여할 고유 ID입니다. guidgenerator.com 같은 사이트에 접속해 “Generate some GUID!” 단추만 클릭하면 값을 생성해 주니 이를 복사해서 쓰면 됩니다. 사실 수많은 다른 이용자와 공유하는 코스가 아니면 GUID까지는 필요 없고, 대충 아무 값이나 넣어도 되는 걸로 이해하고 있습니다.)
- gpstrack editor(다운로드): GPS 파일에서 영상 해당 구간을 추출하거나 남길 필요가 있을 때 굉장히 편합니다. 지도 상의 트랙을 보면서 마우스 오른쪽 클릭으로 구간이 분할됩니다.
<선택 사항: 당장 없어도 되지만 있으면 요긴한 도구들>
- 고도 보정과 평탄화(또는 산악화)를 위한 GPX Smoother 웹 https://www.potter.ca/Biking/smoother/gpxsmoother.html (GitHub에서 .zip 압축 파일을 다운받아 오프라인 브라우징 방식으로 실행하는 것도 가능합니다. https://github.com/brenzy/gpx-smoother )
GPS 데이터는 이런저런 요인으로 튈 수 있지만, 고도 정보가 튄 것을 그대로 두고 가상 라이딩 코스를 만들면 뜬금없는 급경사나 내리막 때문에 정상 페달링이 안 되는 곳이 생깁니다. 실제는 완만하거나 거의 평지인데 수십 %의 급경사로 둔갑해 페달이 헛돌거나 멈출 수 있죠.
그런 구간을 GPX Smoother로 쉽게 보정할 수 있습니다. 기본적으로는 고도값에 이동 평균을 적용해, 튀는 구간을 매끈하게 ‘다림질’ 해줍니다. 주가 차트의 5이동 평균선이나 10, 20 이동 평균선 같은 걸 생각하시면 되는데, 실제로 그런 숫자들이 GPX Smoother의 입력 권장치 범위에 속합니다.
더 나아가, 특정 구간을 선택해 최대 경사와 최소 경사 변수, 절대 고도 등을 지정하는 식으로 고도 정보를 간단히 조작해서 코스 성격을 완전 왜곡 날조 수준으로 바꿀 수도 있습니다. 사람 바글바글한 주말 한강 여의도 구간 블박 영상으로 알프뒤에즈 같은 HC급 오르막 훈련을(심각한 인지 부조화가 불가피하겠습니다만…) 할 수도 있는 것이죠…ㅋ
- ffmpeg (다운로드):
영상을 Incyclist에서 인식 가능한 H.264 코덱의 MP4 파일로 변환하거나, 영상 통합(액션캠 촬영 시에 자동 분할되는 영상들 합치기)이나 분할이 혹시 필요할 때 사용합니다. 기능은 강력하지만, 다른 쉬운 툴도 잘 나와 있고, Incyclist에 등록하는 xml 파일에서도 동기화 관련 설정이 가능하기 때문에 ffmpeg이 꼭 필요하진 않습니다.
여기까지 서론이 길어 죄송합니다. 지금부터 본 작업이고 금방 끝납니다…ㅋ
<작업 순서>
1) H.264 코덱의 MP4 영상 파일과 GPS 로그 파일(.gpx 파일)을 준비합니다. (H.264 코덱 MP4가 아닌 파일 가운데 AVI 파일은 Incyclist에 자체 변환 기능이 있지만 처리 속도가 좀 느립니다.) 여기서는 편의상 “장항습지길.mp4” 파일과 “장항습지길.gpx” 파일이라고 가정하겠습니다. (직접 만드실 때는 파일 이름만 바꾸시면 됩니다.)
2) 윈도우 메모장 같은 텍스트 편집 프로그램을 실행해 다음 내용을 전부 붙여넣습니다.
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<gpx-import>
<name>장항습지길</name>
<id>dbaf7e14-a8ff-4a40-9183-6575f0fd481a</id>
<country>KR</country>
<title>장항습지길</title>
<video-file-path>장항습지길.mp4</video-file-path>
<gpx-file-path>장항습지길.gpx</gpx-file-path>
<framerate>59.94</framerate>
<start-frame>1</start-frame>
<end-frame>35964</end-frame>
<informations>
<information distance="20" kr="테스트용 알림 메시지"/>
</informations>
</gpx-import>
l 여기서 <id> </id>에는 앞서 생성한 GUID를 붙여넣으면 됩니다.
l <framerate> </framerate>에는 라이딩 영상의 초당 프레임 수를 적습니다.
l <start-frame> </start-frame>는 가상 라이딩 코스의 GPS 데이터가 영상의 어느 부분부터 시작되는지 프레임 단위로 지정합니다. (맨 처음부터 시작하는 거면 그냥 1이면 되고, 영상 5.5초 지점부터 시작한다면 5.5초에 해당 영상의 초당 프레임수를 곱한(5.5*60) 330을 입력하는 식입니다. 싱크 조정을 대비해 영상 길이가 처음과 끝에 얼마간(길게는 십 수 초씩) 여유가 있으면 좋습니다.)
l <end-frame> </end-frame>은 라이딩 코스가 영상의 어느 지점에서 끝나는지를 프레임 단위로 지정합니다. 정확히 10분 0초짜리 가상 라이딩 코스라면 처음 시작 프레임 값에 10분*60초*60프레임 = 3600 이런 값을 더한 값이 되겠고, 아니면 영상 마지막 프레임의 숫자를 적어도 됩니다.)
l 만약 라이딩 중 영상과 주행 데이터의 싱크가 안 맞는다면(가령, 데이터는 내리막으로 바뀌었는데 영상만 아직 오르막인 경우 등) 적당한 시간만큼 start-frame의 값을 수정해서 맞출 수 있습니다. 그에 따라 end-frame 값도 수정할 수 있습니다.
l <information distance = “20” kr=”테스트용 알림 메시지”/> 이 부분은 코스의 일정 지점에서 코스 정보를 비롯한 우리말 알림 메시지를 표시하기 위한 것입니다. 출발 지점에서부터의 거리를 m(미터) 단위로 지정하고(가령 “20”) kr=” “의 따옴표 안에 메시지를 넣으면 됩니다. 필요 없으면 다 생략 가능합니다.
3) 위의 텍스트 파일을 장항습지길.mp4와 장항습지길.gpx 두 파일이 있는 폴더에 저장한 뒤 확장자를 .xml로 바꿉니다. (장항습지길.xml)
4) Incyclist 프로그램을 실행해 Routes 메뉴에서 “Import Route”가 표시된 타일을 클릭한 뒤 탐색창에서 “장항습지길.xml” 파일을 열면 새로운 코스 타일이 화면에 뜹니다.
5) “장항습지길” 코스 타일에서 OK를 클릭하고 다음 화면에서 Start를 클릭해 라이딩을 시작할 수 있습니다. 스마트트레이너가 연결돼 있지 않을 때에는 시뮬레이션 주행도 가능합니다. (User 정보의 FTP난에 지정한 임의의 값을 토대로 시뮬레이션 속도가 정해집니다.)
6) 경사가 튀거나 싱크가 안 맞는 부분은 앞서 소개한 GPX Smoother나 .xml파일을 이용해 얼마든지 사후 수정 가능합니다.
이상입니다…!
만든 코스의 시뮬레이션 라이딩 모습은 이렇습니다. (스냅사진만 간단히 올립니다.)
상업 영상처럼 GPS 데이터를 정교하게 가다듬고 영상과 싱크의 완성도를 애써 올리자면 손이 많이 가겠지만, 작업의 기본틀은 굉장히 간단합니다. 기억될 만한 좋은 곳에 라이딩을 다녀올 때 만들어 두고 가끔씩 써먹어도 좋을 것 같습니다.

가상 코스를 만들고 보니, 루비 유료 구독자가 루비 코스 영상을 다운받아 라이딩한 후 해당 영상(공교롭게도 H.264 코덱의 MP4 파일)과 라이딩 로그 파일을 이용해 Incyclist에 가상 코스로 등록할 수도 있겠다는 생각도 들었습니다. AR과 소셜 영역이 없는 한계가 있다곤 하지만 회사(그리고, 루비를 인수해 시장 장악력을 높인 즈위프트) 입장에서 뭔가 대책이 필요한 건 아닌지 모르겠습니다…ㅋ
이상 장황한 글 읽어주셔서 감사합니다.
댓글 (2)
- 수
수경아빠
06.11 · 218.♡.12.125
- C
CatCity
→ 수경아빠 작성자
06.11 · 175.♡.11.210
설명이 장황해서 그렇지, 실질적으로는 텍스트 파일에 태그 복사해 넣고 파일 이름과 시간 정보 기입하는 게 전부라서 아주 간단합니다. Incyclist 프로그램이 오픈소스를 핑계로 이래도 되나 싶을 정도입니다...ㅋ
댓글을 작성하려면 이 필요합니다.
대단하시네요