Approximate the trajectory using piecewise cubic polynomials based on the provided settings.
Parameters:
-
trajectory
(Trajectory)
–
The trajectory to approximate.
-
approximation_settings
(ApproximationSettings, default:
None
)
–
Settings for the approximation.
-
inplace
(bool, default:
False
)
–
If True, modify the trajectory in place. Defaults to False.
Returns:
-
Trajectory ( Trajectory
) –
The approximated trajectory.
Source code in trajectopy\processing\approximation.py
| def approximate(
trajectory: Trajectory,
approximation_settings: ApproximationSettings | None = None,
inplace: bool = False,
) -> Trajectory:
"""Approximate the trajectory using piecewise cubic polynomials based on the provided settings.
Args:
trajectory (Trajectory): The trajectory to approximate.
approximation_settings (ApproximationSettings): Settings for the approximation.
inplace (bool): If True, modify the trajectory in place. Defaults to False.
Returns:
Trajectory: The approximated trajectory.
"""
if approximation_settings is None:
approximation_settings = ApproximationSettings()
if approximation_settings.position_approximation_method == PositionApproximationMethod.CUBIC:
xyz_approx = _piecewise_cubic(
index=trajectory.index,
values=trajectory.xyz,
min_win_size=approximation_settings.position_interval_size,
min_obs=approximation_settings.position_min_observations,
)
else:
raise ValueError(
f"Unknown position approximation method: {approximation_settings.position_approximation_method}"
)
traj_approx = trajectory if inplace else trajectory.copy()
traj_approx.positions.xyz = xyz_approx
if not traj_approx.has_orientation:
return traj_approx
if approximation_settings.rotation_approximation_method == RotationApproximationMethod.AVERAGE_PER_PATH_LENGTH:
quat_approx = _average_rotations_per_path_length(
trajectory, max_gap_size=approximation_settings.max_path_length_gap
)
elif approximation_settings.rotation_approximation_method == RotationApproximationMethod.AVERAGE_IN_WINDOW:
quat_approx = _average_rotations_in_window(
index=trajectory.index,
quat=trajectory.quat,
win_size=approximation_settings.rotation_window_size,
)
else:
raise ValueError(
f"Unknown rotation approximation method: {approximation_settings.rotation_approximation_method}"
)
traj_approx.rotations = Rotations.from_quat(quat_approx)
return traj_approx
|