Проверка на пересечение ЛВ Земли при расчете ПУУД

This commit is contained in:
emelianov
2026-06-15 16:44:51 +03:00
parent ee68da30f2
commit 1790192e06
@@ -18,7 +18,10 @@ import space.nstart.pcp.pcp_request_service.service.SatelliteService
import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionCalculationRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionCalculationRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.AngularMotionModeDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ExactTimePositionRequestDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.ExactTimePositionRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.ObjViewRequestDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO import space.nstart.pcp.pcp_types_lib.dto.ballistics.OrbPointDTO
import space.nstart.pcp.pcp_types_lib.dto.ballistics.PositionDTO
import kotlin.math.PI import kotlin.math.PI
import kotlin.math.abs import kotlin.math.abs
import kotlin.math.atan import kotlin.math.atan
@@ -77,6 +80,7 @@ class AngularMotionService(
fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO { fun calculate(request: AngularMotionCalculationRequestDTO): AngularMotionCalculationResultDTO {
validate(request) validate(request)
validateTargetVisibility(request)
val defaultConfig = AngularMotionConfig() val defaultConfig = AngularMotionConfig()
val config = AngularMotionConfig( val config = AngularMotionConfig(
focus = request.focusMm ?: defaultConfig.focus, focus = request.focusMm ?: defaultConfig.focus,
@@ -146,6 +150,34 @@ class AngularMotionService(
} }
} }
private fun validateTargetVisibility(request: AngularMotionCalculationRequestDTO) {
val windowStart = request.approximateTime.minusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES)
val windowStop = request.approximateTime.plusMinutes(TARGET_VISIBILITY_WINDOW_MINUTES)
val visiblePoints = satelliteService.mplPoint(
ObjViewRequestDTO(
satellites = listOf(request.satelliteId),
timeStart = windowStart,
timeStop = windowStop,
obj = ObjDTO(
id = ANGULAR_MOTION_TARGET_ID,
position = PositionDTO(
lat = request.latitudeDeg,
long = request.longitudeDeg,
height = request.heightM,
),
),
),
).collectList().block().orEmpty()
if (visiblePoints.isEmpty()) {
throw CustomValidationException(
"Заданная точка не видна КА ${request.satelliteId} в окрестности времени " +
"${request.approximateTime}: ${windowStart}${windowStop}. " +
"Выберите другое время, точку или спутник.",
)
}
}
private fun loadOrbitalPoints( private fun loadOrbitalPoints(
request: AngularMotionCalculationRequestDTO, request: AngularMotionCalculationRequestDTO,
config: AngularMotionConfig, config: AngularMotionConfig,
@@ -198,5 +230,7 @@ class AngularMotionService(
private companion object { private companion object {
const val MAP_INTERVAL_MINUTES = 5L const val MAP_INTERVAL_MINUTES = 5L
const val TARGET_VISIBILITY_WINDOW_MINUTES = 15L
const val ANGULAR_MOTION_TARGET_ID = "angular-motion-target"
} }
} }