Source code for suboptimumg.track.track_factory

from .gps import *
from .models import *
from .track import Track
from .utils import *


[docs] def from_corners(corner_input: CornerListInput): """ Factory method to generate a Track class from a list of corners. Compatible with tracks saved in YAML. Parameters ---------- corner_input : CornerListInput Corner list input containing corners and track parameters Returns ------- Track Track instance created from corner list """ # Convert corner length to step count. Optionally scale the length of a track. discretized_corners = scale_and_discretize_corner_lengths( corner_input.corners, corner_input.shorten * (0.1 / corner_input.distance_step), ) x_m, y_m, arcs = corners_to_cartesian( discretized_corners, corner_input.distance_step, start_angle_deg=corner_input.ideal_rotation_angle, ) if corner_input.clean_corners: discretized_corners = smooth_and_normalize_corner_radii(discretized_corners) dx, radius, cumulative_dist = unroll_corners_into_track( discretized_corners, corner_input.distance_step ) return Track( dx, radius, cumulative_dist, x_m, y_m, corner_input.distance_step, False, original_corners=corner_input.corners, arcs=arcs, )
[docs] def from_coordinates(coord_input: CoordinateListInput): """ Factory method to generate a Track from GPS coordinates (latitude/longitude). Creates a continuous representation with Menger curvature, then discretizes it. Parameters ---------- coord_input: CoordinateListInput Contains GPS coordinates and track parameters Returns ------- Track Track instance with continuous representation """ spline_data, tck, cumulative_dist = gps_interpolate(coord_input, smooth=0.000000082) x_m, y_m = gps_to_cartesian(spline_data, origin_offset=True) # Calculate radii and dx dx = np.full(cumulative_dist.shape, coord_input.distance_step) radii = np.full(cumulative_dist.shape, 0.0) for idx in range(len(cumulative_dist)): _, radius = calculate_menger_curvature( x_m, y_m, cumulative_dist, cumulative_dist[idx], coord_input.sample_dist, ) radii[idx] = radius return Track( dx, radii, cumulative_dist, x_m, y_m, coord_input.distance_step, True, sample_dist=coord_input.sample_dist, tck=tck, )
[docs] def from_data(data: TrackData) -> Track: """ Factory method to create a Track from a TrackData model. Parameters ---------- data : ContinuousTrackData | DiscreteTrackData A TrackData instance containing all track fields including pre-computed seed indices Returns ------- Track A new Track instance with all fields populated from the data model """ # Create a new Track instance without calling __init__ instance = Track.__new__(Track) # Set common fields instance.dx = data.dx instance.radius = data.radius instance.cumulative_dist = data.cumulative_dist instance.x_m = data.x_m instance.y_m = data.y_m instance.distance_step = data.distance_step instance.seed_idx = data.seed_idx # Set type-specific fields match data: case ContinuousTrackData(): instance.continuous = True instance.sample_dist = data.sample_dist instance.tck = data.tck case DiscreteTrackData(): instance.continuous = False instance.original_corners = data.original_corners instance.arcs = data.arcs return instance