车辆运动学模型的线性化及其离散化

本文介绍了车辆运动学模型的线性化过程,利用泰勒展开和矩阵形式阐述了如何从非线性模型转换为线性模型,并通过实例展示了线性化的具体步骤。此外,还提到了离散化的方法,为后续的系统分析和控制奠定了基础。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、数学基础:泰勒展开

从一元函数的泰勒展开说起

一元函数在 x 0 x_0 x0处的泰勒展开表达式为:
f ( x ) = f ( x 0 ) + f ( x 0 ) ′ ( x − x 0 ) + 1 2 ! f ( x 0 ) ′ ′ ( x − x 0 ) + o n f(x) = f(x_0) + {f(x_0)}'(x - x_0) + \frac{1}{2!}{f(x_0)}''(x - x_0) + o^n f(x)=f(x0)+f(x0)(xx0)+2!1f(x0)(xx0)+on
那么同理,二元函数的泰勒展开为:
f ( x , y ) = f ( x 0 , y 0 ) + f x ′ ( x 0 , y 0 ) ( x − x 0 ) + f y ′ ( x 0 , y 0 ) ( y − y 0 ) + 1 2 ! f x x ′ ′ ( x 0 , y 0 ) ( x − x 0 ) 2 + 1 2 ! f y y ′ ′ ( x 0 , y 0 ) ( y − y 0 ) 2 + o n f(x,y) = f(x_0,y_0) + f_{x}^{'}(x_0,y_0)(x-x_0) + f_{y}^{'}(x_0,y_0)(y-y_0) + \frac{1}{2!}f_{xx}^{''}(x_0,y_0)(x-x_0)^2 + \frac{1}{2!}f_{yy}^{''}(x_0,y_0)(y-y_0)^2 + o^n f(x,y)=f(x0,y0)+fx(x0,y0)(xx0)+fy(x0,y0)(yy0)+2!1fxx(x0,y0)(xx0)2+2!1fyy(x0,y0)(yy0)2+on
多元函数呢?
f ( x 1 , x 2 , . . . , x n ) = f ( x 0 1 , x 0 2 , . . . x 0 n ) + ∑ i = 1 n f x i ′ ( x 0 1 , x 0 2 , . . . x 0 n ) ( x i − x 0 i ) + 1 2 ! ∑ i , j = 1 n f x i x j ′ ′ ( x 0 1 , x 0 2 , . . . x 0 n ) ( x i − x 0 i ) ( x j − x 0 j ) + o n f(x^1,x^2,...,x^n) = f(x_{0}^{1},x_{0}^{2},...x_{0}^{n}) + \sum_{i=1}^{n}f_{x^i}^{'}(x_{0}^{1},x_{0}^{2},...x_{0}^{n})(x^i - x_{0}^{i}) + \frac{1}{2!}\sum_{i,j=1}^{n}f_{x^ix^j}^{''}(x_{0}^{1},x_{0}^{2},...x_{0}^{n})(x^i - x_{0}^{i})(x^j - x_{0}^{j}) + o^n f(x1,x2,...,xn)=f(x01,x02,...x0n)+i=1nfxi(x01,x02,...x0n)(xix0i)+2!1i,j=1nfxixj

### 车辆运动学模型离散化 对于车辆运动学模型,通常采用后轴中心作为车辆质心的位置来描述其动态特性。该模型由三个微分方程组成: \[ \begin{cases} \dot{x} = v \cos(\psi) \\ \dot{y} = v \sin(\psi) \\ \dot{\psi} = \frac{v}{L}\tan(\delta_f) \end{cases} \] 其中 \(x\) 和 \(y\) 表示位置坐标;\(v\) 是速度;\(\psi\) 代表航向角;\(L\) 为轮距;\(\delta_f\) 则表示前轮转角。 为了便于数值计算以及应用到实际控制系统当中去,在连续时间域下的上述表达式需要转换成为离散形式。具体做法可以按照以下方式来进行变换[^2]。 #### 时间步长的选择 选取合适的时间间隔 \(T_s\) ,这决定了系统的采样频率。较小的时间步长能够更精确地逼近真实轨迹但是会增加运算量;反之则可能导致精度损失。 #### 显式欧拉法 最简单的离散化方案之一便是显式Euler方法,它通过泰勒级数展开并忽略高阶项得到近似解: \[ \begin{aligned} & x_{k+1} &= &x_k + T_s(v_k \cdot \cos(\psi_k)) \\ & y_{k+1} &= &y_k + T_s(v_k \cdot \sin(\psi_k)) \\ & \psi_{k+1} &= &\psi_k + T_s\left(\frac{v_k}{L}\tan(\delta_{fk})\right) \end{aligned} \] 这种方法易于理解和编程实现,但在某些情况下可能会引入较大的误差。 #### 隐式梯形法则 另一种常用的方法是隐式梯形积分算法,相比前者具有更好的稳定性和准确性: \[ \begin{aligned} & x_{k+1} &= &x_k+\frac{T_s}{2}(v_k+v_{k+1})(\cos(\psi_k)+\cos(\psi_{k+1}))\\ & y_{k+1} &= &y_k+\frac{T_s}{2}(v_k+v_{k+1})(\sin(\psi_k)+\sin(\psi_{k+1}))\\ & \psi_{k+1} &= &\psi_k+\frac{T_s}{2}\left[\frac{(v_k+v_{k+1})}{L}\left(\tan(\delta_{fk})+\tan(\delta_{f(k+1)})\right)\right] \end{aligned} \] 需要注意的是,此公式涉及到未来时刻的状态变量(即下一次迭代的结果),因此求解过程较为复杂,可能需要用到牛顿迭代或其他非线性方程求根技术。 ```python import numpy as np def discrete_model(x, y, psi, v, delta_f, Ts, L): """ 使用显式欧拉法对单车运动学模型进行离散化 参数: x : 当前横坐标 y : 当前纵坐标 psi : 当前朝向角度 v : 线速度 delta_f : 前轮转向角 Ts : 采样周期(s) L : 轴距(m) 返回值: tuple: 更新后的状态 (新x, 新y, 新ψ) """ # 计算下一刻的位置和方向 new_x = x + Ts * v * np.cos(psi) new_y = y + Ts * v * np.sin(psi) new_psi = psi + Ts * (v / L) * np.tan(delta_f) return (new_x, new_y, new_psi) if __name__ == "__main__": # 初始化参数 initial_state = { 'x': 0, 'y': 0, 'psi': 0, 'v': 5, # m/s 'delta_f': 0.174533, # radian (约等于10度) 'Ts': 0.1, # s 'L': 2 # meter } next_state = discrete_model(**initial_state) print(f"Next state is at position ({next_state[0]}, {next_state[1]}), heading angle {np.degrees(next_state[2])}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值