날씨 시스템 구현을 마치고 통합 테스트를 돌렸을 때 두 가지 문제가 동시에 보임

속도가 비가 오든 눈이 오든 똑같다
눈 올 때 주행이 불안정하다

 

 

일단 속도를 날씨에 맞춰 줄이는 코드가 필요함

가능한 원인을 세 갈래로 나눠봤다

마찰값 자체가 안 바뀐다           → 데이터 설정 문제
마찰은 바뀌는데 속도로 안 이어진다  → 로직 연결 문제
날씨 변경 함수가 호출조차 안 된다   → 델리게이트 문제

 

로그 찍어봄!

 

 

날씨 변경 함수는 정확히 호출되고 있고 마찰 배율도 정확히 읽고 있음

 

원인은 B로 확정

마찰은 정확히 낮아지는데 그 값이 속도 판단으로 이어지지 않고 있음

물리 층: 도로 표면 마찰. 차가 실제로 미끄러지는 정도 (도로 PhysicsMaterial)
판단 층: 자율주행이 "이 곡선에서 안전한 속도는 얼마인가"를 계산할 때 쓰는 값
        (LateralFriction)

 

물리 층은 잘 작동했지만 판단 층이 그 미끄러움을 인식해 속도를 줄이는 부분이 작동하지 않음

차는 도로가 빙판인 줄도 모르는 것

 

곡선 안전속도 함수 확인

float ComputeCurveSpeedLimit(float Curvature) const
{
    if (Curvature <= KINDA_SMALL_NUMBER) return MaxSpeed;
    const float Radius = CurvatureSampleSpan / Curvature;
    return FMath::Clamp(
        FMath::Sqrt(LateralFriction * 980.f * Radius),
        MinSpeed, MaxSpeed);
}

 

함수는 LateralFriction을 정확히 쓰고 있음

그 추락하는 코너가 직선으로 측정되고 있는 게 아닐까 싶어서 로그 찍어봄

 

 

곡률은 정확히 측정되고 있고 SpeedLimit도 정확히 낮아짐

대신 원인발견

SpeedLimit은 떨어지는데 Smoothed(실제 명령 속도)는 그에 비해 엄청 낮게 떨어짐 

 

즉 속도 줄여야 한다고 판단은 했는데 전달되는 속도가 느렸던 것

 

-> 핵심 원인은 DecelRate(감속 보간 속도)가 날씨와 무관하게 0.5 고정이라는 점이었음

이미 날씨를 아는 ApplyWeatherProfile에서 마찰과 함께 DecelRate도 조정하도록 함

const float DecelBoost = FMath::Clamp(1.f / (FrictionScale * FrictionScale), 1.f, 12.f);
DecelRate = BaselineDecelRate * DecelBoost;

 

베이스라인 캐싱을 지키려고 원본 DecelRate를 한 번만 백업하고 항상 그 원본에 배율을 곱하는 방식으로 함

(안그러면 날씨를 여러 번 바꿀 때 누적 오염)

 

문제 발생

과잉 교정됨

감속을 11배로 키우니 추락은 줄었는데 속도가 80에서 30으로 뚝 떨어지는 급감속이 생김

 

 

현실 기준을 바라봄

현재 : 타이어-노면 마찰계수는 마른 아스팔트 0.7

처음 눈길 도로 마찰을 0.15로 뒀던 건 눈길이 아니라 거의 빙판

-> 팀과 논의해 눈길 마찰을 0.25로 조정함

 

속도도 다시 잡음

원래 100키로 넘게 주행을 했었는데 생각해보니까 코스가 곡선 많은 일반 도로였고 고속도로가 아님

Clear: 시속 ~80 (2200 cm/s)
Rain:  시속 ~60 (1700 cm/s)
Snow:  시속 ~50 (1400 cm/s)

 

곡선 안전속도 공식이 뱉는 값(600~1000)과 MaxSpeed 상한이 모순되지 않는지 확인

MaxSpeed는 직선용 상한, 공식은 곡선용.

 

시뮬레이터의 숫자는 현실에서 말이 되는가, 다른 값들과 일관적인가 두 질문에 답할 수 있어야 함

 

또 문제 발생

커브 진입 시 속도가 여전히 널뜀

속도 감속 타이밍은 BrakePreviewDist

BrakePreviewDist를 날씨별로 키움(눈길 110m)

 

또 새 문제가 터짐 ㅜ

전방주시거리를 110m로 키우니 특정 한 구간에서만 이상한 현상이 발생

코너 들어가기 전에 속도가 확 줄었다가, 막상 코너 안에서 속도가 다시 증가

가장 느려야 할 코너 안에서 다시 빨라짐

 

처음엔 "곡률 측정 샘플링이 그 구간을 못 잡는다"고 추정해 CurvatureSampleSpan을 50에서 300, 500, 800으로 키워봄

변화가 없음.... 

 

도로 끝을 넘어서 곡률 계산이 깨진다? 로그 찍어봄

 

도로 전체 311652 중 차는 145,100 / 110m 앞도 한참 도로 안쪽

이것도 아님

코너 진입 전 (속도 감소): CurvHere=0.00011  CurvAhead=0.01675  SpeedLimit=838
코너 안     (속도 증가):  CurvHere=0.00046  CurvAhead=0.00337  SpeedLimit=1400

코너 진입 전엔 현재 직선, 110m 앞 강한 곡선 → 미리 감속(정상)

코너 안에선 현재도 앞도 거의 직선으로 측정 → 둘 다 직선이라 판단해 속도를 최대로 풀어버림

그 구간 도로를 에디터에서 위에서 내려다봄

 

-> 부드러운 곡선이 아니라 긴 직선 두 개가 한 점에서 각지게 꺾이는 형태

커브 전 감속하려고 전방주시를 길게(110m) 했더니,
정작 짧고 급한 그 커브 안에서는 그 긴 시선이 커브를 이미 지나쳐
"앞은 직선"이라고 판단해 가속한다.

 

문제의 본질은 모순된 두 요구

커브 전에는 멀리 봐야 한다  (미리 감속하려고)
커브 안에서는 가까이 봐야 한다 (이 커브를 놓치지 않으려고)

 

하나의 고정된 전방주시거리로는 둘 다 만족할 수 없음

단순 버그가 아니라 설계 자체의 한계.....

-> 한 점만 보는 방식을 버리는 방식으로 다시 작성

float MaxAheadCurv = 0.f;
for (float Scan = 0.f; Scan <= BrakePreviewDist; Scan += CurvatureScanStep)
{
    MaxAheadCurv = FMath::Max(MaxAheadCurv, EstimateCurvature(Scan));
}
OutCurvAhead = MaxAheadCurv;

 

현재부터 110m 사이를 여러 점으로 나눠 보고 그중 가장 위험한(곡률 최대) 지점을 채택

(이때 검증된 EstimateCurvature 함수 자체는 건드리지 않음 잘 작동하는 부품은 그대로 두고 그걸 쓰는 방법만 바꾼셈 )

 

또 부작용 발생..

커브가 범위에 들어오는 순간 곡률이 0→큰값으로 점프해 속도가 계단처럼 떨어짐

-> 거리 가중을 추가

const float Weight = FMath::Pow(1.f - DistRatio, CurvaturePreviewFalloff);
MaxWeightedCurv = FMath::Max(MaxWeightedCurv, Curv * Weight);

 

먼 커브는 약하게 가까운 커브는 강하게

 

또 다른 문제 발견

눈길에서 건물에 박음

 

→ EndApproachDistance가 날씨 무관 고정되어있어서 그럼

마찰력이 적은 눈길에선 좀 더 일찍 보고 속도를 줄이도록 수정

 

그러니 또 문제 발생

 

눈길 커브에서 시속 14로 기어감 → 마찬가지. MinSpeed가 날씨 무관 고정되어있었음

마찰·감속·최고속도·전방주시는 다 날씨 연동했는데 이 둘을 빠뜨림

원래 눈길이면 최저속도가 더 낮아야 하는 것 아닌가?라고 생각했지만 MinSpeed는 "이 속도로 달려라"가 아니라 "이보다 느려지면 위험하니 최소한 이만큼은 가라"는 하한선

눈길은 안전속도 공식이 워낙 낮게 나옴 (시속 14)

그래서 눈길일수록 하한을 오히려 올려야 기어가는 걸 막을 수 있음

-> 맞춰서 수정함

 

알게된 것

 

시스템은 연쇄한다

감속 느림 → 감속 11배 → 급브레이크
         → 최고속도 제한 → 현실성/일관성 검증
         → 전방주시 확장 → 단일지점 한계 → 구간 스캔

 

한 번에 하나씩 매번 검증하고 넘어가는 규율이 필요함

모든 숫자는 근거가 있어야 한다

기존값이니까는 근거가 아님

현실을 구현하는 거니까 현실에서 말이 되는가, 다른 값들과 일관적인가 이 두 질문을 생각해야 함

+ Recent posts