两轮差速底盘的运动模型分析:运动控制与里程计解算

  • 45
    点赞
  • 322
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
两轮差速机器⼈运动学模型 两轮差速底盘 1.1、底盘说明 两轮差速底盘由两个动⼒轮位于底盘左右两侧,两轮独⽴控制速度,通过给定不同速度实现底盘转向控制。⼀般会配有⼀到两个辅助⽀撑的 万向轮。 主要底盘有: 1、Turtlebot; 2、扫地机器⼈; 3、⽆⼈仓AGV⼩车; 4、轮椅; 底盘主要特点: 1、控制简单、⾥程计计算简单。 2、只能给定X⽅向速度、Z轴⽅向⾓速度。 1.2 底盘运动学分析 1.2.1、底盘模型 图1.2.1 常见的两轮差速底盘模型 1.2.2、机器⼈本⾝约束⽅程(物理特性) 图1.2.2 a 左侧是车的两个轮⼦,右侧带箭头的圆圈是运动的⽅向和运动的圆⼼ 图 1.2.2 b 两轮底盘运动解析图 如图1.2.2所⽰:车体速度为V, 左轮速度为VL ,右轮速度为VR , 车体⾃传速度为,转弯半径为R,两轮之间距离为D,两轮到车中⼼的距离为 d,右轮到圆⼼距离为L。 约束⽅程(⾼中知识): 、⾓速度、速度和运动半径之间的物理关系。 、左轮速度分解 、右轮速度分解 、和速度V等于左右轮速度之和的⼀半。 、由 、 得 得 整车⾓速度和两轮速度之间的关系 1.3、运动控制、控制指令分解 控制指令分解指如何通过控制左右两个轮的独⽴速度使整个机器⼈的整体运动既满⾜前向速度等于V,转动的⾓速度等于 图1.2.3 运动控制的输⼊、输出参数说明 如图1.2.3所⽰,运动控制器输⼊参数为整车速度Vx和⾓速度(因为轮⼦不能横着⾛所以Vy⼀直为零),输出参数是左右两轮速度VL 、 VR。转弯半径R则由左右轮速度决定。 由约束⽅程 、 得: 左轮速度为: (d为两轮之间距离的⼀半) 右轮速度为: 1.4、运动轨迹、⾥程计计算 图1.2.4 上电时刻机器⼈坐标系和世界坐标系重合 ⾥程计(odom)计算是指以机器⼈上电时刻为世界坐标系的起点O(0,0)(航向为世界坐标系的X轴指向)累积计算任意时刻机器⼈相对于 世界坐标系的位置及航向。 机器⼈的位置Pose.Xw、Pose.Yw的值可以看成是车体运动⽅向极⼩时间内位置增量分解到X、Y⽅向的积分量。 图1.2.5 机器⼈在世界坐标系的位置 此时分两种⽅式来推算轨迹:速度推算⽅式、编码器推算⽅式 I、速度推算轨迹:(速度积分累积误差较⼤,最终精度在10%左右) 在机器⼈坐标系下,单位时间 t(⼀个控制周期: t = ti+1 - ti,通常为10ms、20ms)以速度V移动的距离为 d = t*V。将此距离分 别分解到世界坐标系的X、Y轴: xw = d * cos(θ)= t * V * cos(θ) yw = d * sin(θ)= t * V * sin(θ) 同时单位时间⾓度变化为 θ = * t。 以此⽅式不断累积,即可实现任意时间的位置解算。 *Xw = Xw + xw = Xw + t * V * cos(θ) Yw = Yw + yw = Yw + t * V * sin(θ) θ = θ + t II、编码器推算轨迹:(直接对距离做分解累积误差相对较⼩,最终精度1%以内,如果做修正,同时航向⾓较准确的情况下精度可以达到 0.1%以内(已经实测)) 编码器每⼀个脉冲对应实际轮⼦⾏⾛的直线距离系数为: rate_encoder = 2 r/sum_encoders 其中r为车轮半径,sum_encoders为轮⼦⾛动⼀圈的编码器的脉冲总数。 单位时间 t内编码的增量为:inc_encoder = encoder_now – encoder_last,(当前编码器值减去上次编码器值) 则单位时间机器⼈移动的距离为 d = inc_encoder * rate_encoder 世界坐标系下x、y⽅向累计⾥程分别为: Xw = Xw + xw = Xw + d * cos(θ) Yw = Yw + yw = Yw + d * sin(θ) 其中航向⾓θ的获取分两种情况: A、底盘带具有稳定航向⾓的IMU,此⽅式可以使得最终解算的位置⼗分准确(电⼦罗盘受电机⼲扰交⼤不可⽤) θ直接等于IMU的航向⾓Yaw。(IMU的Yaw上电为0,刚好和车的航向⾓⼀致) B、依靠底盘两个轮⼦上精确的编码器推算航向⾓。 两轮编码器单位时间内增量分别为 inc_encoder_r、inc_encoder_l 单位时间内两轮扭动的距离差为 lenth_error = (inc_encoder_r- inc_encoder_l) * rate_encoder; 由 得:由距离差得单位时间内⾓度差为 anlge_z_error = lenth_error / 2d; 根据编码器累计的⾓度θ为 anlge_z += anlge_z_error。 此⽅式⾮常依赖编码器精度,有累计误差,效果不如直接使⽤IMU的好。
底盘四轮差速是指车辆通过控制四个车轮的转速来实现方向调整和运动状态的变化的一种控制方式。在底盘四轮差速模型中,车辆的运动学可以通过以下几个参数来描述: 1. 位置:车辆在平面坐标系下的位置,可以用(x,y)表示。 2. 姿态:车辆在平面坐标系下的朝向,可以用theta表示。 3. 速度:车辆的前进速度,可以用v表示。 4. 转角:车辆前轮的转角,可以用delta表示。 在底盘四轮差速模型中,车辆的运动学可以通过以下几个方程来描述: 1. 位置更新: x = x + v * cos(theta) * dt y = y + v * sin(theta) * dt 2. 姿态更新: theta = theta + v * tan(delta) / L * dt 其中L表示车辆的轴距。 3. 速度更新: v = v + a * dt 其中a表示车辆的加速度。 4. 转角更新: delta = atan2(2 * L * sin(alpha), d) 其中alpha表示车辆的横向加速度,d表示车辆的轨迹半径。 代码实现: ``` #include <iostream> #include <cmath> using namespace std; const double L = 2.5; // 轴距 const double dt = 0.1; // 时间步长 // 计算车辆的运动学参数 void update(double& x, double& y, double& theta, double& v, double& delta, double a, double alpha) { x = x + v * cos(theta) * dt; y = y + v * sin(theta) * dt; theta = theta + v * tan(delta) / L * dt; v = v + a * dt; double d = v * dt; double beta = atan2(L * tan(delta), 1.0); double r = L / tan(beta + alpha); delta = atan2(L * tan(delta), r); } int main() { double x = 0, y = 0, theta = 0, v = 10, delta = 0; double a = 2, alpha = 0.1; for (int i = 0; i < 100; i++) { update(x, y, theta, v, delta, a, alpha); cout << "x = " << x << ", y = " << y << ", theta = " << theta << ", v = " << v << ", delta = " << delta << endl; } return 0; } ``` 上述代码实现了一个简单的底盘四轮差速模型,可以通过调整加速度和横向加速度来模拟车辆的运动状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值