【MPC练习】差速底盘使用MPC跟踪路径1/2——模型建立


前言

本文记录了自己用于学习MPC控制移动底盘的代码,目的在于学习移动底盘运动模型的建立和使用CppAD库求解控制量以使得底盘可以跟踪预先给定的路径。

为了简单起见,选取了最简单的差速底盘作为对象,而不是阿克曼底盘。

实现效果:

mpc-1

整体代码运行在ROS


零、涉及到的坐标系

在这里插入图片描述
在路径跟踪中主要涉及到3个坐标系

  • 全局坐标系 World
  • 机器人底盘坐标系 Robot
  • 参考轨迹中的frenet坐标 Frenet

一、控制量

差速底盘的控制量非常简单:
U = [ v x , ω ] \bm{U}=[v_x, \omega] U=[vx,ω] 其中 v x v_x vx是在车坐标系下沿x轴方向的速度, ω \omega ω为旋转角速度。

二、状态变量

为了跟踪路径,设置状态变量如下:
X = [ x , y , δ , c t e , p e s i ] \bm{X}=[x, y, \delta, cte, pesi] X=[x,y,δ,cte,pesi]这里面最主要的问题是确定状态变量是处于哪个坐标系

为了更好表示车辆和轨迹之间的误差,选择将状态在frenet坐标系下表示。

补充有很多路径跟踪MPC的实现选用了在机器人底盘坐标系下进行实现,可以理解为“线找车”,将底盘坐标系作为参考,这样就需要重新定义误差(其实就是取相反值),两种状态变量所在坐标系的选择方式在工程中的表现还有待测试。

在这里插入图片描述
x x x: frenet坐标系下x坐标

y y y: frenet坐标系下y坐标

δ \delta δ: frenet坐标系下 车辆的航向角

c t e cte cte: frenet坐标系下 车辆对于轨迹的横向偏离误差

p e s i pesi pesi: frenet坐标系下航向角的偏离误差

这里我在一开始有一个绕进去的点,从图中看, c t e cte cte的值就是 y y y的值, p e s i pesi pesi的值就是 δ \delta δ的值。所以似乎不需要这两个值,但是实际上在这一时刻进行预测控制的时候,会生成多个预测的状态,而这些预测状态中的 x x x, y y y, δ \delta δ都是在这一时刻的frenet坐标系下,如果以目标是使 y y y , δ \delta δ为0,则会导致预测以这一时刻的 X F X_F XF轴为参考曲线。

x x x, y y y, δ \delta δ更新方式不同,在进行这一时刻的 c t e cte cte p e s i pesi pesi的值的预测的时候,会把轨迹的变化情况作为参考值进行更新加入更新的方程中。其中轨迹的变化情况可以使用3次或者5次多项式曲线的方式对离散的坐标点进行描述。

c t e cte cte p e s i pesi pesi的表示与参考轨迹的变化有关(误差 = 测量值 - 参考值):
c t e k = y k − y r e f e p s i k = δ k − δ r e f cte_k = y_k -y_{ref} \\ epsi_k = \delta_k - \delta_{ref} \\ ctek=ykyrefepsik=δkδref当使用多项式曲线对轨迹进行拟合参数化之后,参考轨迹在 x k x_k xk处的横向距离 y r e f y_{ref} yref的值为 f ( x k ) f(x_k) f(xk)

而在 x k x_k xk处的航向角参考值为 a r c t a n ( f ′ ( x k ) ) arctan(f'(x_k)) arctan(f(xk)),换言之,曲线上各处的参考值的变化是由 x x x的函数。

三、微分约束

x ˙ = v x c o s δ y ˙ = v x s i n δ δ ˙ = ω \dot{x} = v_x cos\delta \\ \dot{y} = v_x sin\delta \\ \dot{\delta} = \omega \\ x˙=vxcosδy˙=vxsinδδ˙=ω控制量 v x v_x vx在frenet坐标系下对机器人在x轴,y轴变化的贡献量,以及角速度 ω \omega ω对于 δ \delta δ贡献量显而易见。
在这里插入图片描述
但是控制是离散的,所以需要将运动模型的更新和误差的更新离散化(省略速度控制量 v x v_x vx的下标x):
x k + 1 − x k = v k ⋅ c o s δ ⋅ d t y k + 1 − y k = v k ⋅ s i n δ ⋅ d t δ k + 1 − δ k = ω k ⋅ d t c t e k + 1 − c t e k = v k ⋅ s i n δ ⋅ d t e p s i k + 1 − e p s i k = ω k ⋅ d t x_{k+1}-x_k = v_k\cdot cos\delta \cdot dt \\ y_{k+1}-y_k = v_k \cdot sin\delta \cdot dt \\ \delta_{k+1}-\delta_k = \omega_k \cdot dt \\ cte_{k+1} - cte_k = v_k \cdot sin\delta \cdot dt \\ epsi_{k+1} - epsi_k = \omega_k \cdot dt xk+1xk=vkcosδdtyk+1yk=vksinδdtδk+1δk=ωkdtctek+1ctek=vksinδdtepsik+1epsik=ωkdt离散化后的模型建立了时间上相邻的两个状态之间的关系。实际底盘的移动需要满足这一组模型。

对于误差的更新,不妨将参考值的表示加入进来:
c t e k + 1 = y k − y r e f + v k ⋅ s i n δ ⋅ d t e p s i k + 1 = δ k − δ r e f + ω k ⋅ d t cte_{k+1} = y_k - y_{ref} + v_k \cdot sin\delta \cdot dt \\ epsi_{k+1} = \delta_k - \delta_{ref} + \omega_k \cdot dt ctek+1=ykyref+vksinδdtepsik+1=δkδref+ωkdt我对于这两个式子的理解是,在 k + 1 k+1 k+1时刻的误差,是上一时刻 k k k的误差加上两个时刻之间相应状态或者控制量的对误差的影响。

上边建立的微分关系将会作为优化问题的等式约束加入进去。

四、目标函数

  • 控制量尽可能小
    J 1 = ∑ k N p − 1 ( w v ⋅ ( v k − v r e f ) 2 + w ω ⋅ ( ω k ) 2 ) J_1 = \sum_k^{N_p - 1}( w_v \cdot(v_k - v_{ref})^2 + w_{\omega} \cdot(\omega_k)^2) J1=kNp1(wv(vkvref)2+wω(ωk)2)
  • 跟踪误差尽可能小
    J 2 = ∑ k N p ( w c t e ⋅ ( c t e k ) 2 + w e p s i ⋅ ( e p s i k ) 2 ) J_2 = \sum_k^{N_p}( w_{cte} \cdot(cte_k)^2 + w_{epsi} \cdot(epsi_k)^2) J2=kNp(wcte(ctek)2+wepsi(epsik)2)其中 N p N_p Np是预测的步长,控制量减一是因为最后一个时间不长可以不预测。

最基础可以使用 J 1 + J 2 J_1 + J_2 J1+J2作为最小化的目标函数,如果想要更平滑一些,也可以限制相邻控制量之间的变化等等。

参考

参考文章

参考代码

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 四轮差速小车是一种常用的移动机器人,由四个驱动轮组成,每个驱动轮都可以独立地控制转动速度。为了建立四轮差速小车的运动学模型,我们可以采用基于约束的模型预测控制(Model Predictive Control,MPC)方法。 首先,我们需要定义小车的状态和输入。小车的状态可以用位姿(位置和朝向)以及线速度和角速度表示。输入是驱动轮的转动速度。 接下来,我们可以根据小车的几何特征和运动学关系来建立运动学模型。对于每个驱动轮,我们可以根据其位置和转动速度计算其的线速度和角速度。由于四轮差速小车是非完整约束系统,即存在轮子之间的约束条件,我们还需要考虑两组轮子之间的转动速度差。 然后,我们可以采用离散化的方式建立MPC模型。首先,我们将连续时间离散化为离散时间,通过选择合适的采样周期。然后,在每个离散时间步长内,我们根据当前状态和输入计算出下一个状态和输出,并更新控制器的输出。最后,我们可以使用优化算法(如二次规划)来求解最优控制输入,以使得系统向着期望的目标状态运动。 最后,我们需要设置适当的目标和约束条件。目标可以是使小车达到某个指定位置或者遵循某个规划轨迹。约束条件可以包括小车的物理限制、转动速度的范围限制等。 通过建立四轮差速小车的MPC运动学模型,我们可以在每个离散时间步长内计算出最优的转动速度,从而实现小车的准确控制和轨迹跟踪。这种模型可以广泛应用于自动驾驶、移动机器人导航等领域。 ### 回答2: 四轮差速小车是一种常见的机器人底盘结构,具有较好的机动性能和灵活性。为了进行运动规划和控制,需要建立其运动学模型。 四轮差速小车的运动学模型可以分为整体运动学和轮子运动学两个部分。 整体运动学部分描述了小车整体的运动关系。设小车的中心坐标为(x, y),角度为θ,通过计算可以得到小车的位置和姿态的变化关系。具体地,位置的变化可以通过机器人底盘的速度信息计算得到,即: dx = v * cos(θ) * dt dy = v * sin(θ) * dt 其中,v为小车的线速度,θ为小车的转角,dt为时间间隔。角度的变化可以根据小车两侧各自的转速ωL和ωR计算得到,即: dθ = (ωR - ωL) * l / w * dt 其中,l为小车两轮之间的距离,w为小车两个轮子的距离。 轮子运动学部分描述了轮子的运动关系。对于差速小车,它的轮子由两侧各一个,可以计算出每个轮子的转速ωL和ωR。具体地,ωL和ωR与小车的线速度v和角速度dθ的关系可以通过小车运动学模型计算得到,即: v = (ωL + ωR) * r / 2 dθ = (ωR - ωL) * r / w 其中,r为轮子的半径。 通过整体运动学和轮子运动学的计算,我们就可以建立四轮差速小车的MPC运动学模型。这个模型可以用来进行轨迹规划、路径跟踪、避障等运动控制任务。在实际应用中,还可以通过实时测量的数据不断更新模型,以提高控制的准确性和鲁棒性。 ### 回答3: 四轮差速小车是一种基于差速驱动的移动平台,它具有四个轮子,两个靠近一侧的轮子可以独立地驱动。为了建立四轮差速小车的运动学模型,我们需要考虑车辆的转向和运动。 首先,我们定义车辆的坐标系。假设车辆的中心点为原点O,x轴与车辆前进方向平行,y轴与车辆左侧平行。车辆的朝向角度为θ,角度为正表示顺时针旋转。 其次,我们定义车辆的速度和转向控制输入。车辆的线速度为v,表示车辆前进的速度;车辆的角速度控制为ω,表示车辆的转向速度。 根据差速驱动的性质,我们可以将车辆的速度和转向控制输入与车辆各个轮子的线速度和角速度联系起来。假设左右两个靠近一侧的轮子的线速度分别为v1和v2,则左右两个轮子的角速度分别为ω1 = v1/R 和 ω2= v2/R,其中R为车轮的半径。 根据四轮差速小车的运动学模型,我们可以得到车辆的运动方程: v = (v1 + v2) / 2 ω = (v2 - v1) / (2L) 其中L为轴距,表示两个靠近一侧轮子之间的距离。 通过以上方程,我们可以根据给定的线速度和角速度控制输入,计算出左右两个靠近一侧轮子的线速度v1和v2。然后根据v1和v2,我们可以得到车辆的整体线速度v和角速度ω。 最后,根据车辆的线速度和角速度,我们可以通过积分的方法得到车辆在特定时间段内的位置和朝向。 四轮差速小车的mpc运动学模型建立包括了车辆的坐标系定义、速度和转向控制输入、轮子线速度和角速度的关系以及车辆的运动方程等。通过这个模型,我们可以控制车辆的运动,实现特定的路径跟踪和轨迹规划。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值