车辆模型——运动学模型


在机器人的研究领域中,移动机器人的系统建模与分析是极为关键的基础环节,本文以非完整约束的轮式移动机器人为研究对象进行建模。

约束及系统

在力学的世界里,约束是对系统位姿和运动的限制。约束的类型丰富多样

  • 几何约束:主要限制系统的位姿,就像给系统的位置设定了边界,其表达式为 f ( p , t ) = 0 k f(p, t) = 0^k f(p,t)=0k 其中, p ∈ R n p\in\mathbb{R}^n pRn代表系统位姿坐标向量, t t t 表示时间, k ∈ R k\in\mathbb{R} kR 表示约束个数。
  • 运动约束:不仅仅对系统的位姿进行约束,同时对于各质点的速度也进行了约束,其表达式 f ( p , p ˙ , t ) = 0 k f(p,\dot{p},t)=0^k f(p,p˙,t)=0k 其中, p ∈ R n p\in\mathbb{R}^n pRn代表系统位姿坐标向量, p ˙ ∈ R n \dot{p}\in\mathbb{R}^n p˙Rn代表系统位姿坐标向量, t t t 表示时间, k ∈ R k\in\mathbb{R} kR表示约束个数。

“非完整”和“完整”约束源于近代分析力学,由德国物理学家赫兹提出,如果利用积分运算等数学方法,可以将运动约束转化为几何约束的形式,则该约束即为完整约束,反之则为非完整约束

  • 完整约束系统:仅含有完整约束的系统。会降低系统的位置空间自由度。
  • 非完整约束系统:含有至少一个非完整约束的系统。不会降低系统的位置空间自由度,但会降低速度空间自由度。

来看典型移动机器人的简化示意图,它在X - Y二维平面上运动。
在这里插入图片描述
当机器人进行无滑动滚动运动时,其速度方向有着特定的限制,即速度始终沿后轮中心指向前轮中心的方向,并且不会出现垂直于车轴的移动趋势。由此可以得到约束
v c = x ˙ sin ⁡ ( φ ) + y ˙ cos ⁡ ( φ ) = 0 v_c = \dot{x}\sin(\varphi)+\dot{y}\cos(\varphi)=0 vc=x˙sin(φ)+y˙cos(φ)=0

设定 q = ( x , y , φ ) T q=(x,y,\varphi)^T q=(x,y,φ)T,整理成运动约束矩阵形式为
A ( q ) q ˙ = [ sin ⁡ ( φ ) − cos ⁡ ( φ ) 0 ] [ x ˙ y ˙ φ ˙ ] = 0 A(q) \dot{q}=[\sin (\varphi) \quad -\cos (\varphi) \quad 0] \left[\begin{array}{c}\dot{x} \\ \dot{y} \\ \dot{\varphi}\end{array}\right] =0 A(q)q˙=[sin(φ)cos(φ)0] x˙y˙φ˙ =0
其中, x x x表示后轮中心横坐标、 y y y表示后轮中心纵坐标和 φ \varphi φ表示速度方向角。

经过分析发现,利用积分运算无法将这个运动约束转化为几何约束,所以这类移动机器人属于非完整约束系统。

移动机器人运动学模型(Kinematic Model)

为了确保机器人的安全并实现轨迹跟踪,我们需要明确障碍物和机器人的位姿、运动信息,还要建立全局坐标系来统一这些信息。

自行车模型

在轨迹跟踪控制研究中,常用基于前轮转向,后轮驱动的简易自行车模型来构建移动机器人模型。
在这里插入图片描述
X X X- Y Y Y空间为全局坐标, ( X r , Y r ) (X_r, Y_r) (Xr,Yr) 为后轮中心参考位置, ( X f , Y f ) (X_f, Y_f) (Xf,Yf) 为前轮中心参考位置, l l l 为前后轮中心距离(即车长), v r v_r vr 为机器人移动速度, φ \varphi φ 为机器人中心轴方向(即航向角), δ f \delta_f δf 前轮转向角表示前轮与移动方向的偏转角度(逆时针为正), ( X o , Y o ) (X_o, Y_o) (Xo,Yo) 为移动机器人移动所围绕的圆心, R R R 为移动机器人移动旋转半径。

对这个模型做出一些合理假设

  • 左右侧车轮速度转角一致,这样可将左右侧车轮合并为一个车轮;
  • 车辆行驶速度变化缓慢,忽略前后轴载荷;
  • 车身及悬架系统为刚性系统;
  • 车辆后轮负责驱动,前轮负责转向。

以移动机器人简化模型的后轮中心为基准点,通过一系列推导,可以得到其速度、前后轴运动学约束等关系式,进而得出移动机器人简单的运动学模型
[ X ˙ r Y ˙ r φ ˙ ] = [ v r cos ⁡ ( φ ) v r sin ⁡ ( φ ) v r tan ⁡ ( δ f ) l ] \left[\begin{array}{c}\dot{X}_{r} \\ \dot{Y}_{r} \\ \dot{\varphi}\end{array}\right]=\left[\begin{array}{c}v_{r} \cos (\varphi) \\ v_{r} \sin (\varphi) \\ \frac{v_{r} \tan \left(\delta_{f}\right)}{l}\end{array}\right] X˙rY˙rφ˙ = vrcos(φ)vrsin(φ)lvrtan(δf)

一般形式为 p ˙ = f ( p , u ) \dot{p}=f(p, u) p˙=f(p,u) ,其中 p = [ X r , Y r , ϕ ] T p=[X_r,Y_r,\phi]^T p=[Xr,Yr,ϕ]T 表示系统状态, u = [ v r , δ f ] T u=[v_r, \delta_f]^T u=[vr,δf]T 表示系统输入。

含有加速度 a a a 的自行车模型

上述简单运动学模型将速度 v r v_r vr 和前轮转向角 δ f \delta_f δf 作为输入,但在实际生活中,以无人车为例,驾驶员是通过油门和刹车改变车辆加速度来控制车辆的,速度不能突变。
在这里插入图片描述
因此,对模型进行了改进,把速度 v r v_r vr 当作系统状态,引入加速度 a r a_{r} ar 作为系统输入。设系统状态 p = [ X r , Y r , φ , v r ] T p=[X_r,Y_r,\varphi,v_r]^T p=[Xr,Yr,φ,vr]T,系统输入 u = [ a r , δ f ] T u=[a_r, \delta_f]^T u=[ar,δf]T,新系统模型 p ˙ = f ( p , u ) \dot{p}=f(p,u) p˙=f(p,u) 设计如下:
[ X ˙ r Y ˙ r φ ˙ v ˙ r ] = [ v r cos ⁡ ( φ ) v r sin ⁡ ( φ ) v r tan ⁡ ( δ f ) l a r ] \left[\begin{array}{c}\dot{X}_{r} \\ \dot{Y}_{r} \\ \dot{\varphi} \\ \dot{v}_{r}\end{array}\right]=\left[\begin{array}{c}v_{r} \cos (\varphi) \\ v_{r} \sin (\varphi) \\ \frac{v_{r} \tan \left(\delta_{f}\right)}{l} \\ a_{r}\end{array}\right] X˙rY˙rφ˙v˙r = vrcos(φ)vrsin(φ)lvrtan(δf)ar
将其表示为仿射非线性系统形式为
p ˙ = f ( p ) + g ( p ) u = [ v r cos ⁡ ( φ ) v r sin ⁡ ( φ ) 0 0 ] + [ 0 0 0 0 0 1 l cos ⁡ 2 ( δ f ) 1 0 ] [ a r δ f ] \dot{p}=f(p)+g(p) u = \left[ \begin{array}{c}v_{r}\cos (\varphi) \\ v_{r} \sin (\varphi) \\ 0 \\ 0 \end{array} \right] + \left[ \begin{array}{c} 0 & 0\\ 0 & 0\\ 0 & \frac{1}{l \cos^2(\delta_f) } \\ 1 & 0 \end{array} \right] \left[ \begin{array}{c} a_r \\ \delta_f \end{array}\right] p˙=f(p)+g(p)u= vrcos(φ)vrsin(φ)00 + 000100lcos2(δf)10 [arδf]

为了简化系统便于后续计算和仿真,在误差允许范围内,对模型进行线性化处理,比如假设 δ f \delta_{f} δf数值较小,进行 tan ⁡ ( δ f ) ≈ δ f \tan (\delta_{f}) \approx \delta_{f} tan(δf)δf的化简。

系统偏差模型

在实现轨迹跟踪目标时,选择参考轨迹上的一点作为目标轨迹点,为了让机器人跟随目标轨迹点,需要将模型线性化并通过坐标变换将目标轨迹点移动至原点,得到系统偏差模型 p ~ ˙ = A p ~ + B u ~ \dot{\tilde{p}}=A \tilde{p}+B \tilde{u} p~˙=Ap~+Bu~ ,通过控制状态偏差收敛到0,就能实现轨迹跟踪的控制目标。
在这里插入图片描述

在实现轨迹跟踪目标时,选择参考轨迹上的一点作为目标轨迹点,为了让机器人跟随目标轨迹点,需要将模型线性化并通过坐标变换将目标轨迹点移动至原点,得到系统偏差模型 p ~ ˙ = A p ~ + B u ~ \dot{\tilde{p}}=A \tilde{p}+B \tilde{u} p~˙=Ap~+Bu~ ,通过控制状态偏差收敛到0,就能实现轨迹跟踪的控制目标。
在这里插入图片描述
取运动学模型
p ˙ = f ~ ( p , u ) = f ( p ) + g ( p ) u = [ v r cos ⁡ ( φ ) v r sin ⁡ ( φ ) v r tan ⁡ ( δ f ) l a r ] \dot{p}=\tilde{f}(p,u)=f(p)+g(p)u=\left[\begin{array}{c}v_{r} \cos (\varphi) \\ v_{r} \sin (\varphi) \\ \frac{v_{r} \tan \left(\delta_{f}\right)}{l} \\ a_{r}\end{array}\right] p˙=f~(p,u)=f(p)+g(p)u= vrcos(φ)vrsin(φ)lvrtan(δf)ar

在实现轨迹跟踪的目标时,在参数已知的参考轨迹上选择一点 ( x r e f , y r e f ) (x_{ref}, y_{ref}) (xref,yref) 作为目标轨迹点,满足
p ˙ r e f = f ~ ( p r e f , u r e f ) \dot{p}_{ref} = \tilde{f} (p_{ref}, u_{ref}) p˙ref=f~(pref,uref)

为了使机器人能够跟随目标轨迹点,使系统状态逐渐收敛至目标轨迹点状态,将模型进行线性化并通过坐标变换将目标轨迹点移动至原点。在系统本身状态处进行泰勒展开,省略高阶项只保留一阶展开,得
p ˙ = f ~ ( p , u ) = f ~ ( p r e f , u r e f ) + ∂ f ~ ( p , u ) ∂ p ∣ p = p r e f ( p − p r e f ) + ∂ f ~ ( p , u ) ∂ u ∣ u = u r e f ( u − u r e f ) \dot{p} = \tilde{f}(p, u) = \tilde{f}(p_{ref}, u_{ref}) + \frac{\partial \tilde{f}(p, u)}{\partial p}|_{p=p_{ref}} (p - p_{ref}) + \frac{\partial \tilde{f}(p, u)}{\partial u}|_{u=u_{ref}} (u - u_{ref}) p˙=f~(p,u)=f~(pref,uref)+pf~(p,u)p=pref(ppref)+uf~(p,u)u=uref(uuref)
其中, ∂ f ~ ∂ p \frac{\partial \tilde{f}}{\partial p} pf~ ∂ f ~ ∂ u \frac{\partial \tilde{f}}{\partial u} uf~ 为雅克比矩阵,具体内容为

∂ f ~ ( p , u ) ∂ p = [ ∂ f ~ 1 ( p , u ) ∂ x ∂ f ~ 1 ( p , u ) ∂ y ∂ f ~ 1 ( p , u ) ∂ φ ∂ f ~ 1 ( p , u ) ∂ v ∂ f ~ 2 ( p , u ) ∂ x ∂ f ~ 2 ( p , u ) ∂ y ∂ f ~ 2 ( p , u ) ∂ φ ∂ f ~ 2 ( p , u ) ∂ v ∂ f ~ 3 ( p , u ) ∂ x ∂ f ~ 3 ( p , u ) ∂ y ∂ f ~ 3 ( p , u ) ∂ φ ∂ f ~ 3 ( p , u ) ∂ v ∂ f ~ 4 ( p , u ) ∂ x ∂ f ~ 4 ( p , u ) ∂ y ∂ f ~ 4 ( p , u ) ∂ φ ∂ f ~ 4 ( p , u ) ∂ v ] = [ 0 0 − v sin ⁡ ( φ ) cos ⁡ ( φ ) 0 0 v cos ⁡ ( φ ) sin ⁡ ( φ ) 0 0 0 tan ⁡ ( δ ) l 0 0 0 0 ] \frac{\partial \tilde{f}(p, u)}{\partial p} = \begin{bmatrix} \frac{\partial \tilde{f}_1(p, u)}{\partial x} & \frac{\partial \tilde{f}_1(p, u)}{\partial y} & \frac{\partial \tilde{f}_1(p, u)}{\partial \varphi} & \frac{\partial \tilde{f}_1(p, u)}{\partial v} \\ \frac{\partial \tilde{f}_2(p, u)}{\partial x} & \frac{\partial \tilde{f}_2(p, u)}{\partial y} & \frac{\partial \tilde{f}_2(p, u)}{\partial \varphi} & \frac{\partial \tilde{f}_2(p, u)}{\partial v} \\ \frac{\partial \tilde{f}_3(p, u)}{\partial x} & \frac{\partial \tilde{f}_3(p, u)}{\partial y} & \frac{\partial \tilde{f}_3(p, u)}{\partial \varphi} & \frac{\partial \tilde{f}_3(p, u)}{\partial v} \\ \frac{\partial \tilde{f}_4(p, u)}{\partial x} & \frac{\partial \tilde{f}_4(p, u)}{\partial y} & \frac{\partial \tilde{f}_4(p, u)}{\partial \varphi} & \frac{\partial \tilde{f}_4(p, u)}{\partial v} \end{bmatrix} = \begin{bmatrix} 0 & 0 & -v\sin(\varphi) & \cos(\varphi) \\ 0 & 0 & v\cos(\varphi) & \sin(\varphi) \\ 0 & 0 & 0 & \frac{\tan(\delta)}{l} \\ 0 & 0 & 0 & 0 \end{bmatrix} pf~(p,u)= xf~1(p,u)xf~2(p,u)xf~3(p,u)xf~4(p,u)yf~1(p,u)yf~2(p,u)yf~3(p,u)yf~4(p,u)φf~1(p,u)φf~2(p,u)φf~3(p,u)φf~4(p,u)vf~1(p,u)vf~2(p,u)vf~3(p,u)vf~4(p,u) = 00000000vsin(φ)vcos(φ)00cos(φ)sin(φ)ltan(δ)0

∂ f ( p , u ) ∂ u = [ ∂ f ~ 1 ( p , u ) ∂ a ∂ f ~ 1 ( p , u ) ∂ δ ∂ f ~ 2 ( p , u ) ∂ a ∂ f ~ 2 ( p , u ) ∂ δ ∂ f ~ 3 ( p , u ) ∂ a ∂ f ~ 3 ( p , u ) ∂ δ ∂ f ~ 4 ( p , u ) ∂ a ∂ f ~ 4 ( p , u ) ∂ δ ] = [ 0 0 0 0 0 v l cos ⁡ ( δ ) 2 1 0 ] \frac{\partial f(p, u)}{\partial u} = \begin{bmatrix} \frac{\partial \tilde{f}_1(p, u)}{\partial a} & \frac{\partial \tilde{f}_1(p, u)}{\partial \delta} \\ \frac{\partial \tilde{f}_2(p, u)}{\partial a} & \frac{\partial \tilde{f}_2(p, u)}{\partial \delta} \\ \frac{\partial \tilde{f}_3(p, u)}{\partial a} & \frac{\partial \tilde{f}_3(p, u)}{\partial \delta} \\ \frac{\partial \tilde{f}_4(p, u)}{\partial a} & \frac{\partial \tilde{f}_4(p, u)}{\partial \delta} \end{bmatrix}= \begin{bmatrix} 0 & 0 \\ 0 & 0 \\ 0 & \frac{v}{l\cos(\delta)^2} \\ 1 & 0 \end{bmatrix} uf(p,u)= af~1(p,u)af~2(p,u)af~3(p,u)af~4(p,u)δf~1(p,u)δf~2(p,u)δf~3(p,u)δf~4(p,u) = 000100lcos(δ)2v0

引入偏差变量
p ~ = p − p r e f u ~ = u − u r e f \tilde{p} = p - p_{ref} \\ \tilde{u} = u - u_{ref} p~=pprefu~=uuref
可得系统偏差模型为
p ~ ˙ = ∂ f ~ ( p , u ) ∂ p p ~ + ∂ f ~ ( p u , ) ∂ u u ~ \dot{\tilde{p}} = \frac{\partial \tilde{f}(p, u)}{\partial p}\tilde{p} + \frac{\partial \tilde{f}(p u,)}{\partial u}\tilde{u} p~˙=pf~(p,u)p~+uf~(pu,)u~
写成状态方程形式为
p ~ ˙ = A p ~ + B u ~ \dot{\tilde{p}} = A\tilde{p} + B\tilde{u} p~˙=Ap~+Bu~
其中,矩阵 A = ∂ f ~ ( p , u ) ∂ p A = \frac{\partial \tilde{f}(p, u)}{\partial p} A=pf~(p,u) B = ∂ f ~ ( p , u ) ∂ u B = \frac{\partial \tilde{f}(p, u)}{\partial u} B=uf~(p,u)。该偏差模型的主要作用是进行系统的轨迹跟踪,控制状态偏差 p ~ \tilde{p} p~ 逐步收敛到 0,即系统状态 p = p r e f p = p_{ref} p=pref,则说明此时系统状态跟踪上目标轨迹点状态,实现轨迹跟踪的控制目标。

### 车辆运动学模型预测控制(MPC)实现与应用 #### 一、车辆运动学模型概述 车辆运动学模型用于描述车辆在二维平面上的运动特性,主要包括位置(x, y),方向角(θ),线速度(v),以及转向角度(δ)[^1]。该模型假设车轮无侧向滑移,即纯滚动条件成立。 对于自行车模型而言,状态方程可表达如下: \[ \dot{x} = v\cos(\theta) \\ \dot{y} = v\sin(\theta) \\ \dot{\theta} = \frac{v}{L}\tan(\delta) \] 其中\( L \)代表轴距长度;而输入变量则由加速度(a)和前轮转角变化率组成[\(^2]^。 ```python import numpy as np def bicycle_model(state, u, dt=0.1): """ Simulate the kinematic model of a vehicle using Euler integration. Args: state (list): Current state [x(m), y(m), yaw(rad), v(m/s)] u (list): Input vector [acceleration(m/s²), delta(rad)] dt (float): Time step Returns: list: Next state after applying input over time interval `dt`. """ x, y, theta, v = state acceleration, delta = u # Update velocity and orientation based on inputs v += acceleration * dt theta += ((v / L) * np.tan(delta)) * dt # Compute new position from updated parameters x += v * np.cos(theta) * dt y += v * np.sin(theta) * dt return [x, y, theta, v] ``` #### 二、MPC 控制器设计思路 模型预测控制是一种先进的反馈控制系统设计方案,在每次采样周期内都会重新规划未来有限时间段内的最优路径,并只执行当前时刻的最佳动作作为实际输出给定值[^3]。具体来说就是构建一个代价函数J,它衡量了预期轨迹偏离目标的程度加上施加控制量的成本因子R乘以其平方和的形式: \[ J=\sum_{k=0}^{N_p}(r_k-x_k)^TQ(r_k-x_k)+u_k^TRu_k \] 这里\( N_p \)指的是预估范围(Prediction Horizon),\( r_k \)为目标参考点序列,\( Q,R \)分别是对偏差惩罚力度矩阵和对控制努力程度约束权重系数的选择。 #### 三、基于 MPC 的控制器实现流程 为了简化问题复杂度并提高计算效率,通常采用线性化处理后的近似版本来进行在线求解优化问题。下面给出了一种简单的 Python 实现方式来展示这一过程的核心逻辑框架: ```python from scipy.optimize import minimize class SimpleMPCController(object): def __init__(self, A, B, C, D, Q, R, P, horizon_length): self.A = A # State transition matrix self.B = B # Control-input to state map self.C = C # Output-to-state mapping self.D = D # Direct feedthrough term self.Q = Q # Weighting matrices for states error cost self.R = R # Weighthing matrice for control effort cost self.P = P # Terminal weighting matrix self.Np = horizon_length # Prediction horizon length def predict(self, current_state, reference_trajectory): """Predict future states given initial condition.""" predicted_states = [] for i in range(len(reference_trajectory)): if not predicted_states: next_state = current_state.copy() else: last_state = predicted_states[-1][-1].copy() next_input = ... # Calculate optimal input here next_state = ( self.A @ last_state + self.B @ next_input ) measured_output = self.C @ next_state + self.D predicted_states.append((next_state.tolist(),measured_output.tolist())) return predicted_states def optimize_control_sequence(self, init_guess=None): """Optimize sequence of controls minimizing objective function""" n_controls = len(init_guess or []) def obj_func(u_seq_flat): u_seq = u_seq_flat.reshape(-1,n_controls) total_cost = sum([ (ref[i]-pred[1])**2@self.Q@(ref[i]-pred[1])+ usq.T@self.R@usq for pred, ref, usq in zip( self.predict(...), references, u_seq )] )+(final_pred[0]-target)**2@self.P@(final_pred[0]-target) return total_cost.item() res = minimize(obj_func,...) optimized_u_seq=res.x[:n_controls*self.Np].reshape((-1,n_controls)) return optimized_u_seq controller = SimpleMPCController(...) optimized_inputs = controller.optimize_control_sequence(initial_guess=[0]*number_of_inputs*horizon_length) ``` 上述代码片段展示了如何定义一个基本的 MPC 类及其主要功能——`predict()`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值