✅ 博主简介:擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导,毕业论文、期刊论文经验交流。
✅ 具体问题可以私信或扫描文章底部二维码。
(1)自动驾驶车辆运动控制现存问题与可重构预测模型建立
运动控制在自动驾驶领域至关重要,基于模型预测控制(MPC)的方法已成为主流。近年来,其发展方向朝着集成稳定性控制,轨迹跟随控制也融入了稳定性控制内容。然而,目前仍存在诸多问题。
首先,自动驾驶车辆所处环境复杂多变,传统 MPC 控制依赖精确预测模型,模型失配引发的稳态误差问题尚未妥善解决。在实际行驶中,环境因素如路况变化、其他车辆和行人的干扰等都会导致实际情况与预测模型的偏差,进而产生稳态误差,影响控制精度。
其次,横向和纵向控制在很多研究和现有商用部署系统中是分离的。但实际上,轮胎的横向和纵向力约束相互耦合,在极限情况下,这种分离式控制会使车辆失去稳定性。比如在高速急转弯或急刹车等极端操作时,若横向和纵向控制不协调,车辆很容易失控。
再者,MPC 的计算负担和稳定性是关键问题。实时性对自动驾驶控制意义重大,尽管非线性模型预测控制精度更高,也能考虑非线性约束,但其稳定性和效率问题严重制约了在实际系统中的应用。复杂的计算过程可能导致控制指令的延迟,无法满足实时控制需求。
最后,四轮车辆的配置多样,不同配置往往需要重新设计控制器。虽然近年来在不同构型车辆的可重构集成稳定性控制方面有一定研究,但这些可重构控制器局限于稳定性控制,未扩展到自动驾驶的运动控制中。这意味着每次车辆构型改变,都需要大量的重新设计工作,增加了成本和开发周期。
为解决这些问题,设计针对四轮车辆、能消除稳态误差且高效的可重构模型预测运动控制器。其中关键是建立矢量化的可重构预测模型。先利用牛顿 - 欧拉方程建立车体的动力学方程,涵盖纵向、侧向和横摆三个自由度,这是描述车辆运动状态的基础。然后采用矢量化建模方法将轮胎力映射到车体受力上,此过程摒弃传统前后轴距和轮距的建模方法,改为使用车轮在车辆质心坐标系下的坐标,这是实现矢量化建模的关键步骤。接着对执行器进行建模,用一阶延时环节对驱动和制动系统建模,用积分模型对转向系统建模,并基于可重构矩阵将执行器输出映射到轮胎上,实现执行器的可重构建模。轮胎模型选用参数简单且物理意义明确的 TMEasy 和 TM - Simple 模型。最终建立统一的可重构模型。在此基础上,在不同假设下对模型进行不同层级的简化和线性化,得到不同复杂度的可重构模型,为后续控制器设计提供基础。
(2)模型预测控制的效率与稳定性问题解决及可重构运动控制器设计
在设计可重构运动控制器之前,需要解决模型预测控制的效率和稳定性问题。
对于线性模型预测控制求解器的设计,推导将模型预测控制问题转化为不同形式二次规划问题的过程,这是高效线性模型预测控制器设计的关键。通过这种转化,可以利用现有的二次规划求解算法和工具,提高求解效率,减少计算时间,从而满足自动驾驶对实时性的要求。
在车辆动力学中,侧向速度、横摆角速率、滑移率状态的积分刚性较大,在车辆低速时存在积分稳定性问题。基于稳定龙格 - 库塔方法、半隐式龙格 - 库塔方法和可分积分策略,提出解决非线性模型预测控制(NMPC)应用于运动控制的积分稳定性问题的策略。在低速行驶时,车辆的动力学特性变化复杂,这些状态的不稳定会导致控制效果变差甚至失控。通过将系统的状态方程分为刚性部分和非刚性部分,刚性部分采用半隐式方法积分,非刚性部分采用显式方法积分,由于刚性部分维度大幅降维,有效解决了 NMPC 的低速积分稳定性问题,保证了车辆在低速行驶时的控制稳定性。
具备上述基础后,基于无偏移模型预测控制,针对不同版本的可重构模型设计不同的可重构运动控制器。无偏移模型预测控制相比传统 MPC 的优势在于能消除稳态误差。无偏移模型预测控制包含模型预测控制求解器、参考生成器和卡尔曼滤波器。线性模型预测控制求解器基于 OSQP 二次规划求解器自主设计,非线性模型预测求解器采用基于梯度方法的 GRAMPC。参考生成器是消除稳态误差的关键组件,它生成 MPC 控制的状态参考和控制参考。其求解过程被建模为非线性规划问题,由于影响该非线性规划问题的参数较少,为提高计算效率,通过离线计算得到查找表,然后在线查表的方法得到状态参考值和控制参考值。这种方式在保证精度的同时,大大减少了在线计算量,提高了控制器的实时性和效率。
(3)仿真与实车验证平台设计及实验结果与创新点总结
为验证算法的可行性,设计了仿真和实车平台。针对非实时和实时仿真分别设计了两种仿真平台。一种是基于 CarSim 和 MATLAB 的仿真平台,利用 CarSim 精确的车辆动力学模型和 MATLAB 的强大计算功能,可以对算法进行详细的非实时仿真分析。另一种是自主设计的、基于虚幻 4 和 CarSim 的实时仿真平台,虚幻 4 提供逼真的虚拟环境,结合 CarSim 的车辆模型,能够模拟真实的驾驶场景,对控制器的实时性能进行有效测试。实车验证平台使用的是一辆全线控底盘自动驾驶车辆,这种车辆能够更好地实现对控制指令的精确执行,为验证控制器在实际车辆上的性能提供了良好条件。
通过仿真实验和实车实验,验证了所设计的可重构模型预测运动控制器的有效性。它能够稳定地完成不同构型的四轮车辆的运动控制问题,无论是车辆的结构发生变化,还是在不同的行驶工况下,都能保证良好的控制性能。控制器不仅具有较高的效率,能在短时间内生成准确的控制指令,而且能够成功消除耦合控制中的稳态误差问题,保证车辆纵向速度和侧向位置的精确控制。同时,动力学预测模型的积分稳定性问题也得到高效解决,使得控制器能够适用于不同构型车辆从低速到高速的全速域的运动控制问题,在整个速度范围内都能稳定可靠地工作。
本文的创新点显著。其一,利用矢量化的建模方法建立可重构的整车动力学预测模型,并基于此提出可重构的运动控制器。可重构整车动力学模型是控制器设计的基础,轮胎模型使用 TM - Easy 轮胎模型。在最复杂的可重构模型版本中考虑了执行器的动态行为和轮胎的纵向滑移率建模,根据不同简化条件得到不同形式的简化版本可重构运动控制模型。基于可重构模型设计的可重构运动控制器只需修改初始化参数,无需重新编码或修改控制模型,就能解决不同构型车辆的运动控制问题,极大提高了自动驾驶运动控制系统的适用性,降低了开发成本和周期。其二,将无偏移 MPC 方法用于车辆横纵向耦合控制,消除模型失配或外界扰动导致的稳态误差。模型预测控制对精确动力学模型依赖大,遇到模型失配或外界扰动易产生稳态误差,通过将外界扰动和模型失配部分建模为不可测扰动,用滤波器观测并在求解和预测模型中考虑其影响,从而消除稳态误差,提高了控制精度。其三,基于显式和半隐式龙格 - 库塔方法设计可分积分策略,解决基于 NMPC 运动控制的低速积分稳定性问题。长期以来,低速积分稳定性问题未受重视,这是 NMPC 运动控制低效且不稳定的主因。通过可分积分策略,对系统状态方程按刚性和非刚性部分分别积分,有效解决了该问题,保证了 NMPC 在低速行驶时的稳定性和效率。
# 假设我们有车辆状态信息结构体和相关参数
# 车辆状态结构体包含速度、位置等信息
vehicle_state = {
"velocity": 0.0,
"position": [0.0, 0.0],
"yaw_rate": 0.0,
# 其他状态信息...
}
# 相关参数包括目标速度、目标位置等
parameters = {
"target_velocity": 10.0,
"target_position": [100.0, 50.0],
# 其他参数...
}
# 非线性规划问题求解函数(这里简化模拟)
def solve_nonlinear_problem(state, param):
# 这里假设根据状态和参数计算一个简单的目标函数值(实际情况更复杂)
cost = (state["velocity"] - param["target_velocity"]) ** 2 + (state["position"][0] - param["target_position"][0]) ** 2 + (state["position"][1] - param["target_position"][1]) ** 2
return cost
# 离线计算查找表函数
def generate_lookup_table():
lookup_table = {}
for velocity in range(0, 20): # 简单的速度范围示例
for x_position in range(0, 200, 10): # 简单的位置范围示例
for y_position in range(0, 100, 10):
state = {"velocity": velocity, "position": [x_position, y_position], "yaw_rate": 0.0} # 简化的状态设置
cost = solve_nonlinear_problem(state, parameters)
lookup_table[(velocity, x_position, y_position)] = cost
return lookup_table
# 在线查表获取参考值函数
def get_reference_values(state, lookup_table):
velocity_key = round(state["velocity"])
x_position_key = round(state["position"][0] / 10) * 10
y_position_key = round(state["position"][1] / 10) * 10
cost = lookup_table.get((velocity_key, x_position_key, y_position_key))
# 这里可以根据成本值进一步计算参考状态和控制参考(简单返回成本值示例)
return cost
# 主函数,模拟参考生成器的工作流程
def main():
lookup_table = generate_lookup_table()
reference_value = get_reference_values(vehicle_state, lookup_table)
print("Reference value:", reference_value)
if __name__ == "__main__":
main()