第1章:车辆控制基础

各位同学,欢迎来到 Carla 仿真课程的第一章。今天咱们聊聊最核心的东西——怎么让车动起来。

我记得刚接触 Carla 那会儿,第一件事就是让车跑起来。你想想看,一个仿真环境里车都不动,那还玩什么?所以这一章,我带你从零开始,掌握车辆控制的基本功。

1.1 控制车辆移动

说白了,控制车辆移动就是四个动作:油门、刹车、转向、手刹。在 Carla 里,这些操作都通过 VehicleControl 对象来完成。

核心概念:VehicleControl 是 Carla 提供的车辆控制指令类。你只需要设置它的属性,然后应用到车辆上,车就会按照你的指令行动。

先看一个最简单的例子:

import carla

# 连接服务器
client = carla.Client('localhost', 2000)
world = client.get_world()

# 生成一辆车
blueprint = world.get_blueprint_library().find('vehicle.tesla.model3')
spawn_point = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(blueprint, spawn_point)

# 创建控制指令
control = carla.VehicleControl()
control.throttle = 0.5  # 油门踩到50%
control.steer = 0.0     # 方向盘回正
control.brake = 0.0     # 不刹车
control.hand_brake = False  # 手刹松开

# 应用控制
vehicle.apply_control(control)

这段代码跑起来,车就会缓缓向前。我刚开始做项目时,经常忘记调用 apply_control,结果车纹丝不动,还以为是代码写错了。嗯,这种低级错误,你们可别犯。

1.2 油门、刹车、转向的配合

实际驾驶中,油门和刹车不会同时踩。Carla 里也一样——如果你同时设置 throttle 和 brake 为非零值,系统会优先处理刹车。

属性 取值范围 说明
throttle 0.0 ~ 1.0 油门开度,0 为全松,1 为全踩
brake 0.0 ~ 1.0 刹车力度,0 为不刹,1 为急刹
steer -1.0 ~ 1.0 转向角度,负值左转,正值右转
hand_brake True / False 手刹开关,True 为拉起

举个例子,你想让车右转并减速:

control.throttle = 0.3
control.steer = 0.5   # 向右打半圈
control.brake = 0.2   # 轻点刹车
vehicle.apply_control(control)

个人经验:我建议你在做转向控制时,steer 值不要直接给到 1.0。除非你想看车辆漂移——我在测试自动驾驶算法时,有一次 steer 给大了,车直接原地转圈,数据全废了。一般 0.3~0.5 就够用。

1.3 设置自动驾驶模式

手动控制太累?Carla 提供了内置的自动驾驶功能。你只需要一行代码:

vehicle.set_autopilot(True)

开启后,车辆会沿着道路自动行驶,遵守交通规则,遇到红灯会停。这个功能在测试感知算法时特别有用——你只管让车自己跑,然后采集数据就行。

不过要注意,自动驾驶模式会覆盖你之前设置的 VehicleControl。也就是说,你开了 autopilot 之后,再调用 apply_control 是没用的。必须先关掉:

vehicle.set_autopilot(False)
# 然后再手动控制
vehicle.apply_control(control)

避坑指南:我曾经在调试时,开着 autopilot 又去手动控制,结果车一会听我的,一会听系统的,直接撞上了路边的建筑。所以,切换模式前一定要确认状态。

1.4 获取车辆状态信息

控制车辆只是第一步。你还需要知道车跑得怎么样——速度多少?位置在哪?加速度多大?这些信息都藏在 VehiclePhysicsControlTransform 里。

获取速度:

velocity = vehicle.get_velocity()
# 返回一个 Vector3D 对象,单位是 m/s
speed = (velocity.x**2 + velocity.y**2 + velocity.z**2) ** 0.5
print(f"当前速度:{speed:.2f} m/s")

获取位置:

transform = vehicle.get_transform()
location = transform.location
print(f"当前位置:x={location.x:.2f}, y={location.y:.2f}, z={location.z:.2f}")

获取加速度:

acceleration = vehicle.get_acceleration()
print(f"加速度:x={acceleration.x:.2f}, y={acceleration.y:.2f}, z={acceleration.z:.2f}")

这三个信息,说白了就是车辆状态的「三件套」。速度用于判断是否超速,位置用于定位,加速度用于分析驾驶平顺性。

实用技巧:我习惯把这三个数据打包成一个字典,每帧更新一次,方便后续分析。比如:

vehicle_data = {
    'speed': speed,
    'location': (location.x, location.y, location.z),
    'acceleration': (acceleration.x, acceleration.y, acceleration.z)
}

1.5 综合示例:让车跑一圈

最后,咱们来个完整的例子。让车自动跑 10 秒,同时记录速度和位置:

import carla
import time

client = carla.Client('localhost', 2000)
world = client.get_world()

# 生成车辆
bp = world.get_blueprint_library().find('vehicle.tesla.model3')
spawn = world.get_map().get_spawn_points()[0]
vehicle = world.spawn_actor(bp, spawn)

# 开启自动驾驶
vehicle.set_autopilot(True)

# 记录数据
start_time = time.time()
while time.time() - start_time < 10:
    v = vehicle.get_velocity()
    speed = (v.x**2 + v.y**2 + v.z**2) ** 0.5
    loc = vehicle.get_location()
    print(f"时间:{time.time()-start_time:.1f}s  速度:{speed:.2f} m/s  位置:({loc.x:.1f}, {loc.y:.1f})")
    time.sleep(0.1)

# 关闭自动驾驶
vehicle.set_autopilot(False)
print("测试完成")

跑完这段代码,你会看到车辆自动行驶,控制台不断输出速度和位置。这就是车辆控制的基础——你让车动,车告诉你它怎么动的。

好了,第一章就到这里。下一章咱们聊聊如何控制多辆车,以及怎么让它们协同工作。记住,控制一辆车是基本功,控制一群车才是真本事。