PythonAPI/examples/vehicle_physics.py
carla_vehicle_physics
这是一个 车辆物理特性演示示例 ,用于展示 CARLA 中两种施加外力的方式------冲量(Impulse) 与 力(Force) ------对车辆运动状态的影响,并验证二者在特定条件下的等效性。
🔑 主要模块解析
1. print_step_info(world, vehicle):实时打印车辆状态
- 功能 :输出当前仿真帧中车辆的关键物理量:
- 帧号、仿真时间
- 加速度(x, y, z)
- 速度(x, y, z)
- 位置(x, y, z)
- 用途:便于观察施加冲量/力后车辆的动态响应(如垂直方向的跳起)。
2. wait(world, frames=100):同步等待工具函数
- 功能 :推进仿真指定帧数(
frames),每帧调用world.tick()。 - 作用 :
- 让车辆在施加外力前静止稳定
- 在每次测试后留出足够时间观察效果
- 重置状态前确保车辆已停止运动
3. 仿真环境初始化
python
settings.fixed_delta_seconds = 0.1
settings.synchronous_mode = True
world.apply_settings(settings)
- 启用 同步模式(确保精确控制仿真步长)
- 设置固定时间步长 Δt = 0.1 秒(用于后续冲量与力的换算)
4. 车辆生成与视角设置
c
vehicle_bp = blueprint_library.filter(arg.filter)[0]
- 从蓝图库中按
--filter参数(默认"model3")选择车辆;
c
vehicle_transform.location.z += 3
- 将出生点 Z 坐标抬高 3 米(避免与地面碰撞干扰)
c
spectator_transform.location += vehicle_transform.get_forward_vector() * 20
- 设置观察者(Spectator)位于车辆后方 20 米,面向车辆(便于观察垂直跳动)
5. 核心测试逻辑:冲量 vs 力
✅ 步骤一:施加冲量(Impulse)
python
impulse = 10 * car_mass # 单位:N·s(牛·秒)
vehicle.add_impulse(carla.Vector3D(0, 0, impulse))
- 物理意义:瞬间给予车辆一个向上的动量变化
- 效果:车辆垂直向上"跳起",随后受重力下落
✅ 步骤二:施加等效力(Force)
python
force = impulse / delta # = (10 * mass) / 0.1 = 100 * mass (单位:N)
vehicle.add_force(carla.Vector3D(0, 0, force))
- 关键说明 (来自注释):
add_force本应用于持续作用的力 ,但此处为演示等效性,将冲量
I等效为在单个仿真步长Δt内施加的恒力:F = I / Δt - 预期效果 :与冲量测试产生几乎相同的初始跳起效果
✅ 状态重置机制
每次测试后执行:
python
vehicle.set_transform(vehicle_transform) # 重置位置/朝向
vehicle.set_target_velocity(carla.Vector3D(0, 0, 0)) # 清零速度
wait(world) # 等待稳定
- 确保两次测试初始条件完全一致,结果可比
6. 参数解析与入口
- 支持命令行参数:
--host:CARLA 服务器 IP(默认localhost)--port:端口(默认2000)--filter:车辆筛选关键字(默认"model3",实际应为"vehicle.*model3*",但脚本取第一个匹配项)
- 使用
try...finally确保退出时恢复原始仿真设置并销毁车辆
🎯 核心物理概念演示
| 方法 | API | 物理定义 | 适用场景 |
|---|---|---|---|
| 冲量(Impulse) | add_impulse(vector) |
瞬时动量变化 I = Δp = F·Δt |
碰撞、爆炸、瞬间推力 |
| 力(Force) | add_force(vector) |
持续作用力 F = dp/dt |
引擎推力、风阻、持续外力 |
💡 本脚本通过
F = I / Δt在单步内模拟等效冲量,直观展示二者关系。
✅ 总结:脚本核心价值
该测试用例是 CARLA 车辆物理控制 API 的教学范例,重点演示:
- 如何在同步模式下精确控制外力施加
add_impulse与add_force的使用区别与联系- 通过状态重置实现可重复的物理实验
- 利用质量、时间步长进行物理量换算
适用于开发者理解 CARLA 的底层物理交互机制。