Source code for src.utils.calc_xy_error

import torch


[docs] def calc_xy_error(traj_diff, ped_pos, veh_pos, veh_vel): """ Compute normal and tangential errors relative to the vehicle direction. Args: traj_diff: (N, T, 2) Predicted trajectory error vectors. ped_pos: (N, 2) Initial pedestrian positions. veh_pos: (N, 2) Nearest vehicle positions (NaN if invalid). veh_vel: (N, 2) Nearest vehicle velocities (NaN if invalid). Returns: avg_norm_err: Average normal error. avg_tang_err: Average tangential error. """ # Invalid data for scenes without vehicles. valid_data_mask = ~veh_pos.isnan().any(dim=-1) # (N,) # Compute the ray direction vector. speed = veh_vel.norm(dim=-1, keepdim=True) # (N, 1) vel_dir = veh_vel / (speed + 1e-8) # (N, 2) # Compute the pedestrian-to-ray distance. rel_pos = ped_pos - veh_pos # (N, 2) proj_len = (rel_pos * vel_dir).sum(dim=-1, keepdim=True) # (N, 1) perp_vec = rel_pos - proj_len * vel_dir dist_to_ray = torch.norm(perp_vec, dim=-1) # (N,) # Combined filtering: valid data, moving vehicle, and pedestrian within 10m of the forward ray. final_mask = valid_data_mask & (speed.squeeze(-1) > 0.01) & (dist_to_ray < 10.0) if not final_mask.any(): return torch.tensor([float('nan')]), torch.tensor([float('nan')]) # Decompose the error. target_diff = traj_diff[final_mask] target_dir = vel_dir[final_mask].unsqueeze(1) # Tangential error: projection onto the direction vector. tang_err = torch.abs((target_diff * target_dir).sum(dim=-1)) # (N_subset, T) # Normal error: projection onto the normal vector. target_norm_vec = torch.stack([-target_dir[..., 1], target_dir[..., 0]], dim=-1) norm_err = torch.abs((target_diff * target_norm_vec).sum(dim=-1)) # (N_subset, T) # Return the averages. return norm_err.mean(dim=-1), tang_err.mean(dim=-1)