로그 #1: 기본 제어 모델 구축
요약
IBM Granite-3.2-8B 모델을 활용하여 TORCS 시뮬레이터용 자율 주행 레이싱 에이전트를 구축하는 개발 로그입니다. PD 조향, 적응형 제동, 동적 스로틀 및 스마트 변속 로직을 구현하는 과정을 상세히 기록하고 있습니다.
핵심 포인트
- IBM Granite-3.2-8B 모델을 활용한 AI 보조 개발 과정 기록
- PD 제어기를 이용한 정교한 조향 및 안정적인 코너링 구현
- 트랙 특성에 맞춘 적응형 제동 및 동적 스로틀 로직 적용
- 시뮬레이션 환경에서의 에이전트 제어 시스템 최적화
참고: 이 포스트는 자율 주행 레이싱 에이전트(autonomous racing agent)를 구축하기 위해 로컬 LLM (IBM Granite-3.2-8B)과 사용한 정확한 프롬프트(prompts)와 응답(responses)을 저장하는 가공되지 않은 개발 로그입니다. 이는 개인적인 아카이브이자 AI 보조 개발 과정(AI-assisted development process)을 투명하게 보여주는 역할을 합니다.
개발 로그: 자율 주행 TORCS 레이싱 에이전트
사용 모델: ibm-granite-3.2-8b-instruct
이 로그는 이 프로젝트를 위해 IBM Granite 모델에서 사용된 모든 프롬프트와 답변을 기록합니다.
1. 초기 모델 생성
목표: Corkscrew 트랙을 위한 견고하고 모듈화된 제어 시스템(control system) 구축.
프롬프트
@snakeoil3_jm2.py @torcs_jm_par.py 자율 주행 차량 제어 및 TORCS 시뮬레이터 아키텍처(architecture) 전문가로서 행동하십시오. 저는 Corkscrew 트랙을 위한 고성능 에이전트를 개발하고 있습니다.
제공된 snakeoil3_jm2.py (센서/액션 인터페이스용)와 torcs_jm_par.py (현재 제어 로직)를 분석하십시오.
...
응답
PD 조향(PD Steering), 적응형 제동 로직(Adaptive Braking Logic), 동적 스로틀(Dynamic Throttle), 스마트 변속(Smart Shifting)을 통합한 torcs_jm_par.py용 수정된 drive() 함수입니다:
#================= 메인 드라이브 함수 =================
def drive(c):
S, R = c.S.d, c.R.d
...
수식 설명:
수식 설명:
- PD 조향 (PD Steering): 조향 제어에는 비례-미분 (Proportional-Derivative) 제어기를 사용합니다.
steer_kp는 각도에 따라 자동차가 얼마나 공격적으로 회전할지를 결정합니다. 값이 높을수록 조향이 더 민감해집니다. 미분 항 (steer_kd)은 트랙의 중심선으로부터의 거리에 비례하는 보정값을 적용하여 자동차를 중앙으로 정렬하는 데 사용됩니다. - 적응형 제동 로직 (Adaptive Braking Logic):
S['angle']의 절대값이brake_threshold를 초과하는지 확인하여, 급격한 코너에서 언제 브레이크를 밟을지 결정합니다. 이는 안정성을 유지하고 급격한 회전 구간에서 스핀 아웃 (spinning out)되는 것을 방지하며, 특히 Corkscrew와 같은 고속 트랙에서 중요합니다. - 동적 스로틀 (Dynamic Throttle): 자동차가 최적 속도(target_speed에서 조향 페널티를 뺀 값으로 정의됨)에서 멀리 떨어져 있을 때 가속 (
R['accel'])을 높입니다. 이는 직선 구간에서의 고속 주행을 유도하는 동시에, 조향 각도가 커짐에 따라 가속을 줄여 더 부드러운 코너링을 촉진합니다. - 스마트 변속 (Smart Shifting): 기어 변속 로직은 이제 트랙의 x축을 따른 현재 속도인
S['speedX']를 참조합니다. 더 높은 RPM 회복을 허용하도록 변속 지점 (gear_speeds)을 조정했으며, 이는 레이싱 환경에서 흔히 볼 수 있는 긴 직선 구간과 고속 코너가 있는 트랙에서 유리합니다.
이 수정된 drive() 함수는 TORCS 시뮬레이터의 요구 사항과 경쟁적인 레이싱 시나리오의 특성을 고려하여, 고성능 자율 주행에 적합한 더욱 정교한 제어 전략을 제공합니다.
2. 진동 및 반응형 제동 수정
목표: 직선 구간에서의 지그재그 주행을 제거하고, 코너에서의 조기 충돌 문제를 해결합니다.
Prompt
현재의 drive(c) 함수에는 두 가지 주요 문제가 있습니다:
- 직선 구간에서 차량이 과도하게 진동(지그재그 주행)합니다. 이는 비례 제어 이득(Proportional steering gain)인
steer_kp = 30이 너무 공격적이거나, 댐핑 항(Damping term)이 필요함을 시사합니다. 반응성을 유지하면서 직선 구간에서 더 안정적으로 작동하도록 PD 제어기(PD controller)를 조정해 주세요. - 제동 시스템이 너무 사후 반응적(angle > 0.9일 때만 제동)이기 때문에 첫 번째 코너에서 충돌이 발생합니다. 예측 제동 로직(Predictive braking logic)을 구현해 주세요. 만약 'track' 센서가 전방 거리의 급격한 감소(회전 암시)를 나타내면, 안정적인 속도로 코너에 진입할 수 있도록 더 일찍 부분 제동을 적용해야 합니다.
...
Response
두 가지 문제를 모두 해결한 수정된 drive() 함수는 다음과 같습니다:
#================= MAIN DRIVE FUNCTION =================
def drive(c):
S, R = c.S.d, c.R.d
...
변경 사항 및 설명:
- 댐핑을 적용한 PD 조향 튜닝 (Tuned PD Steering with Damping): 직선 구간의 지그재그 주행 문제를 해결하기 위해
steer_kp를 30에서 15로 줄여 조향 제어의 공격성을 완화했습니다. 더 부드러운 중앙 정렬을 위해 미분 항(steer_kd)을 더 낮은 값(0.15)으로 조정했습니다. 또한, 조향각의 큰 변화를 억제하여 진동을 상쇄하고 안정성을 높이기 위해 댐핑 항(Damping term)-0.05 * S['steer']를 추가했습니다. - 예측 제동 로직 (Predictive Braking Logic): 이제 제동 시스템이 트랙 센서를 통해 전방 거리의 유의미한 감소(다가오는 회전 표시)를 확인합니다. 해당 조건(
track_sensors[-1] - track_sensors[0] < -20)이 충족되면 부분 제동이 적용됩니다. 이를 통해 급격한 회전 전에 속도를 줄임으로써 더 부드러운 코너 진입이 가능해지며, 안정성을 높이고 충돌을 방지합니다.
이러한 수정 사항은 직선 구간(진동 감소)과 급커브(안전한 진입을 위한 조기 제동 적용) 모두에서 에이전트의 성능을 향상시키는 것을 목표로 합니다. 조정된 값들은 Corkscrew와 같은 고속 트랙에서 매우 중요한 반응성과 안정성 사이의 균형을 맞춥니다.
3. 예측 "룩어헤드(Look-Ahead)" 제동 구현
목표: 단순히 조향각 (Steering Angle)에 의존하는 것이 아니라, 트랙 기하학 (Track Geometry)을 기반으로 코너를 예측합니다.
프롬프트 (Prompt)
현재의 drive(c) 함수는 직선 구간에서의 지그재그 진동 (Zig-zag oscillations)을 성공적으로 제거하였으며, 조향 제어 (Steering Control) 또한 안정적입니다. 하지만 차량이 너무 높은 속도로 진입하기 때문에 여전히 첫 번째 코너 입구에서 충돌이 발생합니다.
현재의 제동 로직은 트랙 기하학을 예측하기보다는 조향각 임계값 (Steering Angle Thresholds)에 의존하는 지나치게 반응적인 (Reactive) 방식입니다. 차량이 에이펙스 (Apex)에 도달하기 전에 코너를 예측할 수 있도록, S['track'] 센서 어레이 (Sensor Array)를 분석하여 예측적인 '룩어헤드 (Look-ahead)' 제동 전략을 구현해 주세요.
...
응답 (Response)
트랙 센서 데이터를 분석하여 예측 제동 전략을 구현한 수정된 drive() 함수는 다음과 같습니다:
#================= 메인 주행 함수 (MAIN DRIVE FUNCTION) =================
def drive(c):
S, R = c.S.d, c.R.d
...
수학적 로직 설명:
- 룩어헤드 센서 선택 (Look-Ahead Sensor Selection): 이 함수는
S['track']의 마지막 5개 요소(lookahead_sensors)를 사용하여 다가올 트랙 기하학의 변화를 예측합니다. 이 센서들은 차량의 현재 및 미래 궤적 근처의 위치를 나타내도록 선택되었으며, 미래 위치에 대한 정밀한 예측 없이도 전방에 무엇이 있는지 확인할 수 있는 창 (Window) 역할을 합니다. - 급커브 감지 (Sharp Turn Detection): 코드는 룩어헤드 센서 어레이 내에서 트랙 거리의 유의미한 감소(
lookahead_sensors[i] - lookahead_sensors[i-1] < max_distance_change)를 확인하여, 급커브가 임박했음을 나타냅니다. - 제동 압력 스케일링 (Scaling Braking Pressure): 잠재적인 급커브가 감지되면, 커브의 급격한 정도(
distance_reduction)에 따라R['brake']값이 설정됩니다. 이러한 스케일링은 코너에 접근함에 따라 점진적인 제동이 적용되도록 보장하며, 충돌 없이 가능한 최대 진입 속도를 유지할 수 있게 합니다. 0.6이라는 값은 전체 제동력을 점진적인 감속에 적합한 중간 수준으로 스케일 다운 (Scale down)합니다.
이 예측 로직 (Predictive logic)은 트랙 센서 데이터를 선제적으로 사용하여 속도를 관리하며, 급커브에 도달하기 전에 제어된 감속 (Deceleration)을 시작함으로써 충돌을 방지합니다. 이를 통해 안전과 제어력을 유지하면서도 더 높은 진입 속도를 허용할 수 있습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기