Broccoli's House

#5-(3) 로지텍 G27에서 조향 데이터 추출 본문

공부/캡스톤 디자인

#5-(3) 로지텍 G27에서 조향 데이터 추출

김콜리 2018. 3. 10. 01:58

5회차 - (3) 로지텍 G27에서 조향 데이터 추출



  • 로지텍 G27 자체 API를 통한 데이터 추출



 - 로지텍 G27은 차량 시뮬레이터나 레이싱 게임에서 사용할 수 있는 드라이빙 시뮬레이션 기어이다. 로지텍 G27과 관련된 정보는 로지텍 웹사이트(http://support.logitech.com/ko_kr/product/g27-racing-wheel)에서 찾을 수 있다. 로지텍 G27을 컴퓨터에 연결하여 사용하려면 로지텍 게임 소프트웨어를 설치해야 한다.(http://support.logitech.com/ko_kr/product/g27-racing-wheel/downloads)에서 다운로드 받을 수 있다. 로지텍 G27을 컴퓨터에 연결해 놓은 상태에서 설치를 시작하면 인스톨러가 알아서 하드웨어를 인식하여 화면에 보여준다. 게임 소프트웨어 설치가 완료되면 G27에 대한 프로파일러가 실행된다. 프로파일러에서 자체적으로 레이싱 게임이나 시뮬레이터에 G27을 연결해주거나(지원되는 프로그램의 경우에만), 버튼의 기능 등을 변경할 수 있다.




 - 로지텍 개발자 랩(https://www.logitechg.com/ko-kr/developers)에서는 G27과 같은 스티어링 휠에 대한 소프트웨어 개발 키트, SDK(Software Development Kit)를 제공한다. 개발 키트를 다운받아서 압축을 풀고 [Demo] 폴더에 들어가면 [SteeringWheelSDKDemo]라는 응용 프로그램을 볼 수 있다. G27이 연결되어 있는 상태에서 이 프로그램을 실행하고 아래의 Init을 누르면 G27의 정보를 받아오는 것을 볼 수 있다. 


 - SDK에서 스티어링 휠의 경우 반시계 방향 최대 -32767, 시계 방향 최대 +32767의 값 변화를 볼 수 있다. 특이한 점은, 실제 G27 스티어링 휠은 -450도부터 450도까지 조향 가능하지만, SDK에서 측정할 수 있는 범위는 대략 -100도에서 100도까지 밖에 되지 않는다는 점이다. 시뮬레이터 운전에서 SDK 측정 범위를 벗어나는 조향은 그다지 필요치 않으므로 큰 상관은 없다.


LogitechGamingSteeringWheelSDK.pdf


 - 스티어링 휠 SDK는 C/C++ 기반의 API를 제공한다. 위의 PDF 문서에서 C로 이루어진 스티어링 휠 관련 함수의 이름과 사용법, 관련 정보들을 찾을 수 있다. C/C++ 기반의 API를 제공하는 것은 좋으나 문제는, 우리는 C언어 기반이 아닌 파이썬을 기반으로 하여 프로그래밍을 하기 때문에 이 API를 사용하기 위해서는 추가적인 작업을 해주어야 한다는 것이다. C - Python Wrapper를 통하여 C언어로 이루어진 헤더 파일과 라이브러리 파일들을 파이썬에서 불러올 수 있다. 이 방법은 나중에 스티어링 휠에 명령을 내릴 때 필요하기 때문에 무조건 랩핑(Wrapping) 작업을 해야하지만, 꽤나 귀찮은 방법이며 다른 간편한 방법이 존재하기 때문에 추후로 미루도록 한다. 




  • 파이썬 라이브러리를 통한 데이터 추출

 - 앞서 말한 C언어 기반 API를 Wrapper를 통해 파이썬으로 읽어들이는 대신, 파이썬의 라이브러리를 활용하여 조향 데이터를 추출한다. 이 방식에는 파이썬의 게임 제작 관련 라이브러리인 Pygame을 사용한다. 이 라이브러리를 사용하면 Wrapper를 작성하는 까다롭고 귀찮은 일을 피할 수 있으며, 그보다 훨씬 간단하게 로지텍 G27을 인식하여 데이터를 추출할 수 있다.

 - Pygame은 파이썬의 게임 제작 관련 라이브러리로써, 우리는 여기에서 joystick 모듈의 항목에 대한 함수만을 사용한다. Pygame 라이브러리 전체에 대한 내용은 공식 홈페이지(https://www.pygame.org/)에서 확인할 수 있으며, 라이브러리에서 제공하는 전체 함수에 대해서는 (https://www.pygame.org/docs/)에서 확인할 수 있다.

 - 처음에 Pygame의 joystick 모듈을 초기화해준다. joystick 모듈의 Joystick() 함수는 컴퓨터와 연결된 게임 컨트롤러를 불러온다. 게임 컨트롤러가 하나만 연결되어 있으면 상관없지만, 여러 개 연결되어 있는 경우 모듈의 get_count() 함수를 통해 전체 컨트롤러를 받아올 수도 있다. 이것과 관련된 예제 코드는 Pygame 문서에서 확인할 수 있다. 그리고 불러운 컨트롤러를 init() 함수를 통해 초기화해준다. get_name() 함수를 사용하면 불러온 컨트롤러의 이름을 확인할 수 있다. 또한 get_numaxes() 함수를 통해 컨트롤러가 가지고 있는 축의 개수를 확인할 수 있다. G27의 축의 개수는 총 5개로 출력된다. 첫 번째 인덱스의 축이 조향을 담당하는 축이다. 

 - 스티어링 휠이 돌아가거나 엑셀 페달이 밟히는 등의 이벤트 처리를 위해서는 event 모듈의 pump() 함수를 반드시 선언해주어야 한다. 그렇지 않으면 이벤트가 발생하더라도 데이터를 읽어오지 않는다. get_axis() 함수를 사용하여 조향 데이터를 읽어온다. -1부터 1까지의 float 타입의 숫자를 반환하며, 이것 또한 SDK와 마찬가지로 -100도에서부터 100도 각도까지만 값을 제공한다. 따라서 100을 곱해주어 각도로 환산해준다.

 - 읽어들인 조향 데이터를 로깅(Logging)하기 위하여 반복문 바깥에 텍스트 파일을 쓰기 형태로 열어준다. 그리고 조향 각도를 읽어들인 다음, 그것을 텍스트 파일에 써준다. 하나의 데이터를 텍스트에 쓰고 나면 구분을 위해 꼭 줄바꿈(\n)을 해주어야 한다.


import pygame

pygame.joystick.init() # jostick 모듈 초기화
pad = pygame.joystick.Joystick(0) # G27 데이터를 불러와 변수에 저장
pad.init() # G27 데이터 초기화

print(pad.get_name()) # >> 게임 컨트롤러의 이름, Logitech G27
print(pad.get_numaxes()) # >> 축의 개수, 5

file = open('data.txt','w')
# 조향 데이터를 로깅하기 위해 텍스트 파일을 쓰기 모드로 열기

while(True): # 반복

pygame.event.pump() # 라이브러리 내부 이벤트 발생 처리기
angle=pad.get_axis(0)*100 # 스티어링 휠의 축으로부터 값을 받아와 각도로 전환
file.write(str(angle)) # 텍스트 파일에 각도 기록
file.write('\n') # 텍스트 파일 줄 바꿈
print("조향각 : ", angle) # 조향각 출력

file.close() # 파일 닫기





Comments