def create_bbox_from_carla(bbox, vehicle_transform, lidar_transform):
"""
특정 차량의 BoundingBox를 현재 Ego LiDAR 좌표계 기준으로 변환
"""
# 1. 차량 bbox center (world 기준)
bbox_world_center = vehicle_transform.transform(bbox.location)
bbox_center_world = np.array([
bbox_world_center.x,
bbox_world_center.y,
bbox_world_center.z,
1.0
])
# 2. 차량 회전행렬 (CARLA → Open3D 우수)
R_vehicle = convert_carla_rotation_to_open3d(vehicle_transform.rotation) # (3x3)
# 3. World → LiDAR 변환 행렬
T_world_to_lidar = np.linalg.inv(np.array(lidar_transform.get_matrix())) # (4x4)
# 4. bbox center 변환
bbox_center_lidar_h = T_world_to_lidar @ bbox_center_world
bbox_center_lidar = bbox_center_lidar_h[:3]
# 5. 차량 회전행렬도 LiDAR 기준으로
R_lidar = T_world_to_lidar[:3, :3] @ R_vehicle
# 6. 좌수 → 우수 변환 (X축 플립)
bbox_center_lidar[0] *= -1
R_lidar[:, 1] *= -1
# 7. Left-handed 행렬 보정 (det < 0 이면 Y축 추가 플립)
if np.linalg.det(R_lidar) < 0:
R_lidar[:, 1] *= -1
# 8. BoundingBox 크기
extent = bbox.extent
bbox_extent = np.array([extent.x * 2, extent.y * 2, extent.z * 2])
# 9. Open3D OBB 생성
obb = o3d.geometry.OrientedBoundingBox(center=bbox_center_lidar,
R=R_lidar,
extent=bbox_extent)
return obb