Python API基础:连接客户端、获取世界对象、设置天气、获取地图信息

好,咱们正式开始动手了。

上一章我们把CARLA环境搭好了,也跑通了那个「你好世界」的小例子。现在,我要带你深入看看CARLA的Python API到底怎么玩。说白了,这一章就是教你「怎么跟CARLA服务器打招呼,怎么拿到控制权,怎么给这个世界换皮肤,再看看这个世界长什么样」。

我个人习惯,每次写新脚本前,都会先确认三件事:连得上吗?世界拿到了吗?地图加载了吗?这三步走通了,后面的事才谈得上。

连接客户端:跟CARLA服务器握手

CARLA采用客户端-服务器架构。你的Python脚本是客户端,CARLA程序是服务器。两者通过本地网络通信。

连接代码其实就一行:

import carla

# 创建客户端,连接到本地主机的2000端口
client = carla.Client('localhost', 2000)

# 设置超时时间(秒),我一般设10秒
client.set_timeout(10.0)

# 测试连接是否成功
print(client.get_client_version())

这里有个坑,我曾经踩过:超时时间设太短。如果你电脑性能一般,或者CARLA刚启动还没完全加载好,5秒超时很容易失败。我建议至少设10秒,稳一点。

注意:端口2000是CARLA默认端口。如果你同时开了多个CARLA实例,记得改端口号,不然会冲突。

获取世界对象:拿到控制权

连接成功后,下一步就是获取「世界对象」。这个对象可厉害了,它代表整个仿真环境——所有车辆、行人、建筑、传感器,全归它管。

# 获取当前激活的世界
world = client.get_world()

# 或者,如果你想加载特定地图
# world = client.load_world('Town01')

print(f"当前世界: {world.get_map().name}")

你想想看,world这个对象就像个「大管家」。你想添加车辆?找它。你想改变天气?找它。你想知道路况?还是找它。

我记得刚开始做项目时,总搞不清client和world的区别。其实很简单:client是「门卫」,负责帮你连上服务器;world是「管家」,负责管理仿真环境里的一切。

设置天气:给世界换皮肤

天气系统是CARLA的一大亮点。你可以让场景从晴空万里变成暴雨倾盆,从白天变成黑夜。这对测试自动驾驶算法在不同环境下的表现,太重要了。

设置天气有两种方式:

方式一:使用预设天气

# 获取所有可用的天气预设
weather_presets = [
    carla.WeatherParameters.ClearNoon,      # 晴天正午
    carla.WeatherParameters.CloudyNoon,     # 多云正午
    carla.WeatherParameters.WetNoon,        # 雨后正午
    carla.WeatherParameters.WetCloudyNoon,  # 雨后多云正午
    carla.WeatherParameters.MidRainyNoon,   # 中雨正午
    carla.WeatherParameters.HardRainNoon,   # 大雨正午
    carla.WeatherParameters.SoftRainNoon,   # 小雨正午
]

# 应用预设天气
world.set_weather(carla.WeatherParameters.ClearNoon)
print("天气已设置为:晴天正午")

方式二:自定义天气参数

预设天气不够用?那就自己调参数。每个参数都有明确的物理意义:

# 自定义天气:黄昏+薄雾+小雨
custom_weather = carla.WeatherParameters(
    cloudiness=30.0,        # 云量 0-100
    precipitation=20.0,     # 降水量 0-100
    precipitation_deposits=30.0,  # 路面积水 0-100
    wind_intensity=10.0,    # 风速 0-100
    sun_azimuth_angle=270.0, # 太阳方位角
    sun_altitude_angle=15.0, # 太阳高度角(低角度=黄昏)
    fog_density=20.0,       # 雾浓度 0-100
    fog_distance=50.0,      # 雾的可见距离
    wetness=30.0            # 路面湿润度 0-100
)

world.set_weather(custom_weather)
print("自定义天气已应用")
小技巧:我常用sun_altitude_angle来模拟不同时间段。0度以下就是黑夜,15度左右是黄昏/黎明,60度以上是正午。做感知算法测试时,这个参数特别有用。

获取地图信息:看看这个世界长什么样

拿到世界对象后,下一步就是搞清楚「我在哪」。地图信息包含道路、车道、路口、红绿灯等所有静态元素。

# 获取地图对象
map_data = world.get_map()

# 获取地图名称
print(f"地图名称: {map_data.name}")

# 获取所有生成点(用于放置车辆)
spawn_points = map_data.get_spawn_points()
print(f"共有 {len(spawn_points)} 个生成点")

# 查看第一个生成点的位置
first_point = spawn_points[0]
print(f"第一个生成点位置: x={first_point.location.x:.2f}, y={first_point.location.y:.2f}, z={first_point.location.z:.2f}")

地图信息里,最常用的是生成点和道路拓扑。生成点决定了你的车从哪开始跑,道路拓扑决定了车能往哪开。

获取道路信息

# 获取所有道路段
waypoints = map_data.generate_waypoints(2.0)  # 2.0米间隔
print(f"共有 {len(waypoints)} 个路径点")

# 查看第一个路径点的详细信息
first_wp = waypoints[0]
print(f"车道ID: {first_wp.lane_id}")
print(f"道路ID: {first_wp.road_id}")
print(f"车道宽度: {first_wp.lane_width:.2f}米")
print(f"是否在路口: {first_wp.is_junction}")
核心理解:路径点(Waypoint)是CARLA里最基础的概念之一。它包含了位置、朝向、车道信息。你可以把它想象成「地图上的一个坐标点,附带了这个点的所有交通规则」。

知识体系总览

这一章的内容,说白了就是下面这张图的关系:

Python API 基础:核心对象关系图 carla.Client 连接服务器、加载地图 get_world() carla.World 管理仿真环境 set_weather() WeatherParameters 云量、降水、雾、光照 get_map() carla.Map 道路、车道、生成点 generate_waypoints() carla.Waypoint 位置、朝向、车道信息 核心流程:Client → World → Map/Weather → Waypoint 每个箭头代表一个API调用,箭头方向就是数据流向

完整示例:把今天学的串起来

最后,我给你一个完整的脚本。它把今天讲的所有知识点串在了一起:

import carla
import time

def main():
    # 1. 连接客户端
    client = carla.Client('localhost', 2000)
    client.set_timeout(10.0)
    print(f"客户端版本: {client.get_client_version()}")
    
    # 2. 获取世界对象
    world = client.get_world()
    print(f"当前地图: {world.get_map().name}")
    
    # 3. 设置天气为晴天正午
    world.set_weather(carla.WeatherParameters.ClearNoon)
    print("天气已设置为:晴天正午")
    
    # 4. 获取地图信息
    map_data = world.get_map()
    spawn_points = map_data.get_spawn_points()
    print(f"生成点数量: {len(spawn_points)}")
    
    # 5. 获取路径点信息
    waypoints = map_data.generate_waypoints(5.0)
    print(f"路径点数量: {len(waypoints)}")
    
    # 6. 等待3秒,观察效果
    time.sleep(3)
    
    # 7. 切换天气为雨天,看看变化
    world.set_weather(carla.WeatherParameters.HardRainNoon)
    print("天气已切换为:大雨正午")
    
    time.sleep(3)
    print("演示结束")

if __name__ == '__main__':
    main()
我的建议:把这个脚本保存为02_basics.py,然后运行。一边跑一边看CARLA窗口里的变化。亲眼看到天气从晴天变成暴雨,那种感觉比看代码直观多了。

嗯,这一章的内容就到这。你学会了怎么连服务器、怎么拿世界、怎么调天气、怎么看地图。这些都是最基础但最常用的操作。下一章,我们会在这些基础上,开始往世界里放车、放人,让仿真真正动起来。

可可精品资料库