def create_bbox_from_actor(actor, lidar_transform, ego_transform, is_ego=False):
bbox = actor.bounding_box
vehicle_tf = actor.get_transform()
# 1. World → LiDAR 변환 행렬
world2lidar = np.linalg.inv(np.array(lidar_transform.get_matrix()))
# 2. 바운딩 박스 중심 (World 기준)
bbox_world = vehicle_tf.transform(bbox.location)
bbox_center_world = np.array([bbox_world.x, bbox_world.y, bbox_world.z, 1.0])
# 3. World → LiDAR로 변환 (X축 반전 적용)
bbox_center_lidar_h = world2lidar @ bbox_center_world
bbox_center_lidar = bbox_center_lidar_h[:3]
bbox_center_lidar[0] *= -1 # X축 반전: LiDAR X축이 후방을 가리킴을 보정
# 4. 차량 회전 행렬 (CARLA → Open3D)
R_vehicle = convert_carla_rotation_to_open3d(vehicle_tf.rotation)
if is_ego:
bbox_center_lidar = np.array([0.0, 0.0, 0.0])
R_lidar = np.eye(3)
else:
ego_yaw_rad = np.radians(ego_transform.rotation.yaw)
vehicle_yaw_rad = np.radians(vehicle_tf.rotation.yaw)
correction_rad = ego_yaw_rad - vehicle_yaw_rad
if abs(correction_rad) > np.pi:
correction_rad = np.arctan2(np.sin(correction_rad), np.cos(correction_rad)) # 최단 경로 보정
correction_R = R.from_euler('z', correction_rad).as_matrix()
R_lidar = world2lidar[:3, :3] @ R_vehicle @ correction_R
if np.linalg.det(R_lidar) < 0:
R_lidar[:, 1] *= -1
yaw_deg = np.degrees(np.arctan2(R_lidar[1, 0], R_lidar[0, 0]))
print(f"Vehicle Yaw (LiDAR): {yaw_deg}")
print(f"R_lidar Matrix:\n{R_lidar}")
extent = bbox.extent
bbox_extent = np.array([extent.x * 2, extent.y * 2, extent.z * 2])
obb = o3d.geometry.OrientedBoundingBox(
center=bbox_center_lidar,
R=R_lidar,
extent=bbox_extent
)
return obb
첫댓글 2번째 그림은 잘 안맞는데
file:///C:/Users/224_PC8/Downloads/26_ROS2_%EB%9D%BC%EC%9D%B4%EB%8B%A4_250603.pdf