车辆/单车运动学建模、线性化、离散化过程详细推导

   运动学建模、线性化、离散化过程,是使用控制算法进行控制前常用的操作,本文主要以车辆/单车模型为例,详细介绍运动学建模、线性化、离散化等过程,为后续的使用LQR、MPC等控制算法进行轨迹跟踪或其他控制任务做准备。

在这里插入图片描述

   一、车辆/单车 运动学建模

   设机器人当前的位姿为 ( x c , y c , φ c ) (x_c, y_c, φ_c) xc,yc,φc, 其中 ( x c , y c , ) (x_c, y_c,) xc,yc, 为其当前位置坐标, φ c φ_c φc为其当前姿态角,当前前轮的转向角为 δ c δ_c δc,当前的后轮车速为 v c v_c vc,前轮车速为 v f v_f vf,前后轮距为 l l l,默认采用后轮驱动模式,即可控的是后轮车速 v c v_c vc,如下图所示:

   容易得到 v c v_c vc在x轴和y轴的的分量为别为 v c c o s ( φ c ) v_ccos(φ_c) vccos(φc) v c s i n ( φ c ) v_csin(φ_c) vcsin(φc),即:

   x c ˙ = v c c o s ( φ c ) y c ˙ = v c s i n ( φ c ) \dot{x_c}=v_ccos(φ_c) \\ \dot{y_c}=v_csin(φ_c) xc˙=vccos(φc)yc˙=vcsin(φc)

   刚体在同一方向上的速度是相同的,即前轮车速在车辆当前移动方向 v c v_c vc上的分量应该与 v c v_c vc相同,即 v f x = v c v_{fx}=v_c vfx=vc,这个分量与车辆运行方向相同,对车辆的转向无作用,导致车辆运行方向改变的是分量 v f y = v c t a n ( δ c ) v_{fy}=v_ctan(δ_c) vfy=vctan(δc),将其视为车辆绕后轮旋转的线速度,除以半径 l l l,即为旋转角速度,如下所示:

   φ c ˙ = v c t a n ( δ c ) l \dot{φ_c}=\frac{v_ctan(δ_c)}{l} φc˙=lvctan(δc)

   所以,我们可以得到完整的单车运动学模型的状态空间表达式如下:

   { x c ˙ = v c c o s ( φ c ) y c ˙ = v c s i n ( φ c ) φ c ˙ = v c t a n ( δ c ) l \begin{cases}\dot{x_c}=v_ccos(\varphi_c)\\\dot{y_c}=v_csin(\varphi_c)\\\dot{\varphi_c}=\frac{v_ctan(\delta_c)}l\end{cases} xc˙=vccos(φc)yc˙=vcsin(φc)φc˙=lvctan(δc)


在这里插入图片描述

   二、将状态空间表达式线性化

   第一部分中得到了运动学建模的状态空间表达式,然而它是非线性的,想要用来做控制,需要将其化为线性的,先将其写成向量的形式 ,取状态量 X c = [ x c   y c   φ c ] T X_c=[x_c\ y_c\ φ_c]^T Xc=[xc yc φc]T,控制输入为 u = [ v c   δ c ] T u=[v_c \ δ_c]^T u=[vc δc]T, 即前轮转向,后轮驱动。则向量形式的状态空间可写为(因为是非线性的,不能写成矩阵形式):

   X ˙ = f ( X , u ) \dot{X}=f(X,u) X˙=f(X,u)

   最常用的近似线性化方法就是泰勒展开,在 x 0 x_0 x0点处展开的泰勒展开式如下所示:

   f ( x ) = f ( x 0 ) 0 ! + f ′ ( x 0 ) 1 ! ( x − x 0 ) + f ′ ′ ( x 0 ) 2 ! ( x − x 0 ) 2 + . . . + f ( n ) ( x 0 ) n ! ( x − x 0 ) n + R n ( x ) f\left(x\right)=\frac{f\left(x_{0}\right)}{0!}+\frac{f'\left(x_{0}\right)}{1!}\left(x-x_{0}\right)+\frac{f''\left(x_{0}\right)}{2!}\left(x-x_{0}\right)^{2}+...+\frac{f^{\left(n\right)}\left(x_{0}\right)}{n!}\left(x-x_{0}\right)^{n}+R_{n}(x) f(x)=0!f(x0)+1!f(x0)(xx0)+2!f′′(x0)(xx0)2+...+n!f(n)(x0)(xx0)n+Rn(x)

   使用泰勒展开进行线性化需要选择一个展开点,前面我们已经设定了当前位姿(状态)为 ( x c , y c , φ c ) (x_c, y_c, φ_c) xc,yc,φc,现在补充设定目标位姿(状态)为 ( x r , y r , φ r ) (x_r, y_r, φ_r) xr,yr,φr,将目标位姿作为展开点,对 f ( X , u ) f(X,u) f(X,u)进行泰勒展开,展开到一阶线性项,如下所示:

   X ˙ ≈ f ( X r , u r ) + ∂ f ( X r , u r ) ∂ X r ( X − X r ) + ∂ f ( X r , u r ) ∂ u r ( u − u r ) \dot{X}\approx f(X_{r},u_{r})+\frac{\partial f(X_r,u_r)}{\partial X_r}(X-X_{r})+\frac{\partial f(X_r,u_r)}{\partial u_r}(u-u_{r}) X˙f(Xr,ur)+Xrf(Xr,ur)(XXr)+urf(Xr,ur)(uur)

   即:

   X ˙ − X r ˙ ≈ ∂ f ( X r , u r ) ∂ X r ( X − X r ) + ∂ f ( X r , u r ) ∂ u r ( u − u r ) \dot{X}-\dot{X_r}\approx \frac{\partial f(X_r,u_r)}{\partial X_r}(X-X_{r})+\frac{\partial f(X_r,u_r)}{\partial u_r}(u-u_{r}) X˙Xr˙Xrf(Xr,ur)(XXr)+urf(Xr,ur)(uur)

   这里的线性化,并不是把非线性关系,转换为线性关系,而是通过展开,使其误差变为一个线性关系,如上式所示,展开后的误差是线性的, 所以我们可以取当前量与目标量(参考量)之间的差值为新的状态量和输入项,如下所示:

   X ~ ˙ = [ x c ˙ − x ˙ r y c ˙ − y ˙ r φ c ˙ − φ ˙ r ] , X ~ = [ x c − x r y c − y r φ c − φ r ] , u ~ = [ v c − v r δ c − δ r ] \dot{\tilde{X}}=\begin{bmatrix}\dot{x_c}-\dot{x}_{r}\\ \dot{y_c}-\dot{y}_{r}\\ \dot{\varphi_c}-\dot{\varphi}_{r}\end{bmatrix},{\tilde{X}}=\begin{bmatrix}{x_{c}}-x_{r}\\ {y_c}-{y}_{r}\\ {\varphi_c}-{\varphi}_{r}\end{bmatrix},\mathbf{\tilde{u}}=\begin{bmatrix}v_{c}-v_{r}\\ \delta_{c}-\delta_{r}\end{bmatrix} X~˙= xc˙x˙ryc˙y˙rφc˙φ˙r ,X~= xcxrycyrφcφr ,u~=[vcvrδcδr]

   则上面得到的展开式可以写为:

   X ~ ˙ ≈ ∂ f ( X r , u r ) ∂ X r X ~ + ∂ f ( X r , u r ) ∂ u r u ~ \dot{\tilde{X}}\approx \frac{\partial f(X_r,u_r)}{\partial X_r}{\tilde{X}}+\frac{\partial f(X_r,u_r)}{\partial u_r}{\tilde{u}} X~˙Xrf(Xr,ur)X~+urf(Xr,ur)u~

   也就是我们常见的 X ˙ = A X + B u \dot{{X}}= A{{X}}+B{{u}} X˙=AX+Bu的状态空间表达式的形式,成功完成了线性化,求矩阵A和B,也就是 ∂ f ( X r , u r ) ∂ X r \frac{\partial f(X_r,u_r)}{\partial X_r} Xrf(Xr,ur) ∂ f ( X r , u r ) ∂ u r \frac{\partial f(X_r,u_r)}{\partial u_r} urf(Xr,ur)实际上,也就是在求雅克比矩阵,如下所示:

   注:下式中的 f f f f ( X r , u r ) f(X_r,u_r) f(Xr,ur)的简称

   { f 1 = v r c o s ( φ r ) f 2 = v r s i n ( φ r ) f 3 = v r t a n ( δ r ) l \begin{cases}{f_1}=v_rcos(\varphi_r)\\{f_2}=v_rsin(\varphi_r)\\{f_3}=\frac{v_rtan(\delta_r)}l\end{cases} f1=vrcos(φr)f2=vrsin(φr)f3=lvrtan(δr)

   A = ∂ f ( X r , u r ) ∂ X r = [ ∂ f 1 ∂ x r ∂ f 1 ∂ y r ∂ f 1 ∂ φ r ∂ f 2 ∂ x r ∂ f 2 ∂ y r ∂ f 2 ∂ φ r ∂ f 3 ∂ x r ∂ f 3 ∂ y r ∂ f 3 ∂ φ r ] = [ 0 0 − v r sin ⁡ φ r 0 0 v r cos ⁡ φ r 0 0 0 ] A=\frac{\partial f\left(X_{r},u_r\right)}{\partial X_r}=\begin{bmatrix}\frac{\partial f_1}{\partial x_{r}} & \frac{\partial f_1}{\partial y_{r}} & \frac{\partial f_1}{\partial\varphi_{r}}\\ \frac{\partial f_2}{\partial x_{r}} & \frac{\partial f_2}{\partial y_{r}} & \frac{\partial f_2}{\partial\varphi_{r}}\\ \frac{\partial f_3}{\partial x_{r}} & \frac{\partial f_3}{\partial y_{r}} & \frac{\partial f_3}{\partial\varphi_{r}}\end{bmatrix}=\begin{bmatrix}0 & 0 & -v_r\sin\varphi_{r}\\ 0 & 0 & v_r\cos\varphi_{r}\\ 0 & 0 & 0\end{bmatrix} A=Xrf(Xr,ur)= xrf1xrf2xrf3yrf1yrf2yrf3φrf1φrf2φrf3 = 000000vrsinφrvrcosφr0

   B = ∂ f ( X r , u r ) ∂ u r = [ ∂ f 1 ∂ v r ∂ f 1 ∂ δ r ∂ f 2 ∂ v r ∂ f 2 ∂ δ r ∂ f 3 ∂ v r ∂ f 3 ∂ δ r ] = [ cos ⁡ φ r 0 sin ⁡ φ r 0 tan ⁡ δ r l v r l cos ⁡ 2 δ r ] B=\frac{\partial f\left(X_r,u_r\right)}{\partial u_r}=\begin{bmatrix}\frac{\partial f_1}{\partial v_{r}} & \frac{\partial f_1}{\partial\delta_{r}}\\ \frac{\partial f_2}{\partial v_{r}} & \frac{\partial f_2}{\partial\delta_{r}}\\ \frac{\partial f_3}{\partial v_{r}} & \frac{\partial f_3}{\partial\delta_{r}}\end{bmatrix}=\begin{bmatrix}\cos\varphi_r & 0\\ \sin\varphi_r & 0\\ \frac{\tan\delta_r}{l} & \frac{v_r}{l\cos^2\delta_r}\end{bmatrix} B=urf(Xr,ur)= vrf1vrf2vrf3δrf1δrf2δrf3 = cosφrsinφrltanδr00lcos2δrvr


在这里插入图片描述

   三、离散化

   为了方便使用递推式进行迭代,我们还需要对线性化后的结果进行离散化,用差商代替微分,如下所示:

   X ~ ˙ = X ~ ( k + 1 ) − X ~ ( k ) T = A X ~ ( k ) + B u ~ ( k ) \dot{\widetilde{X}}=\frac{\widetilde{X}(k+1)-\widetilde{X}(k)}{T}=A\widetilde{X}(k)+B\widetilde{u}(k) X ˙=TX (k+1)X (k)=AX (k)+Bu (k)

   所以:

   X ~ ( k + 1 ) = ( I + T A ) X ~ ( k ) + T B u ~ ( k ) \widetilde{X}(k+1)=(I+TA)\widetilde{X}(k)+TB\widetilde{u}(k) X (k+1)=(I+TA)X (k)+TBu (k)

   我们定义 A ~ = ( I + T A ) \widetilde{A}=(I+TA) A =(I+TA), B ~ = T B \widetilde{B}=TB B =TB,则上式可写为:

   X ~ ( k + 1 ) = A ~ X ~ ( k ) + B ~ u ~ ( k ) \widetilde{X}(k+1)=\widetilde{A}\widetilde{X}(k)+\widetilde{B}\widetilde{u}(k) X (k+1)=A X (k)+B u (k)

   由前面推出的A和B的结果,容易得知:

   A ~ = [ 1 0 − T v r sin ⁡ φ r 0 1 T v r cos ⁡ φ r 0 0 1 ] \widetilde{A}=\begin{bmatrix}1& 0 & -Tv_r\sin\varphi_{r}\\ 0 & 1 & Tv_r\cos\varphi_{r}\\ 0 & 0 & 1\end{bmatrix} A = 100010TvrsinφrTvrcosφr1

   B ~ = [ T cos ⁡ φ r 0 T sin ⁡ φ r 0 T tan ⁡ δ r l T v r l cos ⁡ 2 δ r ] \widetilde{B}=\begin{bmatrix}T\cos\varphi_r & 0\\ T\sin\varphi_r & 0\\ \frac{T\tan\delta_r}{l} & \frac{Tv_r}{l\cos^2\delta_r}\end{bmatrix} B = TcosφrTsinφrlTtanδr00lcos2δrTvr

   至此,我们已经得到完整的离散化的状态空间表达式,上面式子中带有较多的差值符号 ~,这是因为在第二部分中将状态量和输入量分别取为 X = [ x   y   φ ] T X=[x\ y\ φ]^T X=[x y φ]T,控制输入为 u = [ v   δ ] T u=[v \ δ]^T u=[v δ]T导致的, 所以,现在我们直接将状态量和输入量取为当前量与期望值的差值,即

   X = [ x c − x r y c − y r φ c − φ r ] , u = [ v c − v r δ c − δ r ] {{X}}=\begin{bmatrix}{x_{c}}-x_{r}\\ {y_c}-{y}_{r}\\ {\varphi_c}-{\varphi}_{r}\end{bmatrix},\mathbf{{u}}=\begin{bmatrix}v_{c}-v_{r}\\ \delta_{c}-\delta_{r}\end{bmatrix} X= xcxrycyrφcφr ,u=[vcvrδcδr]

   此时:

   X ( k + 1 ) = [ 1 0 − T v r sin ⁡ ψ r 0 1 T v r cos ⁡ ψ r 0 0 1 ] X ( k ) + [ T cos ⁡ ψ r 0 T sin ⁡ ψ r 0 T tan ⁡ δ r l T v r l cos ⁡ 2 δ r ] u ( k ) = A X ( k ) + B u ( k ) \begin{aligned}\mathbf{X}(\mathrm{k}+1) & \left.=\left[\begin{array}{ccc}1 & 0 & -\mathrm{Tv}_{\mathrm{r}}\sin\psi_{\mathrm{r}}\\ 0 & 1 & \mathrm{Tv}_{\mathrm{r}}\cos\psi_{\mathrm{r}}\\ 0 & 0 & 1\end{array}\right.\right]\mathbf{X}(\mathrm{k})+\left[\begin{array}{ccc}\mathrm{T}\cos\psi_{\mathrm{r}} & 0\\ \mathrm{T}\sin\psi_{\mathrm{r}} & 0\\ \frac{\mathrm{T}\tan\delta_{\mathrm{r}}}{l} & \frac{T\mathrm{v}_{\mathrm{r}}}{l\cos^2\delta_{\mathrm{r}}}\end{array}\right]\mathbf{u}(\mathrm{k})\\ & \mathrm{=AX(k)+Bu(k)}\end{aligned} X(k+1)= 100010TvrsinψrTvrcosψr1 X(k)+ TcosψrTsinψrlTtanδr00lcos2δrTvr u(k)=AX(k)+Bu(k)


   有了上面的离散化线性运动学模型的状态空间方程,就可以基于此来使用LQR、MPC等控制算法进行轨迹跟踪控制或完成其他控制任务了

在这里插入图片描述


   参考资料:

   1、【控制】模型预测控制 MPC 【合集】Model Predictive Control

在这里插入图片描述



### 车辆运动学模型的离散化 对于车辆运动学模型,通常采用后轴中心作为车辆质心的位置来描述其动态特性。该模型由三个微分方程组成: \[ \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
发出的红包

打赏作者

慕羽★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值