1 # Copyright (c) 2019-2020 NVIDIA CORPORATION. All rights reserved.
3 @page dwx_porting_guide_3_0 Porting Guide from SDK 2.2 to SDK 3.0
6 This document will help you port your applications from DriveWorks SDK 2.2 to DriveWorks SDK 3.0.
8 @section dwks_and_dws_release For NVIDIA DriveWorks and NVIDIA DRIVE Software Releases
10 @note The following subsections are applicable for both **NVIDIA DriveWorks** and **NVIDIA DRIVE Software** releases.
12 ------------------------------------------------------------------
14 @subsection pg3_calibration Calibration
16 This release has removed the capability to select
17 `DW_CALIBRATION_CAMERA_SIGNAL_NONE` for camera self-calibration signal
18 specification, and has added the new option to select
19 `::DW_CALIBRATION_CAMERA_SIGNAL_DEFAULT` instead, which will automatically select
20 the calibration signals for a given camera based on it's properties. Specific
21 signals can still be selected for the non-default case as before.
23 The lidar self-calibration API `dwCalibrationEngine_addLidarSweep()` has been
24 replaced with the simpler `dwCalibrationEngine_addLidarPointCloud()` and now
25 expects a CAN bus index to be passed at initialization with
26 `dwCalibrationEngine_initializeLidar()`, so that `dwVehicleIOState` data from
27 this CAN bus provided with the existing `dwCalibrationEngine_addVehicleIOState()`
28 API is consumed internally. Also, the previously deprecated
29 `dwCalibrationEngine_addLidarPoses()` API has been removed, the more general
30 `dwCalibrationEngine_addLidarPose()` API should be used instead.
32 The IMU self-calibration has been adjusted to not require a dedicated egomotion handle
33 anymore. Instead, `dwCalibrationEngine_initializeIMU()` requires the index of a CAN bus
34 from the rig file and the calibration engine initialized by it must be passed `dwVehicleIOState`
35 data from this CAN bus via `dwCalibrationEngine_addVehicleIOState()`.
37 The radar self-calibration has been modified to remove the dependency on egomotion. The API
38 `dwCalibrationEngine_initializeRadar()` doesn't need an input of egomotion handle any more.
39 Instead, it accepts a CAN bus index as an additional input, so that `dwVehicleIOState`
40 data from this CAN bus is provided with the existing `dwCalibrationEngine_addVehicleIOState()`.
42 ------------------------------------------------------------------
44 @subsection pg3_core Core
46 This release has removed the following previously deprecated APIs:
47 - `dwContext_getNvMediaDevice`
48 - `dwContext_setNvMediaDevice`
50 and the `NvMediaDevice* nvmediaDevice` field of the `::dwContextParameters` struct.
52 ------------------------------------------------------------------
54 @subsection pg3_dnn DNN
56 This release removes the following old APIs:
57 - `dwDNN_initializeTensorRTFromFile`
58 - `dwDNN_initializeTensorRTFromMemory`
61 - `dwDNN_initializeTensorRTFromFileNew` into `dwDNN_initializeTensorRTFromFile()`
62 - `dwDNN_initializeTensorRTFromMemoryNew` into `dwDNN_initializeTensorRTFromMemory()`
64 The signature of `dwDNN_infer()` has been modified, and it accepts now a list of `::dwDNNTensorHandle_t` as input and output.
65 `dwDNN_inferRaw()` has been introduced to replace the previous `dwDNN_infer` function that works with raw device pointers.
67 ------------------------------------------------------------------
69 @subsection pg3_dataconditioner DataConditioner Processing Pipeline
71 This release changes the signature of following APIs from:
72 - `dwStatus dwDataConditioner_setROI(const dwRect* roi, dwDataConditionerHandle_t obj)`
73 - `dwStatus dwDataConditioner_getROI(dwRect* roi, dwDataConditionerHandle_t obj)`
75 to following form that take an additional parameter `inputIdx`:
76 - `dwStatus dwDataConditioner_setROI(const dwRect* roi, uint32_t inputIdx, dwDataConditionerHandle_t obj)`
77 - `dwStatus dwDataConditioner_getROI(dwRect* roi, uint32_t inputIdx, dwDataConditionerHandle_t obj)`
79 `inputIdx` corresponds to the index of image to set/get ROI. Previously all input images share one global ROI, after the
80 change, each input image slot can have one unique ROI attached.
82 This release has renamed `dwDataConditioner_prepareData` to `dwDataConditioner_prepareDataRaw`.
84 ------------------------------------------------------------------
86 @subsection pg3_egomotion Egomotion
88 This release has exposed the capability to choose gains for the simple version of the
89 linear acceleration filter. It exposed `accelerationFilterTimeConst`, `processNoiseStdevSpeed`,
90 `processNoiseStdevAcceleration`, `measurementNoiseStdevSpeed`, and `measurementNoiseStdevAcceleration`.
91 These variables should all be set when `dwEgomotionLinearAccelerationFilterMode` is set to
92 `DW_EGOMOTION_ACC_FILTER_SIMPLE`.
94 This release has removed the model-based acceleration filter (DW_EGOMOTION_ACC_FILTER_MODELBASED).
96 This release has modified the following API functions:
97 - `dwEgomotion_initParamsFromRig()` (`gpsSensorName` has been removed)
98 - `dwEgomotion_initParamsFromRigByIndex()` (`gpsSensorIdx` has been removed)
100 This release has removed the following deprecated API functions:
102 - `dwEgomotion_getHistoryEntry` (please use `dwEgomotion_getHistoryElement()` instead)
103 - `dwEgomotion_applyRelativeUncertainty`
104 - `dwEgomotion_addGPSMeasurement` (please use the `dwGlobalEgomotion` module instead)
106 This release has removed the deprecated `estimationPeriod` parameter in `::dwEgomotionParameters`. Use
107 the `::dwEgomotionParameters.automaticUpdate` parameter going forward.
109 This release has removed the following GNSS-related parameters and flags:
111 - Configuration parameters:
112 - `dwEgomotionSensorCharacteristics.gpsSamplingRateHz`
113 - `dwEgomotionSensorCharacteristics.gpsHorizontalNoiseMeter`
114 - `dwEgomotionSensorCharacteristics.gpsVerticalNoiseMeter`
115 - `dwEgomotionParameters.gps2rig`
116 - `dwEgomotionParameters.disableLocationFilter`
119 - `dwEgomotionDataField.DW_EGOMOTION_LOCATION_LON`
120 - `dwEgomotionDataField.DW_EGOMOTION_LOCATION_LAT`
121 - `dwEgomotionDataField.DW_EGOMOTION_LOCATION_ALT`
124 - `dwEgomotionReferenceFrame`
127 - `dwEgomotionResult.location`
128 - `dwEgomotionResult.rotationFrame`
129 - `dwEgomotionUncertainty.location`
131 This release has added an interpolation and extrapolation limit; requests for interpolation over an
132 interval larger than 5 seconds or extrapolation of more than 2.5 seconds into the future will return
133 DW_NOT_AVAILABLE. Affected APIs:
134 - `dwEgomotion_estimate()`
135 - `dwEgomotion_computeRelativeTransformation()`
138 ------------------------------------------------------------------
140 @subsection pg3_image_processing Image Processing
142 @subsubsection pg3_feature_det_track Feature Detector and Feature Tracker
144 `dwConnectedComponents_labelImage` has been removed. Instead the following API should be used:
146 - `dwConnectedComponents_bindInput()`
147 - `dwConnectedComponents_bindOutputLabels()`
148 - `dwConnectedComponents_setThreshold()`
149 - `dwConnectedComponents_process()`
151 This release removes `dw_features` module, header file `dw/features/Features.h` should be replaced to
152 `dw/imageprocessing/features/FeatureList.h`, `dw/imageprocessing/features/FeatureDetector.h`
153 and `dw/imageprocessing/tracking/FeatureTracker.h` respectively.
155 Refer to @ref dwx_porting_guide_2_0 for API changings.
157 ------------------------------------------------------------------
159 @subsection pg3_ipc Inter Process Communication
161 @subsubsection pg3_socketclientserver SocketClientServer
163 This release has removed the following previously deprecated APIs:
164 - `dwSocketConnection_send`
165 - `dwSocketConnection_peek`
166 - `dwSocketConnection_peekNonBlock`
167 - `dwSocketConnection_recv`
168 - `dwSocketConnection_recvNonBlock`
171 - `dwSocketConnection_peekNew` to `dwSocketConnection_peek()`
173 ------------------------------------------------------------------
175 @subsection pg3_lidaraccumulator Lidar Accumulator
177 `dwLidarAccumulator` has been removed. Use `dwPointCloudAccumulator` from `PointCloudAccumulator.h` instead.
179 ------------------------------------------------------------------
181 @subsection pg3_pointcloudprocessing Point Cloud Processing
183 The following depracated items have been removed:
184 - `xyzi` member of `dwPointCloud` structure
185 - `dwPointCloudAccumulator_bindInput`
186 - `dwPointCloudStitcher_setMotionCompensation`
188 The old `dwPointCloudStitcher_bindInput` has been removed and `dwPointCloudStitcher_bindInputToSlot` has been renamed to `dwPointCloudStitcher_bindInput()`.
190 Refer to @ref dwx_porting_guide_2_0 for more details.
192 ------------------------------------------------------------------
194 @subsection pg3_rigfile Rig File
196 This release updates the rig files to `version 6`, converting the rig throttle and brake maps to a torque map.
197 That is, instead of mapping the inputs to an output force it maps them to a torque value.
198 The old output force values can be mapped to torque values by multiplying them by the nominal wheel radius.
199 (Torque = Force x Nominal_Radius)
201 The fields [`throttleStateInput`, `throttleForceOutput`, `brakeStateInput`, `brakeForceOutput`]
202 are changed to [`throttlePedalInput`, `throttleSpeedInput`, `throttleTorqueOutput`,
203 `brakePedalInput`, `brakeTorqueOutput`] under the field `torqueLUT`.
205 The throttle map is also now a 2-d table, mapping a pedal position at a
206 given speed to a torque value. As such, the `throttleTorqueOutput` table is of size
207 (`throttlePedalInput` x `throttleSpeedInput`).
209 With `VERSION 6`, there is also an additional field `effectiveMass`, providing the effective mass due to vehicle rotational inertia
210 (wheel rotation, engine, and other parts of the CVT drive-train) in kg.
212 DriveWorks SDK documentation contains examples for the new `version 6` rig files.
214 ------------------------------------------------------------------
216 @subsection pg3_sal Sensor Abstraction Layer
218 @subsubsection pg3_sensors Sensors
220 This release removes the following previously deprecated APIs:
222 - `dwSensor_getSeekTable`
223 - `dwSensorSerializer_serializeImage`
224 - `dwSensorSerializer_serializeImageAsync`
226 See wFrameCapture_appendFrame() and dwFrameCapture_appendFrameAsync() to support of the use cases previously covered by `dwSensorSerializer_serializeImage` and `dwSensorSerializer_serializeImageAsync`.
228 This release also removes support for Pointgrey cameras, therefore camera.pointgrey protocol is deprecated.
230 This release removes support for dwSoftISP and the isp module all together. Raw cameras and raw videos are to be processed via Tegra ISP, automatically in place when `output-format` contains `processed` and a processed image is requested from the acquired frame handle.
232 The previously separate concepts of HV (Human Vision) using Tegra ISP and MV (Machine Vision) using dwSoftISP are now surpassed for a unified vision paradigm. DNN (refer to the specific DNNs documentation) are now compatible with the unified paradigm, unless specified otherwise
234 The equivalent sample common classes CameraRawFramePipeline and RawSimpleCamera are also removed as based on dwSoftISP.
236 All samples have been stripped of dwSoftISP.
238 Protocol `camera.gmsl` based on NvMedia's IPP has been moved to `camera.gmsl.ipp` and replaced in functionality by NvSIPL library, see @ref camera_nvsipl_ipp_porting_guide for info
240 sample_camera_gmsl, sample_camera_gmsl_raw, sample_camera_multiple_gmsl and sample_camera_gmsl_custom are all combined into `sample_camera`. Refer to its README for more details
242 ------------------------------------------------------------------
244 @subsection pg3_vehicle_and_motion Vehicle and Motion Actuation
246 @subsubsection pg3_rig Rig
248 This release has removed the API `dwRig_initializeFromStringWithPath` and integrated
249 its functionality into `dwRig_initializeFromString()` with a new parameter `relativeBasePath`.
250 If `relativeBasePath` is `NULL`, then the current working directory of the current process
251 is used to initialize it. Existing calls to `dwRig_initializeFromString()` can
252 be updated to pass `NULL` for `relativeBasePath`.
254 ------------------------------------------------------------------
256 @subsubsection pg3_vehicleio VehicleIO
258 Following APIs have been removed:
259 - `dwVehicleIO_consume`
260 - `dwVehicleIO_sendVehicleCommand`
261 - `dwVehicleIOCommand::steeringSpeed` has been replaced by `dwVehicleIOCommand::maxSteeringWheelSpeed` for specifying the maximum steering wheel speed.
262 - `dwVehicleIOCommand::steeringValid` has been replaced by `dwVehicleIOCommand::steeringWheelValid` for specifying the validity status of steering wheel-based control interface.
263 - `dwVehicleIOState::steeringCmd` has been replaced by `dwVehicleIOState::steeringWheelAngleCmd` for the steering wheel angle command.
264 - `dwVehicleIOState::steeringAngle` has been replaced by `dwVehicleIOState::frontSteeringAngle` for the front wheel steering angle.
266 ------------------------------------------------------------------
268 @section dws_release_only For NVIDIA DRIVE Software Releases
270 @note The following subsections are applicable for **NVIDIA DRIVE Software** releases only.
272 ------------------------------------------------------------------
274 @subsection pg3_driveperception Perception
276 @subsubsection pg3_ahbnet AhbNet
278 AhbNet.h has been removed in favor of LightSourceNet.h.
280 ------------------------------------------------------------------
282 @subsubsection pg3_clearsightnet ClearSightNet
284 ClearSightNet.h has been moved to `perception/safety/camera/`.
286 `dwClearSightNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
288 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
290 ------------------------------------------------------------------
292 @subsubsection pg3_drivenet DriveNet
294 DriveNet.h has been moved to `perception/object/camera/`.
296 `dwDriveNet_initDefaultParameters()` now requires an additional argument: `::dwContextHandle_t`.
298 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
300 ------------------------------------------------------------------
302 @subsubsection pg3_lanenet LaneNet
304 This module has been removed. Lane detection is now performed by `dwMapNet`.
306 ------------------------------------------------------------------
308 @subsubsection pg3_lightnet LightNet
310 LightNet.h has been moved to `perception/object/camera/`.
312 `dwLightNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
314 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
316 -----------------------------------------------------------------
318 @subsubsection pg3_mapnet MapNet
320 MapNet.h has been moved to `perception/landmarks/camera/`.
322 `dwMapNet_initDefaultParamsNew` has been renamed to `dwMapNet_initDefaultParams()`, and now requires additional arguments: `::dwMapNetType` and `::dwContextHandle_t`.
324 ------------------------------------------------------------------
326 @subsubsection pg3_openroadnet OpenRoadNet
328 OpenRoadNet.h has been moved to `perception/freespace/camera/`.
330 `dwOpenRoadNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
332 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
334 ------------------------------------------------------------------
336 @subsubsection pg3_pathnet PathNet
338 PathNet.h has been moved to `perception/path/camera/`.
340 `dwPathNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
342 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
344 ------------------------------------------------------------------
346 @subsubsection pg3_signnet SignNet
348 SignNet.h has been moved to `perception/object/camera/`.
350 `dwSignNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
352 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
354 ------------------------------------------------------------------
356 @subsubsection pg3_waitnet WaitNet
358 WaitNet.h has been moved to `perception/object/camera/`.
360 `dwWaitNet_initDefaultParameters` now requires an additional argument: `::dwContextHandle_t`.
362 The context handle is required to determine the current GPU architecture so that the default precision is selected accordingly. If the architecture is `Pascal` and a DNN model for this architecture is available, the default precision is set to `FP32`. Otherwise, it is set to `FP16`.
364 -----------------------------------------------------------------
366 @subsubsection pg3_landmarkdetector LandmarkDetector
368 struct `dwLandmarkDetectorOutput` has been removed, please directly use `::dwLaneDetection` and `::dwLandmarkDetection` types to take LandmarkDetector output.
369 `dwLandmarkDetector_initializeDefaultParamsNew` has been renamed to `dwLandmarkDetector_initializeDefaultParams()`, and now takes frame width and height as additional input.
370 `dwLandmarkDetector_detectLandmarksNew` has been renamed to `dwLandmarkDetector_detectLandmarks()`, and now takes `::dwLaneDetection` and `::dwLandmarkDetection` as input instead of `dwLandmarkDetectorOutput`.
371 `dwLandmarkDetector_setDetectionROI`, `dwLandmarkDetector_setDetectionThreshold`, `dwLandmarkDetector_setTemporalSmoothFactor`, `dwLandmarkDetector_getTemporalSmoothFactor`, `dwLandmarkDetector_setModelParameterFitting` functions have all been removed, these are now set as part of `::dwLandmarkDetectorParams`.
373 ------------------------------------------------------------------
375 @subsection pg3_drivemapping Mapping
377 @subsubsection pg_maps_3_0 Maps
379 The object model for map access has been significantly refactored for release 3.0.
381 Instead of directly initializing a `dwMapHandle_t` with `dwMaps_initialize()` application
382 should instead first initialize a `::dwMapProviderHandle_t` instance and subsequently use the
383 Map Provider API to request Maps appropriately for scenario-specific needs.
385 An important change to the programming model is that Map resources are no longer owned
386 directly by the application. Maps are only "requested" from the Map Provider and must
387 be released back to the Map Provider via `dwMapProvider_releaseMap()` instead of
388 being directly released by `dwMaps_release()`.
390 Enum `dwMapsLaneGeometry` is changed to have mapping enum entry consistent with
391 the 'side' concept at `dwSide` eg., DW_MAPS_LANE_GEOMETRY_LANEDIVIDERLEFT = DW_SIDE_LEFT.
393 `layers/ImageLayer.h` is now available and contains 3 modules:
394 - Image Layer module, to work with `dwMapsContentLayerType` of type `DW_MAPS_CONTENT_LAYER_TYPE_IMAGES`
395 - Image layer types available defined in enum `dwMapsImageType`
396 - `dwMapsImageLayer_checkType` to check if contentLayer is an image type.
397 - `dwMapsImageLayer_getProperties` to get a handle to `dwMapsImageLayerProperties` of loaded image layer
398 - Image Layer View module to extend the layer views of content layers
399 - `dwMapsImageLayerView_getImageCount` get number of image layers in layer view
400 - `dwMapsImageLayerView_getLocalImages` get references to image layers from layer view into a buffer
401 - Maps Image Layer Storage module for loading and serving maps images
402 - `dwMapsImageStorage_initialize` to create a maps image storage handle
403 - `dwMapsImageStorage_release` to release a maps image storage handle
404 - `dwMapsImageStorage_getMapsImage` to request a specific maps image with a road segment ID
405 - `dwMapsImageStorage_returnMapsImage` to release memory for a specific maps image
406 - `dwMapsImageStorage_getProperties` to get image properties of the images being served.
409 DriveWorks SDK documentation contains example for correct Map request and release code
410 following the Map Provider programming model.
412 This release also replaces the `dwMapsLaneWaitCondition` structure with `dwMapsLaneWaitElement` structure.
413 The structure had limitations in holding required information such as map rules, ego, contender lane information etc.
414 The new wait element structures are more inline with world model wait element objects and contain more information.
416 The previous APIs `dwLanePlan_getLaneForNextWaitConditionAt()`, `dwLanePlan_getLaneForNextWaitCondition()` are not
417 supported through direct API as the has changed to use via local map. The usage to get new wait elements is through
418 the LocalMap interface `dwLocalMap_initialize()`, `dwLocalMap_bindOutput()`,
419 `dwLocalMap_computeLaneGraphFromRelativePose()` and `dwLocalMap_bindWaitElementGroupsBuffer()`.
420 Clients can process new wait elements ego lane graph information find the next wait element in the lane plan.
422 ------------------------------------------------------------------
424 @subsubsection pg3_localization Localization
426 This release adds the functionality of localization with radar, lidar, and the fusion of localization
427 with any combination of camera, radar, and liar sensors. To facilitate these new functions, we have
428 renamed the following old localization types and functions to be for camera only:
430 - Configuration parameters:
431 - `dwLocalizationParameters` -> `dwLocalizationCameraParameters`
434 - `dwLocalization_initParamsFromRig` -> `dwLocalization_cameraInitParamsFromRig()`
435 - `dwLocalization_initialize` -> `dwLocalization_cameraInitialize()`
436 - `dwLocalization_localize` -> `dwLocalization_cameraLocalize()`
437 - `dwLocalization_setCameraExtrinsics` -> `dwLocalization_cameraSetExtrinsics()`
439 The following functions have been generalized to be used for camera, radar, and lidar localization:
440 - `dwLocalization_setMap()`
441 - `dwLocalization_reset()`
442 - `dwLocalization_release()`
443 - `dwLocalization_setCUDAStream()`
444 - `dwLocalization_getCUDAStream()`
446 The following new types and functions have been added:
448 - Configuration parameters:
449 - `dwLocalizationRadarParameters()` for radar localization parameters.
450 - `dwLocalizationLidarParameters()` for lidar localization parameters.
453 - `dwLocalization_radarInitialize()` for initialization of radar localization.
454 - `dwLocalization_radarLocalize()` for localization with radar.
457 - `dwLocalization_lidarInitialize()` for initialization of lidar localization.
458 - `dwLocalization_lidarLocalize()` for localization with lidar.
460 - Localization fusion:
461 - `::dwLocalizationFusionHandle_t` as fusion localization handle.
462 - `dwLocalizationFusion_initialize()` for initialization of localization fusion.
463 - `dwLocalizationFusion_localize()` for localization fusion.
464 - `dwLocalizationFusion_setMap()` for set a new map for localization fusion.
465 - `dwLocalizationFusion_reset()` for resetting localization fusion.
466 - `dwLocalizationFusion_release()` for release the resource acquired by localization fusion.
468 We have also renamed, reordered, and added variables in `::dwLocalizationResult` struct:
469 - `absolutePos` -> `::dwLocalizationResult.globalPosition`.
470 - `absoluteOriQuat` -> `::dwLocalizationResult.globalOrientation`.
471 - `relativePos` -> `::dwLocalizationResult.relativePosition`.
472 - `relativeOriQuat` -> `::dwLocalizationResult.relativeOrientation`.
473 - `isRelativePoseValid` -> `::dwLocalizationResult.isMapAvailable`.
474 - `translationUncertainty` -> `::dwLocalizationResult.positionUncertainty`.
475 - `rotationUncertainty` -> `::dwLocalizationResult.globalOrientation`.
476 - Add `::dwLocalizationResult.indicator` and `::dwLocalizationResult.confidence`.
479 ------------------------------------------------------------------
481 @subsection pg3_driveplanning Planning
483 @subsubsection pg3_laneplanner Lane Planner
485 The `dwLanePlanner_run()` function now accepts a list of target lane pointers instead of a target road segment. To get the same behavior, a list of pointers to the lanes in the road segment can be passed as target lanes:
487 std::vector<const dwMapsLane*> targetLanes;
488 for (uint32_t laneIdx = 0; laneIdx < targetRS->laneCount; ++laneIdx)
490 targetLanes.push_back(&targetRoadSegment->lanes[laneIdx]);
492 dwLanePlanner_run(... , targetLanes.data(), static_cast<uint32_t>(targetLanes.size()), ...)