第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 获取车辆状态信息
控制车辆只是第一步。你还需要知道车跑得怎么样——速度多少?位置在哪?加速度多大?这些信息都藏在 VehiclePhysicsControl 和 Transform 里。
获取速度:
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("测试完成")
跑完这段代码,你会看到车辆自动行驶,控制台不断输出速度和位置。这就是车辆控制的基础——你让车动,车告诉你它怎么动的。
好了,第一章就到这里。下一章咱们聊聊如何控制多辆车,以及怎么让它们协同工作。记住,控制一辆车是基本功,控制一群车才是真本事。