4. 场景与地图:加载不同地图、设置天气、获取地图信息、生成行人
好,咱们进入第四讲。这一章的内容,说白了就是让CARLA的世界活起来。你想想看,一辆车在空荡荡的街道上跑,那多没意思。真实世界里,有晴天、有雨天、有行人、有各种路况。这一章,我们就来搞定这些。
4.1 加载不同地图
CARLA自带了好几个地图,每个地图的复杂度、场景都不一样。我个人习惯,刚开始学习时用Town01或Town03,路况简单,不容易撞车。等你要做复杂测试了,再上Town05或Town06。
import carla
# 连接到客户端
client = carla.Client('localhost', 2000)
client.set_timeout(10.0)
# 获取世界对象
world = client.get_world()
# 加载指定地图
world = client.load_world('Town03')
print(f"当前地图: {world.get_map().name}")
# 或者用相对路径加载自定义地图
# world = client.load_world('/Game/Carla/Maps/Town05')
这里有个坑,我曾经遇到过:如果你在仿真运行中频繁切换地图,内存会慢慢涨上去。我的建议是,每次切换前,主动调用一下垃圾回收,或者干脆重启客户端。嗯,这个经验是用一次崩机换来的。
4.2 设置天气
天气系统是CARLA的一大亮点。你可以设置晴天、阴天、雨天、雾天,甚至沙尘暴。说白了,就是调几个参数的事。
# 获取当前天气
weather = world.get_weather()
# 创建一个新的天气参数
weather_params = carla.WeatherParameters(
cloudiness=80.0, # 云量 0-100
precipitation=30.0, # 降水量 0-100
precipitation_deposits=30.0, # 积水程度
wind_intensity=10.0, # 风速
sun_altitude_angle=45.0, # 太阳高度角
fog_density=10.0, # 雾浓度
fog_distance=50.0, # 雾可见距离
wetness=30.0 # 路面湿润程度
)
# 应用天气
world.set_weather(weather_params)
print("天气已设置为:多云转小雨")
world.get_weather() 先看看当前天气参数,然后只修改你想改的那几个。比如只改 sun_altitude_angle 就能模拟一天中不同时间的光照。
为什么我要强调天气?因为自动驾驶的感知算法,在雨天和晴天的表现天差地别。我在做项目时,就遇到过激光雷达在雨天的点云数据全是噪点的情况。所以,测试时一定要覆盖不同天气。
4.3 获取地图信息
地图信息是仿真的基础。你需要知道路在哪里、车道怎么走、红绿灯在什么位置。CARLA提供了很丰富的API来获取这些。
# 获取地图对象
carla_map = world.get_map()
# 获取所有生成点
spawn_points = carla_map.get_spawn_points()
print(f"共有 {len(spawn_points)} 个生成点")
# 获取地图中的车道信息
waypoints = carla_map.generate_waypoints(2.0) # 每隔2米一个路径点
print(f"生成了 {len(waypoints)} 个路径点")
# 获取地图中的红绿灯
actors = world.get_actors()
traffic_lights = actors.filter('traffic.traffic_light')
print(f"共有 {len(traffic_lights)} 个红绿灯")
# 获取地图边界
map_bbox = carla_map.get_bbox()
print(f"地图边界: {map_bbox}")
generate_waypoints() 生成的路径点默认只包含车道中心线。如果你需要所有车道的路径点,需要额外处理。我曾经因为这个疏忽,导致车辆一直往逆行道上跑,排查了半天才发现是路径点没取对。
你想想看,有了这些信息,你就能做很多事情了。比如规划一条从A点到B点的路线,或者检测车辆是否偏离了车道。
4.4 生成行人
行人,是仿真中不可或缺的元素。没有行人的街道,那叫测试场,不叫城市。CARLA里生成行人,比生成车辆稍微复杂一点,因为行人需要行走的路径。
import random
# 获取行人蓝图
blueprint_library = world.get_blueprint_library()
pedestrian_bp = random.choice(blueprint_library.filter('walker.pedestrian.*'))
# 选择一个生成点
spawn_point = random.choice(spawn_points)
# 生成行人
pedestrian = world.try_spawn_actor(pedestrian_bp, spawn_point)
if pedestrian:
print(f"行人已生成,ID: {pedestrian.id}")
# 让行人行走
# 需要行人控制器
walker_controller_bp = blueprint_library.find('controller.ai.walker')
controller = world.spawn_actor(walker_controller_bp, carla.Transform(), pedestrian)
# 设置行人行走目标
controller.start()
destination = random.choice(spawn_points).location
controller.go_to_location(destination)
controller.set_max_speed(1.5) # 设置行走速度 m/s
print(f"行人正在走向: {destination}")
else:
print("行人生成失败,可能是生成点被占用")
嗯,这里要注意一点:行人控制器需要持续运行。如果你在代码里只调用了一次 go_to_location(),行人走到目标点后就会停下来。所以,我通常会在仿真循环里,定期给行人更新目标点。
知识体系总览
下面这张图,是我自己梳理的本章知识结构。你可以把它当作一个思维导图来看。
这张图把本章的四个核心内容串在了一起。你从左上角开始,顺时针看下来,就是完整的操作流程:先选地图,再调天气,然后摸清地图底细,最后把人放进去跑。
好了,这一章的内容就到这里。记住,场景管理是仿真的基石。你把地图、天气、行人这些基础打牢了,后面的传感器、车辆控制才能玩得转。去试试吧,把Town01到Town05都加载一遍,看看每个地图长什么样。
1. 加载Town05地图
2. 设置成雨天+大雾天气
3. 在地图的不同区域生成10个行人
4. 让每个行人随机走向不同的目标点
可可精品资料库