| from typing import Type |
|
|
| import numpy as np |
|
|
| import utils.transform as box_transform |
| import utils.rotation as object_rotation |
|
|
|
|
| class Box3D: |
| def __init__( |
| self, |
| x=None, |
| y=None, |
| z=None, |
| h=None, |
| w=None, |
| l=None, |
| pitch=None, |
| yaw=None, |
| roll=None, |
| s=None, |
| ): |
| self.x = x |
| self.y = y |
| self.z = z |
| self.h = h |
| self.w = w |
| self.l = l |
| self.pitch = pitch |
| self.yaw = yaw |
| self.roll = roll |
| self.s = s |
| self.corners_3d_cam = None |
|
|
| def __str__(self): |
| return "x: {}, y: {}, z: {}, heading: {}, length: {}, width: {}, height: {}, score: {}".format( |
| self.x, self.y, self.z, self.yaw, self.l, self.w, self.h, self.s |
| ) |
|
|
| @classmethod |
| def bbox2dict(cls, bbox): |
| return { |
| "center_x": bbox.x, |
| "center_y": bbox.y, |
| "center_z": bbox.z, |
| "height": bbox.h, |
| "width": bbox.w, |
| "length": bbox.l, |
| "yaw": bbox.yaw, |
| } |
|
|
| @classmethod |
| def bbox2array(cls, bbox): |
| if bbox.s is None: |
| return np.array([bbox.x, bbox.y, bbox.z, bbox.yaw, bbox.l, bbox.w, bbox.h]) |
| else: |
| return np.array( |
| [bbox.x, bbox.y, bbox.z, bbox.yaw, bbox.l, bbox.w, bbox.h, bbox.s] |
| ) |
|
|
| @classmethod |
| def bbox2array_raw(cls, bbox): |
| if bbox.s is None: |
| return np.array([bbox.h, bbox.w, bbox.l, bbox.x, bbox.y, bbox.z, bbox.yaw]) |
| else: |
| return np.array( |
| [bbox.h, bbox.w, bbox.l, bbox.x, bbox.y, bbox.z, bbox.yaw, bbox.s] |
| ) |
|
|
| @classmethod |
| def array2bbox_xyzlwhyaw(cls, data): |
| |
|
|
| bbox = Box3D() |
| bbox.x, bbox.y, bbox.z, bbox.l, bbox.w, bbox.h, bbox.yaw = data[:7] |
| if len(data) == 8: |
| bbox.s = data[-1] |
| return bbox |
|
|
| @classmethod |
| def array2bbox_raw(cls, data): |
| |
|
|
| bbox = Box3D() |
| bbox.h, bbox.w, bbox.l, bbox.x, bbox.y, bbox.z, bbox.yaw = data[:7] |
| if len(data) == 8: |
| bbox.s = data[-1] |
| return bbox |
|
|
| @classmethod |
| def array2bbox(cls, data): |
| |
|
|
| bbox = Box3D() |
| bbox.x, bbox.y, bbox.z, bbox.yaw, bbox.l, bbox.w, bbox.h = data[:7] |
| if len(data) == 8: |
| bbox.s = data[-1] |
| return bbox |
|
|
| @classmethod |
| def array2bbox_9dof( |
| cls, location: np.ndarray, rotation: np.ndarray, size: np.ndarray |
| ): |
| |
|
|
| bbox = Box3D() |
| bbox.x, bbox.y, bbox.z = location |
| bbox.pitch, bbox.ry, bbox.roll = rotation |
| bbox.l, bbox.w, bbox.h = size |
|
|
| |
| bbox.corners_3d_cam: np.ndarray = box_transform.get_box_in_world( |
| location, rotation, size |
| ) |
|
|
| return bbox |
|
|
| @classmethod |
| def box2corners3d_lidar(cls, bbox): |
| """Convert the box to the 8 corners in the lidar coordinate |
| |
| Note that carla lidar coordinate is |
| +x -> left |
| +y -> front |
| +z -> up |
| 4 -------- 5 |
| /| /| |
| 7 -------- 6 . |
| | | | | |
| . 0 -------- 1 |
| |/ |/ |
| 3 -------- 2 |
| """ |
|
|
| |
| size = np.array([bbox.l, bbox.w, bbox.h]) |
| box3d: np.ndarray = box_transform.create_bb_points(size) |
| |
| |
|
|
| |
| R: np.ndarray = object_rotation.rotz(bbox.yaw) |
| |
| box3d = np.dot(R, box3d[:, :3].transpose()) |
|
|
| |
| box3d[0, :] = box3d[0, :] + bbox.x |
| box3d[1, :] = box3d[1, :] + bbox.y |
| box3d[2, :] = box3d[2, :] + bbox.z |
|
|
| |
| box3d = box3d.transpose() |
| box3d = np.concatenate((box3d, np.ones((8, 1))), axis=1) |
|
|
| return box3d |
|
|
| |
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
| |
|
|
| |
| |
|
|
| |
| |
| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
|
|
| |
|
|