def render_radar_point_cloud(self, point_cloud, extrinsics=Pose(), color=RED, velocity=None, velocity_scale=10):
        """Render radar point cloud in BEV perspective.

        Parameters
        ----------
        radar_point_cloud: numpy array with shape (N, 3)
            point cloud in rectangular coordinates of sensor frame

        extrinsics: Pose, default: Identity pose
            The pose of the pointcloud sensor wrt the body frame (Sensor frame -> (Vehicle) Body frame).

        color: Tuple[int]
            Color in RGB to render the points.

        velocity: numpy array with shape (N,3), default None
            velocity vector of points

        velocity_scale: float
            factor to scale velocity vector by
        """
        combined_transform = self._bev_rotation * extrinsics

        pointcloud_in_bev = combined_transform * point_cloud
        point_cloud2d = pointcloud_in_bev[:, :2]

        point_cloud2d[:, 0] = (self._center_pixel[0] + point_cloud2d[:, 0] * self._pixels_per_meter)
        point_cloud2d[:, 1] = (self._center_pixel[1] + point_cloud2d[:, 1] * self._pixels_per_meter)

        H, W = self.data.shape[:2]
        uv = point_cloud2d.astype(np.int32)
        in_view = np.logical_and.reduce([
            (point_cloud2d >= 0).all(axis=1),
            point_cloud2d[:, 0] < W,
            point_cloud2d[:, 1] < H,
        ])
        uv = uv[in_view]

        for row in uv:
            cx, cy = row
            cv2.circle(self.data, (cx, cy), 7, RED, thickness=1)

        def clip_norm(v, x):
            M = np.linalg.norm(v)
            if M == 0:
                return v

            return np.clip(M, 0, x) * v / M

        if velocity is not None:
            tail = point_cloud + velocity_scale * velocity
            pointcloud_in_bev_tail = combined_transform * tail
            point_cloud2d_tail = pointcloud_in_bev_tail[:, :2]
            point_cloud2d_tail[:, 0] = (self._center_pixel[0] + point_cloud2d_tail[:, 0] * self._pixels_per_meter)
            point_cloud2d_tail[:, 1] = (self._center_pixel[1] + point_cloud2d_tail[:, 1] * self._pixels_per_meter)
            uv_tail = point_cloud2d_tail.astype(np.int32)
            uv_tail = uv_tail[in_view]
            for row, row_tail in zip(uv, uv_tail):
                v_2d = row_tail - row
                v_2d = clip_norm(v_2d, .025 * W)

                cx, cy = row
                cx2, cy2 = row + v_2d.astype(np.int)

                cx2 = np.clip(cx2, 0, W - 1)
                cy2 = np.clip(cy2, 0, H - 1)
                color = GREEN
                # If moving away from vehicle change the color (not strictly correct because radar is not a (0,0))
                # TODO: calculate actual radar sensor position
                if np.dot(row - np.array([W / 2, H / 2]), v_2d) > 0:
                    color = (255, 110, 199)
                cv2.arrowedLine(self.data, (cx, cy), (cx2, cy2), color, thickness=1, line_type=cv2.LINE_AA)
Render radar point cloud in BEV perspective.

        Parameters
        ----------
        radar_point_cloud: numpy array with shape (N, 3)
            point cloud in rectangular coordinates of sensor frame

        extrinsics: Pose, default: Identity pose
            The pose of the pointcloud sensor wrt the body frame (Sensor frame -> (Vehicle) Body frame).

        color: Tuple[int]
            Color in RGB to render the points.

        velocity: numpy array with shape (N,3), default None
            velocity vector of points

        velocity_scale: float
            factor to scale velocity vector by
        
tridet/visualizers/bev.py