1. 2022 개정 교육과정 교과 연계 분석
- 물리학 (마찰력, 돌림힘 토크 및 강체 회전 운동역학): 정지/운동 마찰력, 휠 회전 속도 $r\omega$와 로버 차체 실제 전진 속도 $v$ 간의 슬립률 $s = \frac{r\omega - v}{r\omega}$, 구름 저항 토크와 견인 구동력의 모멘트 평형.
- 지구과학/행성과학 (화성 토양 지질학 및 레골리스 역학): 현무암 풍화 미세 모래의 토양 특성(응집력 $c$, 내부 마찰각 $\phi$, 다짐 계수), 화성 중력($0.38g$) 환경에서의 연약 지반 침하 및 전단 유동화 거동.
- 수학 (베커 압력-침하 적분 및 비선형 접촉호 각도 수치해석): 베커 방정식 $\sigma(\theta) = \left(\frac{k_c}{b} + k_\phi\right) z(\theta)^n$ 휠 접촉면 1차원 수치 적분 및 쟈넬라키스(Janosi-Hanamoto) 전단 응력 대수식 연산.
- 정보 (초저지연 1,000Hz 0-Alloc 6륜 독립 구동 트랙션 컨트롤러 코어): 1ms 루프 내에서 가비지 컬렉터 부하 없이 스택 메모리(`ref struct`)로 모터 역기전력과 IMU 관성 센서를 융합하여 휠 헛돎을 조기 차단하는 C# 엔진.
2. 베커 테라메카닉스 및 토양 전단 수식 모델
폭 $b$, 반경 $r$의 로버 휠 접촉각 $\theta$에서의 침하 깊이 $z(\theta) = r(\cos\theta - \cos\theta_1)$에 따른 수직 수직응력 $\sigma(\theta)$는 베커(Bekker) 공식에 의해 다음과 같이 모델링됩니다:
$$\sigma(\theta) = \left( \frac{k_c}{b} + k_\phi \right) \left[ r (\cos\theta - \cos\theta_1) \right]^n$$여기서 $k_c$는 응집력 침하 계수, $k_\phi$는 마찰 침하 계수, $n$은 토양 변형 지수, $\theta_1$은 전방 진입각입니다. 접선 방향 토양 전단 응력 $\tau(\theta)$는 쟈노시-하나모토(Janosi-Hanamoto) 공식에 의해 슬립률 $s$와 결합됩니다:
$$\tau(\theta) = \left[ c + \sigma(\theta) \tan\phi \right] \left[ 1 - \exp\left( -\frac{j(\theta)}{K_w} \right) \right]$$여기서 $j(\theta) = r [ (\theta_1 - \theta) - (1 - s)(\sin\theta_1 - \sin\theta) ]$는 국소 토양 전단 변위이며, $K_w$는 전단 변형 계수입니다. 총 수직 지지력 $F_z$와 순 견인력(Drawbar Pull, DP) $F_x$는 다음과 같이 접촉각 적분으로 산출됩니다:
$$F_z = r b \int_{\theta_2}^{\theta_1} \left[ \sigma(\theta) \cos\theta + \tau(\theta) \sin\theta \right] d\theta$$ $$F_x = r b \int_{\theta_2}^{\theta_1} \left[ \tau(\theta) \cos\theta - \sigma(\theta) \sin\theta \right] d\theta$$슬립률이 임계값($s > 0.6$)을 초과하면 토양이 소성 전단 파괴되면서 $F_x$가 음수로 전락하고, 휠이 자가 매립되는 현상이 발생하므로 즉각적인 토크 제한이 필요합니다.
3. 1,000Hz 0-Alloc C# 로버 트랙션 제어 엔진
다음은 1ms 샘플링 타임 내에서 가비지 컬렉터 없이 스택 메모리를 사용하여 휠 침하 깊이와 슬립률을 계산하고 최적 토크를 차동 분배하는 C# 엔진입니다.
using System;
using System.Runtime.CompilerServices;
namespace ZeliDesk.Stem.Terramechanics;
public readonly ref struct RoverWheelState
{
public readonly double WheelSlipRatio;
public readonly double SinkageDepthMeters;
public readonly double DrawbarPullNewtons;
public readonly double CommandedTorqueNm;
public readonly bool IsEntrapmentWarning;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public RoverWheelState(double slip, double sinkage, double drawbar, double torque, bool warning)
{
WheelSlipRatio = slip;
SinkageDepthMeters = sinkage;
DrawbarPullNewtons = drawbar;
CommandedTorqueNm = torque;
IsEntrapmentWarning = warning;
}
}
public ref struct MarsRoverTractionSimulator
{
private const double WheelRadiusM = 0.25; // 25 cm 휠
private const double WheelWidthM = 0.15; // 15 cm 휠 폭
private const double MarsGravity = 3.72; // 화성 중력가속도
// 화성 레골리스 토양 파라미터
private const double CohesionPa = 120.0;
private const double FrictionAngleDeg = 34.0;
private const double Kc = 1500.0;
private const double Kphi = 850000.0;
private const double ExponentN = 0.9;
private const double Kw = 0.025; // 전단 변형 계수 2.5 cm
private double _wheelAngVelRadS;
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public MarsRoverTractionSimulator(double initialRpm = 10.0)
{
_wheelAngVelRadS = initialRpm * (2.0 * Math.PI / 60.0);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public RoverWheelState Step(double linearVelocityMps, double normalLoadNewtons, double targetTorqueNm, double dtSeconds = 0.001)
{
// 1. 슬립률(Slip Ratio) 산출: s = (r*omega - v) / (r*omega)
double wheelCircSpeed = _wheelAngVelRadS * WheelRadiusM;
double slipRatio = (wheelCircSpeed > 1e-4) ? (wheelCircSpeed - linearVelocityMps) / wheelCircSpeed : 0.0;
if (slipRatio < 0.0) slipRatio = 0.0;
if (slipRatio > 1.0) slipRatio = 1.0;
// 2. 베커 정적 침하 깊이 z0 산출
// W = b * (Kc/b + Kphi) * (z^(n+1) / (n+1))
double stiffness = (Kc / WheelWidthM + Kphi);
double sinkageDepth = Math.Pow((normalLoadNewtons * (ExponentN + 1.0)) / (WheelWidthM * stiffness), 1.0 / (ExponentN + 1.0));
// 슬립에 의한 동적 침하 증폭 (Slip-induced sinkage)
sinkageDepth *= (1.0 + 1.5 * slipRatio * slipRatio);
// 3. 순 견인력(Drawbar Pull, DP) 산출
double tanPhi = Math.Tan(FrictionAngleDeg * (Math.PI / 180.0));
double maxTraction = normalLoadNewtons * tanPhi + CohesionPa * (WheelWidthM * WheelRadiusM);
double shearEngagement = 1.0 - Math.Exp(-(slipRatio * 0.1) / Kw);
double grossTraction = maxTraction * shearEngagement;
// 구름 저항력 R_c = (b * stiffness / (n+1)) * z^(n+1)
double motionResistance = (WheelWidthM * stiffness / (ExponentN + 1.0)) * Math.Pow(sinkageDepth, ExponentN + 1.0);
double drawbarPull = grossTraction - motionResistance;
// 4. 슬립 기반 능동 토크 제한 제어기
double commandedTorque = targetTorqueNm;
if (slipRatio > 0.45)
{
// 과도 슬립 시 토크를 비례적으로 축소하여 자가 매립 방지
double reductionFactor = Math.Max(0.1, 1.0 - (slipRatio - 0.45) * 2.0);
commandedTorque *= reductionFactor;
}
// 각가속도 갱신
double wheelInertia = 0.25; // kg*m^2
double netTorque = commandedTorque - (grossTraction * WheelRadiusM);
_wheelAngVelRadS += (netTorque / wheelInertia) * dtSeconds;
if (_wheelAngVelRadS < 0.0) _wheelAngVelRadS = 0.0;
bool entrapmentWarning = slipRatio > 0.65 || sinkageDepth > (WheelRadiusM * 0.4);
return new RoverWheelState(slipRatio, sinkageDepth, drawbarPull, commandedTorque, entrapmentWarning);
}
}
4. 우주 행성탐사 및 특수목적 모빌리티 응용 가이드
- 한국항공우주연구원(KARI) 달/화성 로버 개발팀: 한국형 달 탐사선 로버의 월면토(Lunar Regolith) 주행 시 슬립 유발 침하 방지 및 6륜 독립 구동 제어기 교구.
- 방통대 우호성 교수 랩실: 2022 개정 물리학Ⅰ 마찰력과 돌림힘 단원 및 지구과학Ⅰ 행성 표면 지질학을 융합한 현대 우주로봇 공학 교육 콘텐츠.
- 국방 무인수색차량 및 농업/건설 무인 모빌리티: 야지 험로 및 갯벌 진흙 지형 통과 시 1,000Hz 0-Alloc 스택 C# 온디바이스 안티-트랩 트랙션 컨트롤러 적용.