| import numpy as np |
| import torch |
|
|
| from mapgs.config import MapConfig |
| from mapgs.hdmap import ( |
| grid_field_from_points, HDMap, sample_anchors, rasterize_map_depth, project_polylines, |
| ) |
| from mapgs.hdmap.anchors import resample_polyline, weighted_fps |
| from .conftest import requires_cuda |
|
|
|
|
| def _toy_map(): |
| pts = np.random.RandomState(0).uniform([-20, -5], [20, 50], size=(2000, 2)) |
| z = 0.02 * pts[:, 0] |
| gp = np.concatenate([pts, z[:, None]], 1) |
| gf = grid_field_from_points(gp, 0.5) |
| lanes = [torch.tensor([[x, y, 0.02 * x] for y in np.arange(0, 45, 1.0)], dtype=torch.float32) |
| for x in [-3.5, 0, 3.5]] |
| bnds = [torch.tensor([[x, y, 0.02 * x] for y in np.arange(0, 45, 2.0)], dtype=torch.float32) |
| for x in [-7, 7]] |
| return HDMap(ground=gf, lanes=lanes, boundaries=bnds) |
|
|
|
|
| def test_ground_field_bilinear_and_grad(): |
| hd = _toy_map() |
| xy = torch.tensor([[1.0, 2.0], [3.0, 4.0]], requires_grad=True) |
| z, valid = hd.height_at(xy) |
| assert valid.all() |
| assert torch.allclose(z, 0.02 * xy[:, 0].detach(), atol=0.05) |
| z.sum().backward() |
| assert xy.grad.abs().sum() > 0 |
|
|
|
|
| def test_anchor_ratios_and_count(): |
| hd = _toy_map() |
| cfg = MapConfig(n_anchors=1000) |
| A = sample_anchors(hd, cfg, seed=0) |
| assert len(A) == 1000 |
| counts = torch.bincount(A.types, minlength=3).float() / 1000 |
| assert abs(counts[0] - 0.6) < 0.05 |
| assert abs(counts[1] - 0.3) < 0.05 |
| assert abs(counts[2] - 0.1) < 0.05 |
|
|
|
|
| def test_resample_polyline_spacing(): |
| pl = torch.tensor([[0., 0, 0], [0, 10, 0]]) |
| out = resample_polyline(pl, 1.0) |
| assert out.shape[0] >= 9 |
|
|
|
|
| def test_weighted_fps_prefers_high_weight(): |
| pts = torch.randn(200, 3) |
| w = torch.ones(200) |
| w[0] = 100.0 |
| sel = weighted_fps(pts, w, 10) |
| assert 0 in sel.tolist() |
|
|
|
|
| @requires_cuda |
| def test_map_depth_coverage(): |
| from mapgs.geometry import look_at_pose |
| hd = _toy_map().to("cuda") |
| K = torch.tensor([[60., 0, 32], [0, 60, 24], [0, 0, 1]], device="cuda")[None] |
| c2w = look_at_pose(torch.tensor([0., 0, 1.5]), torch.tensor([0., 20, 0.5]))[None].cuda() |
| depth, mask = rasterize_map_depth(hd.ground, K, c2w, 48, 64) |
| assert mask.float().mean() > 0.2 |
| assert (depth[mask] > 0).all() |
| uv = project_polylines(hd.lanes, K, c2w, 48, 64) |
| assert uv[0].shape[0] > 0 |
|
|