AGV-麦克纳姆轮小车控制总结

首先,这篇文章是看了各位大神的博客,然后自己把自己的思路总结记录下来,其中有很多图片以及公式,是拷贝自这些大神的博客,在此表示感谢!!!

麦克纳姆轮介绍

麦克纳姆轮
首先,上个图,麦克纳姆轮和普通的轮子是不同的,可以看出,麦轮是由轮毂轴和辊子组成的,一般使用的麦轮,轮毂轴和辊子的轴成45°角,不过其实是制作成各种角度的,这里就只介绍常用的麦轮。

安装方式

麦轮一般都是四个一组使用,两个左旋轮,两个右旋轮,具体区别如下图所示
在这里插入图片描述
麦轮安装方式,分为X型或者O型,
X型
O型
X型安装方式,会导致旋转力矩很小或者无法旋转(四个轮子安装位置为正方形)的情况发生,因此,本文只针对O型安装方式麦轮来进行分析。

不同行驶状况下的受力情况

以下的图中,小车三角形一侧为车头,另一边为车尾。
所有的实线都是轮子的所受的摩擦力,虚线为摩擦力沿着XY轴的分解力。
图中红色线表示车轮向前旋转,蓝色表示车轮向后旋转。

前后行驶

前后行驶
左侧----向前移动
右侧----向后移动

左右平移

左右平移
左侧----向左平移
右侧----向右平移

原地旋转

在这里插入图片描述
左侧----顺时针旋转
右侧----逆时针旋转

斜方向移动

在这里插入图片描述
左侧----前方左45°移动
右侧----前方右45°移动
在这里插入图片描述
左侧----后方左45°移动
右侧----后方右45°移动
麦轮小车斜着移动的时候,只需要旋转对角线上的两个轮子即可。

麦克纳姆轮正逆运动学模型

以O型的安装方式为例,四个轮子的着地点形成一个矩形,或者正方形,由于加工精度等限制,很难做到四个麦轮安装位置成正方形,并且正方形的安装方式对于车身的控制并没有太大的优势,所以矩形安装方式即可。
AGV小车的运动状态,可以通过三个量来进行描述 v x , v y , ω v v_x,v_y,\omega_v vx,vy,ωv,即是 X 轴方向上的平动,Y 轴方向的平动,以及围绕 Z 轴旋转(逆时针方向为正)。麦轮的四个轮子需要用四个电机独立进行控制,并且四个轮子的速度存在约束,逆运动学方程存在唯一解,正运动方程如果不满足这个约束,则会无解。
直接上图吧,俯视图如下,四个麦轮平行于X轴的方向安装,从AGV左上角开始逆时针开始,分别为四个麦轮编号为1,2,3,4,r 为轮毂半径, θ n \theta_n θn 为麦轮n辊子轴线与X轴线之间的夹角(就是辊子的偏置安装角,大小为45°), X n , Y n X_n,Y_n Xn,Yn 为麦轮n的中心点位置

运动学方程

逆运动学(Inverse Kinematic Model)方程,根据期望AGV小车的运动状态求解出四个麦轮的转速以及转向。
正运动学(Forward Kinematic Model)方程,根据四个麦轮的运动状态来预估小车整体的运动状态。
这里介绍一种最简单的计算方式,即将三个正交的底盘运动方向 v x , v y , ω v v_x,v_y,\omega_v vx,vy,ωv进行线性叠加的方式。

因为,底盘安装方式是O型安装

X轴方向运动

AGV向前运动时,只需要四个电机以轮毂轴心为圆心,向X轴正方向旋转麦轮,
向后运动时,只需要四个电机以轮毂轴心为圆心,向X轴负方向旋转麦轮,
此时,底盘期望速度只有X轴方向的速度, V → \overrightarrow{V} V 是小车的状态向量
V → = [ v x , 0 , 0 ] \overrightarrow{V} = \begin{bmatrix} v_x,0,0 \end{bmatrix} V =[vx,0,0]
可以得到此时的四个麦轮的期望转速, k x k_x kx为系数,需根据实际情况整定
{ v 1 = v x ∗ k x v 2 = v x ∗ k x v 3 = v x ∗ k x v 4 = v x ∗ k x \begin{cases} v_1 = v_x*k_x \\ v_2 = v_x*k_x \\ v_3 = v_x*k_x \\ v_4 = v_x*k_x \end{cases} v1=vxkxv2=vxkxv3=vxkxv4=vxkx

Y轴方向运动

AGV小车需要沿着Y轴正方向运动时,1、 3号轮沿着轮毂轴向着X轴负方向旋转,2 、4号轮沿着轮毂轴向着X轴正方向旋转;小车需要沿着Y轴负方向运动时,1、 3号轮和2 、4号轮的旋转方向相反。

此时,底盘期望速度只有Y轴方向的速度,小车的状态向量为
V → = [ 0 , v y , 0 ] \overrightarrow{V} = \begin{bmatrix} 0,v_y,0 \end{bmatrix} V =[0,vy,0]
可以得到此时的四个麦轮的期望转速, k x k_x kx为系数,需根据实际情况整定
{ v 1 = − v y ∗ k y v 2 = v y ∗ k y v 3 = − v y ∗ k y v 4 = v y ∗ k y \begin{cases} v_1 = -v_y*k_y \\ v_2 = v_y*k_y \\ v_3 = -v_y*k_y \\ v_4 = v_y*k_y \end{cases} v1=vykyv2=vykyv3=vykyv4=vyky

Z轴旋转

首先,Z轴是XY交点指向小车顶部为正方向,需要小车逆时针旋转的话,1、 2轮向X轴正方向旋转,3、 4轮向X轴负方向旋转;顺时针旋转的话,1、 2轮和3、 4轮的旋转方向相反。
小车此时的状态向量为
V → = [ 0 , 0 , ω v ] \overrightarrow{V} = \begin{bmatrix} 0,0,\omega_v \end{bmatrix} V =[0,0,ωv]
四个麦轮的转速为
{ v 1 = − ω v ∗ ( a + b ) v 2 = − ω v ∗ ( a + b ) v 3 = ω v ∗ ( a + b ) v 4 = ω v ∗ ( a + b ) \begin{cases} v_1 = -\omega_v*(a+b) \\ v_2 = -\omega_v*(a+b) \\ v_3 = \omega_v*(a+b) \\ v_4 = \omega_v*(a+b) \end{cases} v1=ωv(a+b)v2=ωv(a+b)v3=ωv(a+b)v4=ωv(a+b)
式中,a为任意一个麦轮到X轴的距离,b为任意一个麦轮到Y轴的距离。

合成速度

综合上述,可以有AGV小车的状态向量为
V → = [ v x , v y , ω v ] \overrightarrow{V} = \begin{bmatrix} v_x,v_y,\omega_v \end{bmatrix} V =[vx,vy,ωv]
对应的麦轮转速为

{ v 1 = v x ∗ k x − v y ∗ k y − ω v ∗ ( a + b ) v 2 = v x ∗ k x + v y ∗ k y − ω v ∗ ( a + b ) v 3 = v x ∗ k x − v y ∗ k y + ω v ∗ ( a + b ) v 4 = v x ∗ k x + v y ∗ k y + ω v ∗ ( a + b ) \begin{cases} v_1 = v_x*k_x-v_y*k_y-\omega_v*(a+b) \\ v_2 = v_x*k_x+v_y*k_y-\omega_v*(a+b) \\ v_3 = v_x*k_x-v_y*k_y+\omega_v*(a+b) \\ v_4 =v_x*k_x+v_y*k_y+ \omega_v*(a+b) \end{cases} v1=vxkxvykyωv(a+b)v2=vxkx+vykyωv(a+b)v3=vxkxvyky+ωv(a+b)v4=vxkx+vyky+ωv(a+b)

最后,单单做好运动模型的分解是不够的,实际控制过程中,需要电机快速的响应到期望的转速,这样就必须要求对每个电机加上一层PID控制,当然其他的控制也可以,保证电机响应迅速就可以。

### 麥輪小車原地旋轉脈衝模式實現原理 麥倫小車在進行原地旋轉時,利用四個麥克納輪的不同方向運動來達成。每個輪子可以獨立控制其轉動方向和速度,從而使得小車能夠在同一點上完成旋轉動作。 當採用脈沖模式(即通過計數器記錄電機軸的轉角變化量)來實現這種操作時,系統會根據目標角度計算所需的總脈沖數目並分配給各個驅動電機。這樣做不僅能精確控制旋轉角度,還可提高位置精度與響應速度[^1]。 具體來說,在啟動前需設置好初始參考坐標系以及期望達到的角度偏移值;運行過程中不斷讀取來自編碼器反饋回來的位置數據,經過處理後得到實際發生了多少度的轉變;最後將此結果與預期設定相比較,調整輸出至馬達的指令信號直至誤差趨近於零為止[^3]。 ```cpp // 假设我们有一个函数来获取编码器读数并转换为角度变化 double getEncoderAngleChange(int motorIndex); void rotateInPlace(double targetDegrees) { double currentDegreeSum = 0; while (abs(currentDegreeSum - targetDegrees) > TOLERANCE_DEGREE) { for (int i = 0; i < NUM_MOTORS; ++i){ // 获取当前电机转过的角度增量 double angleDelta = getEncoderAngleChange(i); // 更新累计转动角度 currentDegreeSum += angleDelta * DIRECTION[i]; // 考虑不同子的方向 // 计算误差并调整PWM输出给对应马达 adjustMotorSpeedBasedOnError(targetDegrees - currentDegreeSum, i); } delay(LOOP_DELAY_MS); // 控制循环频率 } } ``` 上述代码片段展示了如何基于脉冲反馈机制实现原地旋转功能的一部分逻辑。这里假设存在`getEncoderAngleChange()` 函数用于获得指定编号电极所对应的最新角度改变量,并且有 `adjustMotorSpeedBasedOnError()` 方法负责依据当前位置偏差修正发送到相应驱动单元的速度命令。 --相關問題-- 1. 如何校准麥克納輪小車上的編碼器以確保準確測量? 2. 在設計麥克納輪小車時有哪些關鍵因素需要考慮? 3. 使用PID控制器對於提升麥克納輪小車性能有何幫助? 4. 對於非理想地面情況下,麥克納輪小車應該採取什麼樣的策略來保持穩定性?
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值