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秒,稳一点。
获取世界对象:拿到控制权
连接成功后,下一步就是获取「世界对象」。这个对象可厉害了,它代表整个仿真环境——所有车辆、行人、建筑、传感器,全归它管。
# 获取当前激活的世界
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}")
知识体系总览
这一章的内容,说白了就是下面这张图的关系:
完整示例:把今天学的串起来
最后,我给你一个完整的脚本。它把今天讲的所有知识点串在了一起:
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窗口里的变化。亲眼看到天气从晴天变成暴雨,那种感觉比看代码直观多了。
嗯,这一章的内容就到这。你学会了怎么连服务器、怎么拿世界、怎么调天气、怎么看地图。这些都是最基础但最常用的操作。下一章,我们会在这些基础上,开始往世界里放车、放人,让仿真真正动起来。
可可精品资料库