Построение маршрута с учетом запаса батареи или топлива
В демоприложении реализована возможность планирования маршрута c автоматическим добавлением зарядных станций и АЗС, чтобы заряда батареи и топлива хватило на весь маршрут. Для этого учитываются:
- расстояниe, которое может проехать автомобиль на текущем уровне заряда батареи или остатка топлива;
- максимальный запас хода при полной заряде батареи или баке;
- минимальный запас хода, который всегда должен быть доступен;
- тип коннектора, который поддерживает автомобиль, либо тип топлива.
Важно
Допускается, что маршруты могут быть не оптимальными.
Для построения более оптимального маршрута рекомендуем в DrivingOptions не передавать avoidanceFlags.
Описание алгоритма
Конкретные описания классов и их реализацию можно найти в демоприложении.
Возможность построения маршрута с учетом запаса батареи или топлива реализована не в рамках NaviKit SDK, а предоставляется как вариант использования Navikit SDK. Вы можете копировать и изменять алгоритм для реализации вашей бизнес-логики.
Входные параметры
Описание структуры SmartRouteOptions.
data class SmartRouteOptions(
val chargingType: ChargingType,
val fuelConnectorTypes: Set<FuelConnectorType>,
val maxTravelDistanceInMeters: Double,
val currentRangeLvlInMeters: Double,
val thresholdDistanceInMeters: Double,
val drivingOptions: DrivingOptions,
val vehicleOptions: VehicleOptions,
)
chargingType- тип двигателяELECTROилиGASOLINE;fuelConnectorTypes- тип конекторов, полный список поддерживаемых коннекторов и типов топлива можно найти в файлеFuelConnectorType.ktдемоприложения;maxTravelDistanceInMeters- максимальное количество метров, которое может проехать автомобиль при полном заряде;currentRangeLvlInMeters- максимальное количество метров, которое может проехать автомобиль при текущем заряде;thresholdDistanceInMeters- пороговое значения кол-ва метров, ниже которого заряд не должен опускаться;drivingOptions- объект DrivingOptions для учета платных, грунтовых, плохих и других дорог;vehicleOptions- объект VehicleOptions для учета параметров автомобиля.
Выходные параметры
Описание структуры SmartRouteResult.
sealed class SmartRouteResult {
data class Success(
val points: List<SmartRoutePoint>,
val finishRangeLvlInMeters: Double
) : SmartRouteResult()
data class Error(
val reason: String,
val error: Exception? = null
) : SmartRouteResult()
}
sealed class SmartRoutePoint {
abstract val point: RequestPoint
data class ChargingPoint(override val point: RequestPoint, val geoObject: GeoObject) : SmartRoutePoint()
data class RegularPoint(override val point: RequestPoint) : SmartRoutePoint()
}
При успешном построении маршрута будет получен код SmartRouteResult.Success и следующие данные:
points- список объектовSmartRoutePoint, одного из двух типов:- точки для зарядки аккомулятора или заправки
SmartRoutePoint.ChargingPoint. В нем содержится GeoObject, с информацей о зарядных станция / АЗС; - пользовательские промежуточные точки, которые были переданы в алгоритм на вход
SmartRoutePoint.RegularPoint.
- точки для зарядки аккомулятора или заправки
finishRangeLvlInMeters- количество метров, которое машина сможет еще проехать в момент приезда в точку назначения.
В случае если маршрут не смог быть построен, будет передан код SmartRouteResult.Error.
Алгоритм построения маршрута
Для построения маршрута с автоматическим добавлением зарядных станций и АЗС выполняется следующая последовательность:
- Создается объект
SmartRouteOptionsиSmartRoutePlanningFactory. - Вызывается
SmartRoutePlanningFactory.requestRoutesc нужным списком промежуточных точекpoints. - Обрабатывается ответ от алгоритма. Ответ будет содержать список пользовательских промежуточных точек, а так же точек для зарядки / заправки автомобиля.
- Происходит построение маршрута с помощью Navigation.requestRoutes по точкам из ответа алгоритма.
val smartRouteOptions = SmartRouteOptions(...)
val smartRoutePlannigFactory = SmartRoutePlanningFactoryImpl(...)
val result = smartRoutePlannigFactory.requestRoutes(
points,
smartRouteOptions
)
// Handle result
Алгоритм поиска промежуточных точек для маршрута
- Строится маршрут через DrivingRouter c указанием начальной и конечной точки, а так же промежуточных точек.
- С учетом входных параметров (текущего запаса хода, максимального запаса хода и т.д.) находится отрезок маршрута, до которого хватит запаса хода автомобиля.
- С помощью SearchManager выполняется поиск зарядной / заправочной станции, которая ближе всех расположена к концу найденного отрезка.
- Выполняется сохранение найденной зарядной / заправочной станции. Алгоритм устанавливает местоположение машины как проекцию точки зарядки на полилинию маршрута.
- Алгоритм повторяется с шага 2 и останавливается когда запаса хода хватает для проезда всего маршрута.