# angular-motion-lib

Библиотека расчета программ управления угловым движением КА.

Библиотека создана как перенос расчетного контура из проекта `OrbitalMotion/AISTPUUD/SurveyPUUD`:

- `ConstOrientAISTPUUD` → `ConstOrientPUUD`;
- `AzimuthAISTPUUD` → `AzimuthPUUD`;
- `SmoothSDIAISTPUUD` → `SmoothSDIPUUD`.

В новых классах нет префикса `AIST`. Вместо старого C++/Qt `Ballistics` используется существующая Kotlin-библиотека проекта PCP:

- `ballistics.orbitalPoints.timeStepper.AbstractStepper` для выхода на заданное время;
- `ballistics.types.OrbitalPoint`, `Orientation`, `BLHPoint`;
- `ballistics.utils.astro.AstronomerJ2000`;
- `ballistics.utils.math.Vector3D`, `Matrix3D`, `Quaternion3D`.

В текущей модели спутника используется одна центральная линия визирования. Номер линии визирования и отклонения боковых линий из расчетного API удалены.

Основной API:

```kotlin
val calculator = AngularMotionCalculatorFactory.create(
    mode = AngularMotionMode.AZIMUTH,
    stepper = stepper,
)

val result = calculator.calculate(
    SurveyId(
        t = startTimeSeconds,
        b = latitudeRad,
        l = longitudeRad,
        h = heightMeters,
        duration = 20.0,
        sdi = listOf(150.0),
        azimuth = azimuthRad,
    )
)
```

## Примечания по переносу

1. Временные параметры задаются в интегральных секундах, как в `ballistics-lib`.
2. Углы задаются в радианах.
3. Линейные параметры оптики в `AngularMotionConfig` сохранены в миллиметрах, как в исходном `sBLS_KA`.
4. Расчет времени начала режима сохраняет подход `calcTn`: поиск корня на интервале `t ± 180 с` и округление к `discreteTimes`.
5. Интервал успокоения рассчитывается обратной интерполяцией первых точек ПУУД, аналогично `TauIntervalCalculator`.
