hyzhou404's picture
init
7accb91
from typing import Any, List
import numpy as np
import numpy.typing as npt
import matplotlib
import matplotlib.pyplot as plt
from navsim.visualization.config import LIDAR_CONFIG
from navsim.common.enums import LidarIndex
def filter_lidar_pc(lidar_pc: npt.NDArray[np.float32]) -> npt.NDArray[np.float32]:
"""
Filter lidar point cloud according to global configuration
:param lidar_pc: numpy array of shape (6,n)
:return: filtered point cloud
"""
pc = lidar_pc.T
mask = (
np.ones((len(pc)), dtype=bool)
& (pc[:, LidarIndex.X] > LIDAR_CONFIG["x_lim"][0])
& (pc[:, LidarIndex.X] < LIDAR_CONFIG["x_lim"][1])
& (pc[:, LidarIndex.Y] > LIDAR_CONFIG["y_lim"][0])
& (pc[:, LidarIndex.Y] < LIDAR_CONFIG["y_lim"][1])
& (pc[:, LidarIndex.Z] > LIDAR_CONFIG["z_lim"][0])
& (pc[:, LidarIndex.Z] < LIDAR_CONFIG["z_lim"][1])
)
pc = pc[mask]
return pc.T
def get_lidar_pc_color(lidar_pc: npt.NDArray[np.float32], as_hex: bool = False) -> List[Any]:
"""
Compute color map of lidar point cloud according to global configuration
:param lidar_pc: numpy array of shape (6,n)
:param as_hex: whether to return hex values, defaults to False
:return: list of RGB or hex values
"""
pc = lidar_pc.T
if LIDAR_CONFIG["color_element"] == "none":
colors_rgb = np.zeros((len(pc), 3), dtype=np.uin8)
else:
if LIDAR_CONFIG["color_element"] == "distance":
color_intensities = np.linalg.norm(pc[:, LidarIndex.POSITION], axis=-1)
else:
color_element_map = {
"x": LidarIndex.X,
"y": LidarIndex.Y,
"z": LidarIndex.Z,
"intensity": LidarIndex.INTENSITY,
"ring": LidarIndex.RING,
"id": LidarIndex.ID,
}
color_intensities = pc[:, color_element_map[LIDAR_CONFIG["color_element"]]]
min, max = color_intensities.min(), color_intensities.max()
norm_intensities = [(value - min) / (max - min) for value in color_intensities]
colormap = plt.get_cmap("viridis")
colors_rgb = np.array([colormap(value) for value in norm_intensities])
colors_rgb = (colors_rgb[:, :3] * 255).astype(np.uint8)
assert len(colors_rgb) == len(pc)
if as_hex:
return [matplotlib.colors.to_hex(tuple(c / 255.0 for c in rgb)) for rgb in colors_rgb]
return [tuple(value) for value in colors_rgb]