自动驾驶系统的车辆动力学建模:自行车模型与汽车模型的对比分析


在自动驾驶系统的车辆动力学建模中,自行车模型(Bicycle Model)和更复杂的汽车模型(如双轨模型或多体动力学模型)各有其适用场景和优缺点。以下是两者的详细对比及选择原因解析:


1. 模型定义与核心差异

特性自行车模型复杂汽车模型(如双轨模型)
简化假设将四轮车辆简化为两轮(前轮转向,后轮驱动)考虑四轮独立运动、悬架系统、轮胎侧偏特性
自由度2-3自由度(位置x,y,航向角θ)6+自由度(含横向、俯仰、侧倾等运动)
计算复杂度低(适合实时控制)高(需解算微分代数方程)
参数需求仅需轴距、转向比等基础参数需轮胎刚度、悬架参数、质心位置等细节
典型应用场景低速路径跟踪、实时控制高速稳定性分析、极限工况仿真

2. 为什么自动驾驶常用自行车模型?

2.1 计算效率优势

自行车模型的核心运动学方程为:
δ = arctan ⁡ ( L R ) \delta = \arctan\left(\frac{L}{R}\right) δ=arctan(RL)
其中,( L )为轴距,( R )为转弯半径。其计算仅涉及简单的三角函数,可在1ms内完成,满足控制系统的实时性要求(通常需10-100Hz更新频率)。

相比之下,双轨模型需解算非线性方程组:
{ F y f = C α f α f F y r = C α r α r α f = δ − v y + a ψ ˙ v x α r = b ψ ˙ − v y v x \begin{cases} F_{yf} = C_{\alpha f} \alpha_f \\ F_{yr} = C_{\alpha r} \alpha_r \\ \alpha_f = \delta - \frac{v_y + a \dot{\psi}}{v_x} \\ \alpha_r = \frac{b \dot{\psi} - v_y}{v_x} \end{cases} Fyf=CαfαfFyr=Cαrαrαf=δvxvy+aψ˙αr=vxbψ˙vy
计算耗时可能达到10ms以上,难以满足实时控制需求。

2.2 参数易获取性

自行车模型仅需轴距(L)转向传动比等少量参数,而复杂模型需要详细的车辆参数(如轮胎侧偏刚度( C_{\alpha} )、悬架刚度等),这些数据可能因车型不同而难以获取。

2.3 适用场景匹配

低速城市道路(<50km/h)和中等曲率转弯场景下,自行车模型的预测误差通常小于5%,足以满足控制精度要求。而高速或极限工况(如漂移)则需要更精确的模型。


3. 复杂汽车模型的应用场景

尽管自行车模型广泛使用,但在以下场景中需切换至复杂模型:

  1. 高速稳定性控制(>80km/h):需考虑横向载荷转移对轮胎抓地力的影响。
  2. 极限工况仿真:如紧急避障时车辆进入非线性区域的动力学行为。
  3. 车辆动力学测试:评估ESP(电子稳定程序)等系统时需精确建模。

示例代码(双轨模型片段)

def double_track_model(state, delta, Fx):# 状态变量: [vx, vy, omega, X, Y, psi]# 输入: 前轮转角delta, 驱动力Fxm = 1500  # 质量 (kg)Iz = 2500  # 绕Z轴转动惯量 (kg·m²)lf, lr = 1.2, 1.5  # 前后轴到质心距离 (m)C_alpha_f, C_alpha_r = 80000, 80000  # 前后轮胎侧偏刚度 (N/rad)alpha_f = delta - (state[1] + lf * state[2]) / state[0]alpha_r = (state[1] - lr * state[2]) / state[0]Fyf = C_alpha_f * alpha_fFyr = C_alpha_r * alpha_rdvx = (Fx - Fyf * np.sin(delta)) / m + state[1] * state[2]dvy = (Fyf * np.cos(delta) + Fyr) / m - state[0] * state[2]domega = (lf * Fyf * np.cos(delta) - lr * Fyr) / Izreturn [dvx, dvy, domega, state[0]*np.cos(state[4]) - state[1]*np.sin(state[4]),state[0]*np.sin(state[4]) + state[1]*np.cos(state[4]), state[2]]

4. 自行车模型代码实现及应用举例

import numpy as np
import matplotlib.pyplot as pltclass BicycleModel:def __init__(self, L=2.0, max_steer=30.0):  # L:轴距,max_steer:最大转向角self.L = Lself.max_steer = np.deg2rad(max_steer)  # 转换为弧度def kinematic_model(self, x, y, theta, v, delta):  # x,y:位置,theta:航向角,v:速度,delta:前轮转角delta = np.clip(delta, -self.max_steer, self.max_steer)  # 限制转向角在最大值内beta = np.arctan(1 / (2 * self.L * np.tan(delta) / v))  # 滑移角计算x_dot = v * np.cos(theta + beta)  # x方向速度y_dot = v * np.sin(theta + beta)  # y方向速度theta_dot = v / self.L * np.tan(delta) * np.cos(beta)  # 航向角变化率return x_dot, y_dot, theta_dotdef simulate(self, initial_state, v, delta, dt, steps):  # 初始状态,速度,转向角,时间步长,步数x_traj = [initial_state[0]]  # x轨迹y_traj = [initial_state[1]]  # y轨迹theta_traj = [initial_state[2]]  # 航向角轨迹current_state = initial_statefor _ in range(steps):x_dot, y_dot, theta_dot = self.kinematic_model(*current_state, v, delta)current_state = (current_state[0] + x_dot * dt,current_state[1] + y_dot * dt,current_state[2] + theta_dot * dt)x_traj.append(current_state[0])y_traj.append(current_state[1])theta_traj.append(current_state[2])return x_traj, y_traj, theta_traj# 应用举例:低速园区物流车路径跟踪
if __name__ == "__main__":# 初始化自行车模型,轴距2米,最大转向角30度bike_model = BicycleModel(L=2.0, max_steer=30.0)# 初始状态:位置(0,0),航向角0弧度initial_state = (0.0, 0.0, 0.0)# 设置速度为5m/s,转向角为0.5弧度(约28.6度)v = 5.0delta = 0.5# 模拟时间步长0.1s,共100步dt = 0.1steps = 100# 进行模拟x_traj, y_traj, theta_traj = bike_model.simulate(initial_state, v, delta, dt, steps)# 绘制轨迹plt.figure(figsize=(10, 6))plt.plot(x_traj, y_traj, label="Vehicle Trajectory")plt.scatter([x_traj[0]], [y_traj[0]], c='r', label="Start Point")plt.scatter([x_traj[-1]], [y_traj[-1]], c='g', label="End Point")plt.xlabel("X (m)")plt.ylabel("Y (m)")plt.title("Bicycle Model Simulation for Low-speed Park Logistics Vehicle")plt.legend()plt.grid()plt.show()

应用举例说明
在低速园区物流车场景中,自行车模型能够快速生成车辆的行驶轨迹。通过设置车辆的初始位置、速度和转向角,模拟出车辆在园区道路上的行驶路径。从模拟结果可以看出,车辆按照设定的参数稳定地沿着一定曲率的路径行驶,验证了自行车模型在低速场景下的有效性和计算效率。

5. 双轨模型代码实现及应用举例

class DoubleTrackModel:def __init__(self, m=1500, Iz=2500, lf=1.2, lr=1.5, C_alpha_f=80000, C_alpha_r=80000):self.m = m  # 车辆质量self.Iz = Iz  # 绕Z轴转动惯量self.lf = lf  # 前轴到质心距离self.lr = lr  # 后轴到质心距离self.C_alpha_f = C_alpha_f  # 前轮胎侧偏刚度self.C_alpha_r = C_alpha_r  # 后轮胎侧偏刚度def dynamic_model(self, state, delta, Fx):vx, vy, omega, X, Y, psi = state# 计算前后轮胎的侧偏角alpha_f = delta - (vy + self.lf * omega) / vxalpha_r = (vy - self.lr * omega) / vx# 计算前后轮胎的侧向力Fyf = self.C_alpha_f * alpha_fFyr = self.C_alpha_r * alpha_r# 计算车辆的加速度和角加速度dvx = (Fx - Fyf * np.sin(delta)) / self.m + vy * omegadvy = (Fyf * np.cos(delta) + Fyr) / self.m - vx * omegadomega = (self.lf * Fyf * np.cos(delta) - self.lr * Fyr) / self.Iz# 计算位置和航向角的变化dX = vx * np.cos(psi) - vy * np.sin(psi)dY = vx * np.sin(psi) + vy * np.cos(psi)dpsi = omegareturn [dvx, dvy, domega, dX, dY, dpsi]def simulate(self, initial_state, delta, Fx, dt, steps):vx_traj = [initial_state[0]]vy_traj = [initial_state[1]]omega_traj = [initial_state[2]]X_traj = [initial_state[3]]Y_traj = [initial_state[4]]psi_traj = [initial_state[5]]current_state = initial_statefor _ in range(steps):state_dot = self.dynamic_model(current_state, delta, Fx)current_state = [current_state[0] + state_dot[0] * dt,current_state[1] + state_dot[1] * dt,current_state[2] + state_dot[2] * dt,current_state[3] + state_dot[3] * dt,current_state[4] + state_dot[4] * dt,current_state[5] + state_dot[5] * dt]vx_traj.append(current_state[0])vy_traj.append(current_state[1])omega_traj.append(current_state[2])X_traj.append(current_state[3])Y_traj.append(current_state[4])psi_traj.append(current_state[5])return vx_traj, vy_traj, omega_traj, X_traj, Y_traj, psi_traj# 应用举例:高速公路L3级自动驾驶车辆稳定性分析
if __name__ == "__main__":# 初始化双轨模型double_track = DoubleTrackModel()# 初始状态:纵向速度20m/s,侧向速度0,角速度0,位置(0,0),航向角0弧度initial_state = [20.0, 0.0, 0.0, 0.0, 0.0, 0.0]# 设置前轮转角0.1弧度,驱动力1000Ndelta = 0.1Fx = 1000.0# 模拟时间步长0.01s,共200步dt = 0.01steps = 200# 进行模拟vx_traj, vy_traj, omega_traj, X_traj, Y_traj, psi_traj = double_track.simulate(initial_state, delta, Fx, dt, steps)# 绘制纵向速度、侧向速度和角速度的变化time = np.arange(0, steps*dt, dt)plt.figure(figsize=(12, 8))plt.subplot(3, 1, 1)plt.plot(time, vx_traj)plt.xlabel("Time (s)")plt.ylabel("Longitudinal Speed (m/s)")plt.title("Longitudinal Speed Variation")plt.grid()plt.subplot(3, 1, 2)plt.plot(time, vy_traj)plt.xlabel("Time (s)")plt.ylabel("Lateral Speed (m/s)")plt.title("Lateral Speed Variation")plt.grid()plt.subplot(3, 1, 3)plt.plot(time, omega_traj)plt.xlabel("Time (s)")plt.ylabel("Yaw Rate (rad/s)")plt.title("Yaw Rate Variation")plt.grid()plt.tight_layout()plt.show()# 绘制车辆行驶轨迹plt.figure(figsize=(10, 6))plt.plot(X_traj, Y_traj, label="Vehicle Trajectory")plt.scatter([X_traj[0]], [Y_traj[0]], c='r', label="Start Point")plt.scatter([X_traj[-1]], [Y_traj[-1]], c='g', label="End Point")plt.xlabel("X (m)")plt.ylabel("Y (m)")plt.title("Double Track Model Simulation for Highway L3 Autonomous Vehicle")plt.legend()plt.grid()plt.show()

应用举例说明
在高速公路L3级自动驾驶场景中,双轨模型能够更精确地分析车辆在高速行驶时的稳定性。通过设置车辆的初始状态、前轮转角和驱动力,模拟出车辆在高速公路上的行驶动态。从模拟结果可以看出,车辆的纵向速度、侧向速度和角速度随时间的变化趋势,以及车辆的行驶轨迹。这有助于评估车辆在高速行驶时的稳定性和安全性,验证了双轨模型在高速场景下的必要性和精确性。

通过以上代码实现和应用举例,可以更深入地理解自行车模型和双轨模型在不同自动驾驶场景下的应用和特点。

6. 实际工程中的混合策略

在自动驾驶系统中,常采用分层建模策略:

  • 上层路径规划:使用自行车模型快速生成参考轨迹。
  • 底层控制:根据车速动态切换模型:
    def select_vehicle_model(speed):if speed < 15:  # m/s (约54km/h)return BicycleModel()else:return DoubleTrackModel()
    
  • 仿真验证:在PreScan/CarSim等工具中使用高精度模型验证算法。

7. 关键结论

场景推荐模型理由
低速园区物流车自行车模型计算快、参数少、精度足够
高速公路L3级自动驾驶双轨模型需考虑高速稳定性
控制算法开发自行车模型快速迭代、易调试
车辆动力学测试多体动力学模型高保真度、匹配实车数据

8. 总结

自行车模型因其简洁性实时性成为自动驾驶控制算法的首选,而复杂模型则用于特定场景验证车辆动力学深度分析。实际工程中需根据车速控制频率可用参数动态选择模型,以平衡精度与计算效率。

下一篇将讲解混合策略的应用示例以及可视化验证代码,欢迎关注!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/38665.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows server 2022域控制服务器的配置

Windows server 2022介绍 一、核心特性与改进 安全核心服务器&#xff08;Secured-Core Server&#xff09; 硬件级安全&#xff1a;支持基于硬件的安全功能&#xff08;如TPM 2.0、Secure Boot、基于虚拟化的安全防护VBS&#xff09;&#xff0c;防止固件攻击。受信任的启动链…

C++语法之模板函数和模板类

模板函数是什么&#xff1f;就是不指定类型的函数&#xff0c;不指定类型如何写代码?所以得用到模板&#xff0c;可以先用模板代替&#xff0c;就好像方程式&#xff0c;先用x,y代替一样。 它的写法是这样&#xff0c;定义函数时&#xff0c;开头加一句:(其中的T就相当于x,y之…

时序分析笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 一、周期约束 二、建立时间和保持时间 三、时序路径 四、时序模型 前言 约束文件笔记&#xff0c;傅里叶的猫的视频。 一、周期约束 时序约束就是告诉软件输…

六十天前端强化训练之第二十八天之Composition 函数完全指南

欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗&#xff0c;谢谢大佬&#xff01; 目录 一、核心概念解析 1.1 什么是 Composition 函数 1.2 为什么需要封装 1.3 设计原则 二、实战案例&#xff1a;鼠标跟踪器 2.1 未封装版本 2.2 封装后的 Composition 函数…

MySQL 锁机制详解

MySQL 锁机制详解 5.1 概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传统的计算资源&#xff08;CPU、 RAM、I/O&#xff09;的争用以外&#xff0c;数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有 效性是所有数…

常见中间件漏洞攻略-Apache篇

漏洞名称&#xff1a;Apache HTTP Server 路径穿越漏洞-CVE-2021-41773 第一步&#xff1a;拉取环境、启动环境 #拉取环境 docker pull blueteamsteve/cve-2021-41773:no-cgidhttp://121.40.229.129:8080#启动环境 docker run -dit -p 8080:80 blueteamsteve/cve-2021-41773:n…

站群服务器是什么意思呢?

站群服务器是一种专门为托管和管理多个网站而设计的服务器&#xff0c;其核心特点是为每个网站分配独立的IP地址。这种服务器通常用于SEO优化、提高网站权重和排名&#xff0c;以及集中管理多个网站的需求。以下是站群服务器的详细解释&#xff1a; 一、站群服务器的定义 站群…

Excel 小黑第22套

对应大猫22 新建一行&#xff0c;输入第一个人名字&#xff0c; 填充 -快速填充 修改员工编号&#xff08;1—001&#xff09;&#xff1a;选中所有员工编号&#xff0c;开始 -数据组 -自定义数字格式 000 在所有空表格单元格中输入数字0&#xff1a;选中修改的表格范围&#…

多传感器融合 SLAM LVI-SAM

目录 LVI-SAM 简介 A. 系统概述 B. 视觉惯导系统 C.雷达惯导系统 LVI-SAM 安装编译 编译 LVI-SAM 常见问题 LVI-SAM 工程化建议 LVI-SAM 简介 源码地址:https://github.com/TixiaoShan/LVI-SAM 如无法下载,换用 gitee 版本:https://gitee.com/inf_lee/LVI-SAM 改进…

Linux shell脚本3-if语句、case语句、for语句、while语句、until语句、break语句、continue语句,格式说明及程序验证

目录 1.if 控制语句 1.1 if 语句格式 1.2 程序验证 2.case语句 2.1case语句格式 2.2程序验证 2.2.1 终端先执行程序&#xff0c;在输入一个数 2.2.2 终端执行程序时同时输入一个预设变量 2.2.3 case带有按位或运算和通配符匹配 3.for语句 3.1for语句格式 3.2程序验…

图解模糊推理过程(超详细步骤)

我们前面已经讨论了三角形、梯形、高斯型、S型、Z型、Π型6种隶属函数&#xff0c;下一步进入模糊推理阶段。 有关六种隶属函数的特点在“Pi型隶属函数&#xff08;Π-shaped Membership Function&#xff09;的详细介绍及python示例”都有详细讲解&#xff1a;https://lzm07.b…

001-JMeter的安装与配置

1.前期准备 下载好JMeter : https://jmeter.apache.org/download_jmeter.cgi 下载好JDK : :Java Downloads | Oracle 中国 下载图中圈蓝的JMeter和JDK就行&#xff0c;让它边下载&#xff0c;我们边往下看 2.为什么要下载并安装JDK ? JMeter 是基于 Java 开发的工具&#…

英伟达有哪些支持AI绘画的 工程

英伟达在AI绘画领域布局广泛&#xff0c;其自研工具与第三方合作项目共同构建了完整的技术生态。以下是其核心支持AI绘画的工程及合作项目的详细介绍&#xff1a; 一、英伟达自研AI绘画工具 1. GauGAN系列 技术特点&#xff1a;基于生成对抗网络&#xff08;GAN&#xff09;&…

Netty源码—4.客户端接入流程二

大纲 1.关于Netty客户端连接接入问题整理 2.Reactor线程模型和服务端启动流程 3.Netty新连接接入的整体处理逻辑 4.新连接接入之检测新连接 5.新连接接入之创建NioSocketChannel 6.新连接接入之绑定NioEventLoop线程 7.新连接接入之注册Selector和注册读事件 8.注册Rea…

2025.3.17-2025.3.23学习周报

目录 摘要Abstract1 文献阅读1.1 动态图邻接矩阵1.2 总体框架1.2.1 GCAM1.2.2 输出块 1.3 实验分析 总结 摘要 在本周阅读的文献中&#xff0c;作者提出了一种名为TFM-GCAM的模型。TFM-GCAM模型的创新主要分为两部分&#xff0c;一部分是交通流量矩阵的设计&#xff0c;TFM-GC…

生活电子类常识——搭建openMauns工作流+搭建易犯错解析

前言 小白一句话生成一个网站&#xff1f;小白一句话生成一个游戏&#xff1f;小白一句话生成一个ppt?小白一句话生成一个视频&#xff1f; 可以 原理 总体的执行流程是 1&#xff0c;用户下达指令 2&#xff0c;大模型根据用户指令&#xff0c;分解指令任务为多个细分步骤…

深入解析 Uniswap:自动做市商模型的数学推导与智能合约架构

目录 1. 自动做市商&#xff08;AMM&#xff09;模型的数学推导1.1 恒定乘积公式推导1.2 价格影响与滑点 2. Uniswap 智能合约架构解析2.1 核心合约&#xff08;Core&#xff09;2.1.1 工厂合约&#xff08;Factory&#xff09;2.1.2 交易对合约&#xff08;Pair&#xff09; 2…

高频面试题(含笔试高频算法整理)基本总结回顾20

干货分享&#xff0c;感谢您的阅读&#xff01; &#xff08;暂存篇---后续会删除&#xff0c;完整版和持续更新见高频面试题基本总结回顾&#xff08;含笔试高频算法整理&#xff09;&#xff09; 备注&#xff1a;引用请标注出处&#xff0c;同时存在的问题请在相关博客留言…

生成模型速通(Diffusion,VAE,GAN)

基本概念 参考视频https://www.bilibili.com/video/BV1re4y1m7gb/?spm_id_from333.337.search-card.all.click&vd_sourcef04f16dd6fd058b8328c67a3e064abd5 生成模型其实是主要是依赖概率分布&#xff0c;对输入特征的概率密度函数建模 隐空间&#xff08;latent space)…

Android在kts中简单使用AIDL

Android在kts中简单使用AIDL AIDL相信做Android都有所了解&#xff0c;跨进程通信会经常使用&#xff0c;这里就不展开讲解原理跨进程通信的方式了&#xff0c;最近项目换成kts的方式&#xff0c;于是把aidl也换成了统一的方式&#xff0c;其中遇到了很多问题&#xff0c;这里…