Carla学习(九)世界坐标和相机坐标变换——过滤视野内目标

本文介绍如何使用Carla模拟器进行3D及2D物体目标检测,并通过坐标变换判断目标是否位于相机视野范围内。包括从世界坐标到图片坐标的转换方法,以及判断目标是否可见的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

出于两种原因,有时候需要知道哪些车辆或行人在相机的视野范围内/不在视野范围内

  • 利用Carla制作数据集时,不管是3D物体目标检测还是2D物体目标检测,我们都需要图片训练集。例如相机图片和图片内车辆或行人的ground truth(2d bbox, 3d bbox)。
  • 可视化呈现。例如在V2V通信场景下,车辆之间是有通信的,那么可以将这种通信关系在相机图片上绘制出来,表达更直观。

上述两个例子我们都需要知道目标物体(车、人)是否在相机的视野范围内,例如生成车辆的3d bbox,只有在视野范围内的车辆才生成ground truth。
在这里插入图片描述
如何判断一个目标是否在视野范围内呢?只需要知道三个量:目标物体的世界坐标、相机外参数矩阵和相机内参数矩阵。
利用坐标变换,可以将目标物体的世界坐标转换为图片的二维坐标,具体步骤如下:

  • carla中获取目标的世界坐标:actor.get_transform().location
  • 相机外参数矩阵:camera.get_transform().get_matrix()
  • 相机内参数矩阵:
k = np.identity(3)
k[0, 2] = WINDOW_WIDTH_HALF
k[1, 2] = WINDOW_HEIGHT_HALF
f = WINDOW_WIDTH / (2.0 * math.tan(90.0 * math.pi / 360.0))
k[0, 0] = k[1, 1] = f
  1. 利用相机外参矩阵求出目标在相机坐标系下的三维坐标:
def proj_to_camera(pos_vector, extrinsic_mat):
    # transform the points to camera
    transformed_3d_pos = np.dot(inv(extrinsic_mat), pos_vector)
    return transformed_3d_pos
  1. 利用相机内参矩阵求将相机的三维坐标转换为图片内的二维坐标:
def proj_to_2d(camera_pos_vector, intrinsic_mat):
    # transform the points to 2D
    cords_x_y_z = camera_pos_vector[:3, :]
    cords_y_minus_z_x = np.concatenate([cords_x_y_z[1, :], -cords_x_y_z[2, :], cords_x_y_z[0, :]])
    pos2d = np.dot(intrinsic_mat, cords_y_minus_z_x)
    # normalize the 2D points
    pos2d = np.array([
        pos2d[0] / pos2d[2],
        pos2d[1] / pos2d[2],
        pos2d[2]
    ])
    return pos2d
  1. 判断车辆是否在相机视野内:
def point_in_top_view(pos):
    """Return true if point is in top view"""
    if (pos[0] > 0) and (pos[0] < DISPLAY_HEIGHT) and (pos[1] > 0) and (pos[1] < DISPLAY_WIDTH):
        return True
    return False

这里这是目标的中心点,求3d bbox也是同样的方法,只不过是将八个点都转换一下。
另外,注意一点,在制作3d box 的ground truth时,不能光判断box的点是否在图像内,还要判断点是否被遮挡,这个可以以用carla的depth camera来辅助完成。

这篇博客是对前面有些没说清的地方的总结,具体代码可以参考:github

Carla的其他一些信息可以参考我之前写的博客

<think>好的,我现在需要回答用户关于Carla模拟器中世界坐标系定义使用教程的问题。首先,我需要回忆一下Carla的相关知识,尤其是坐标系的部分。根据用户提供的引用,特别是引用[3]提到的传感器坐标系中的pitch、yaw、roll对应不同的旋转轴,这可能世界坐标系有关联,但需要进一步确认。 首先,Carla世界坐标系应该是一个全局的坐标系,用于整个模拟环境中的物体定位。通常,在3D引擎如Unreal Engine中,世界坐标系可能采用左手或右手坐标系,需要查证Carla的具体定义。根据我的了解,Carla使用Unreal Engine,而Unreal Engine默认使用左手坐标系,其中X轴向前,Y轴向右,Z轴向上。不过,是否有特殊情况呢?比如某些仿真工具可能会调整坐标轴的方向,需要确认。 接下来,用户提到的引用[2]中提到了将世界坐标转换到相机坐标系的过程,这涉及到转换矩阵的应用。世界坐标系到相机坐标系的转换通常涉及平移旋转,这可能与传感器的位置方向有关。但用户的问题主要集中在世界坐标系本身,所以需要明确世界坐标系的定义,包括原点位置、坐标轴方向以及单位。 然后,引用[3]中的传感器坐标系提到了旋转顺序,可能影响物体在世界坐标系中的表示。例如,当车辆或传感器被放置在世界中时,它们的姿态(位置旋转)会基于世界坐标系来确定。因此,理解世界坐标系的定义对于正确使用Carla的API至关重要。 现在,我需要组织这些信息,确保回答的结构清晰,符合用户的要求:定义、使用教程、坐标转换方法、注意事项以及相关问题。同时,要正确应用引用到相关内容中,例如在讲解坐标转换时引用[2],在讨论旋转时引用[3]。 此外,用户提供的引用[1]提到Carla是基于Unreal Engine的,所以可能需要指出世界坐标系与Unreal Engine的坐标系一致。例如,Unreal Engine中的坐标系通常是X轴向前(前进方向),Y轴向右,Z轴向上,原点位于地图的某个固定点,可能在场景的中心或某个角落,具体取决于地图设计。但在Carla中,是否所有地图的世界坐标系原点都相同?或者每个地图有自己的原点?需要确认这一点,可能通过官方文档或实践经验。 关于使用教程部分,可能需要说明如何通过Python API获取设置物体在世界坐标系中的位置旋转。例如,使用actor.get_transform()来获取车辆的位置旋转,这些值都是相对于世界坐标系的。同时,在生成车辆或其他actor时,需要指定世界坐标系中的坐标。 在坐标转换方法中,引用[2]提到了使用矩阵乘法将世界坐标转换为相机坐标,这涉及到世界坐标系到相机坐标系的转换矩阵(w2c)。因此,在Carla中处理传感器数据时,经常需要进行这样的坐标转换,此时世界坐标系的正确理解是关键。 注意事项方面,需要提醒用户单位的问题(Carla中使用米作为单位),以及旋转顺序(roll、pitch、yaw对应的轴),可能引用[3]中的内容,指出旋转顺序的不同可能会影响结果。 最后,生成相关问题,比如如何获取物体在世界坐标系中的坐标,如何处理不同坐标系之间的转换,以及如何利用世界坐标系进行路径规划等。这些问题应该与用户可能进一步探索的方向相关,并且基于已有的引用内容。 在整理这些思路时,需要确保回答准确,符合Carla的实际实现,并正确引用提供的资料。同时,语言要使用中文,行内公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,但如果有坐标转换的矩阵,可能需要用LaTeX表示,例如转换矩阵的乘法步骤。 总结一下,回答的结构大致如下: 1. 世界坐标系的定义:坐标轴方向、原点、单位。 2. 使用教程:通过API获取设置位置、旋转。 3. 坐标转换方法:举例世界到相机的转换,引用[2]。 4. 注意事项:单位、旋转顺序(引用[3])。 5. 相关问题:如获取坐标、转换方法、应用场景等。 需要确保每个部分的信息准确无误,必要时参考官方文档或可靠资料,但用户提供的引用已经给出了一些关键点,可以依赖这些引用进行回答。</think>### Carla模拟器中世界坐标系的定义与使用教程 #### 一、世界坐标系的定义 在Carla中,**世界坐标系**是全局的3D坐标系,用于描述所有物体(如车辆、行人、传感器)的位置姿态[^1]。其定义基于Unreal Engine的坐标系规则: - **坐标轴方向**:采用**左手坐标系**,具体为: - **X轴**:正方向指向场景的前方(默认车辆前进方向) - **Y轴**:正方向指向右侧 - **Z轴**:正方向指向上方 - **原点**:位于地图的几何中心或设计时定义的初始点。 - **单位**:使用**米(m)**作为距离单位,角度单位为度(°)。 #### 二、世界坐标系的使用教程 1. **获取物体的世界坐标** 通过Python API获取车辆或传感器的位置旋转: ```python # 获取车辆的世界坐标 vehicle = world.spawn_actor(blueprint, transform) transform = vehicle.get_transform() location = transform.location # (x, y, z) 单位:米 rotation = transform.rotation # (pitch, yaw, roll) 单位:度 ``` 2. **设置物体的初始位置** 生成物体时需指定世界坐标系中的坐标: ```python from carla import Transform, Location, Rotation # 定义坐标 (x=10, y=3.5, z=0.5) 旋转 (pitch=0, yaw=90, roll=0) spawn_point = Transform(Location(10, 3.5, 0.5), Rotation(pitch=0, yaw=90, roll=0)) vehicle = world.spawn_actor(blueprint, spawn_point) ``` 3. **坐标转换示例** 将世界坐标转换为相机坐标系(需使用转换矩阵)[^2]: ```python # 获取相机世界坐标相机坐标的转换矩阵 matrix = camera.get_transform().get_matrix() world_to_camera = np.array(matrix).reshape(4, 4) # 将世界坐标点转换到相机坐标系 point_world = [x, y, z, 1] # 齐次坐标 point_camera = np.dot(world_to_camera, point_world) ``` #### 三、注意事项 1. **旋转顺序** 物体的旋转按`(pitch, yaw, roll)`定义,分别对应绕Y轴、Z轴、X轴的旋转[^3]。例如: - `pitch=30`:绕Y轴旋转30度(抬头) - `yaw=90`:绕Z轴旋转90度(右转) 2. **单位一致性** 所有坐标距离计算均以米为单位,需避免与像素单位混淆(如相机图像坐标系)。 3. **地图差异** 不同地图的世界坐标系原点可能不同,需通过`world.get_map().get_spawn_points()`获取合法生成点。 ####
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值