自动驾驶—CARLA仿真(3) 坐标和坐标变换

官方文档

全局坐标系

CARLA 基于 Unreal Engine 4.26 构建,采用与之相同的左手坐标系 。更多关于 Unreal Engine 坐标系的细节,请参阅 Unreal Engine 官方文档

对于站在原点、面朝 X 轴正方向 的观察者,坐标轴关系如下:

  • Z 轴:向上(Up)
  • X 轴:向前(Forward)
  • Y 轴:向右(Right)

在整个 CARLA API 中,距离单位为米(meters)角度单位为度(degrees)。因此,当 CARLA 与其他使用右手坐标系、弧度制角度、厘米或英制单位的应用程序交互时,必须进行相应的单位转换。


参与者(Actor)坐标系

车辆、行人等参与者(Actors)拥有各自的局部坐标系,用于维护传感器位置等局部一致的坐标关系。

按照惯例,CARLA 中的车辆坐标系定义如下:

  • 车头指向 X 轴正方向
  • 车辆右侧指向 Y 轴正方向
  • 车顶指向 Z 轴正方向
  • 坐标原点通常位于车辆包围盒在 X、Y 方向的中心附近,Z 方向则非常接近包围盒的最低面。

CARLA 行人的坐标系类似设定:

  • 面朝 X 轴正方向
  • 右臂指向 Y 轴正方向
  • 头部朝向 Z 轴正方向
  • 坐标原点通常位于静止姿态下包围盒的中心。

通过 CARLA API 处理坐标

CARLA API 提供了多个工具类,用于处理坐标及坐标变换。

Location(位置)

Location 对象用于定义坐标,并在变换、生成或移动对象时使用。

以下代码展示了如何创建一个表示 X=10m, Y=10m, Z=1m 的位置对象:

python 复制代码
# 使用位置参数的默认构造函数
location = carla.Location(10, 10, 1)

# 使用关键字参数
location = carla.Location(x=10, y=10, z=1)

# 无参数构造(默认原点)
location = carla.Location()  # x=y=z=0

可省略任意或全部关键字参数,未指定的轴将被设为 0。


Rotation(旋转)

Rotation 对象用于定义 CARLA 坐标系中的旋转。旋转以欧拉角(Euler angles) 形式表示,包含 roll(滚转)、pitch(俯仰)、yaw(偏航) ,单位为度(degrees)

旋转按 yaw → pitch → roll 的顺序内旋(intrinsic rotation) 应用。

以下代码创建一个 roll=10°, pitch=10°, yaw=90° 的旋转对象:

python 复制代码
# 使用位置参数(顺序:pitch, yaw, roll)
rotation = carla.Rotation(10, 90, 10)

# 使用关键字参数
rotation = carla.Rotation(pitch=10, yaw=90, roll=10)

# 无参数构造(默认无旋转)
rotation = carla.Rotation()  # pitch=yaw=roll=0

可省略任意或全部关键字参数,未指定的角度将被设为 0。


Transform(变换)

Transform 对象用于完整描述一个物体的位姿(pose),包含其 3D 位置和旋转。

可通过 LocationRotation 创建 Transform

python 复制代码
# 定义位置和旋转
location = carla.Location(10, 10, 1)
rotation = carla.Rotation(yaw=90)

# 创建变换
transform = carla.Transform(location, rotation)

该变换可用于生成参与者(如车辆):

python 复制代码
vehicle = world.spawn_actor(vehicle_bp, transform)

可通过 get_transform() 查询参与者的变换,并访问其位置和旋转属性:

python 复制代码
print(vehicle.get_transform())
print(vehicle.get_transform().location)
print(vehicle.get_transform().rotation)

# 输出示例:
# Transform(Location(x=10, y=10, z=1.0), Rotation(pitch=0.0, yaw=90, roll=0.0))
# Location(x=10, y=10, z=1.0)
# Rotation(pitch=0.0, yaw=90, roll=0.0)

Transform 对象提供实用方法,用于对其他坐标应用变换:

  • transform() :将局部坐标转换为全局坐标

    例如,计算安装在车辆上的传感器在全局坐标系中的位置:

    python 复制代码
    sensor_local_coord = carla.Location(1, 0, 0)        # 传感器在车体坐标系中的位置
    vehicle_transform = vehicle.get_transform()
    sensor_global_coord = vehicle_transform.transform(sensor_local_coord)
    
    # 输出:Vector3D(x=10.0, y=11.0, z=1.0)
  • inverse_transform() :将全局坐标转换为局部坐标

    例如,将世界中某物体的位置转换到车辆的局部坐标系(常用于自动驾驶感知系统):

    python 复制代码
    location = carla.Location(1, 0, 0)                  # 全局坐标
    vehicle_transform = vehicle.get_transform()
    transformed_location = vehicle_transform.inverse_transform(location)

地理坐标(Geocoordinates)

地理坐标是大地坐标(geodetic coordinates) ,以 纬度(latitude)、经度(longitude)、海拔(altitude) 表示地球表面位置。

CARLA 地图的 OpenDRIVE 定义文件(.xodr)可在元数据中包含地理参考(georeference) 。OpenDRIVE 标准中地理参考的详细信息请参阅相关文档

在 OpenDRIVE 文件中,地理参考信息位于 <header> 标签内:

xml 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<OpenDRIVE>
    <header ...>
        <geoReference><![CDATA[+proj=tmerc +lat_0=0 +lon_0=0 +k=1 +x_0=0 +y_0=0 +ellps=WGS84]]></geoReference>
        ...
    </header>
    ...
</OpenDRIVE>

CARLA 的 Map 对象利用此地理参考信息,通过地图投影实现 CARLA 世界坐标 ↔ 地理坐标 的相互转换。geoReference 中的参数定义了所用投影类型及 CARLA 地图中心(X=Y=Z=0 点)对应的地理坐标。

将 CARLA 坐标转换为地理坐标:
python 复制代码
carla_map = world.get_map()
location = carla.Location(0, 0, 0)
print(carla_map.transform_to_geolocation(location))

# 输出示例:
# GeoLocation(latitude=0.000099, longitude=0.000090, altitude=1.000000)
将地理坐标转换为 CARLA 坐标:
python 复制代码
geolocation = carla.GeoLocation(latitude=0.000099, longitude=0.000090, altitude=1.000000)
carla_map = world.get_map()
print(carla_map.geolocation_to_transform(geolocation))

# 输出示例:
# Location(x=10.014747, y=11.016221, z=1.000000)
相关推荐
生成论实验室19 小时前
生成论之基:“阴阳”作为元规则的重构与证成——基于《易经》与《道德经》的古典重诠与现代显象
人工智能·科技·神经网络·算法·架构
数据分享者19 小时前
对话对齐反馈数据集:12000+高质量人类-助手多轮对话用于RLHF模型训练与评估-人工智能-大语言模型对齐-人类反馈强化学习-训练符合人类期望的对话模型
人工智能·语言模型·自然语言处理
Java后端的Ai之路19 小时前
【人工智能领域】- 卷积神经网络(CNN)深度解析
人工智能·神经网络·cnn
_清欢l19 小时前
Dify+test2data实现自然语言查询数据库
数据库·人工智能·openai
咕噜签名-铁蛋19 小时前
云服务器GPU:释放AI时代的算力引擎
运维·服务器·人工智能
Niuguangshuo19 小时前
变分推断:用简单分布逼近复杂世界的艺术
人工智能·机器学习
enjoy编程19 小时前
Spring-AI 大模型未来:从“学会世界”到“进入世界”的范式跃迁
人工智能·领域大模型·替换工种·中后训练·长尾场景
沛沛老爹19 小时前
深入理解Agent Skills——AI助手的“专业工具箱“实战入门
java·人工智能·交互·rag·企业开发·web转型ai
俊哥V19 小时前
AI一周事件(2026年01月01日-01月06日)
人工智能·ai
向量引擎19 小时前
【万字硬核】解密GPT-5.2-Pro与Sora2底层架构:从Transformer到世界模型,手撸一个高并发AI中台(附Python源码+压测报告)
人工智能·gpt·ai·aigc·ai编程·ai写作·api调用