四轮全向轮底盘运动学推导

四轮全向轮底盘运动学推导

符号定义

在这里插入图片描述

X ˙ \dot{X} X˙:底盘绝对坐标系下X方向速度

Y ˙ \dot{Y} Y˙:底盘绝对坐标系下Y方向速度

u u u:底盘在自身坐标系下x方向运动速度

v v v:底盘在自身坐标系下y方向运动速度

θ \theta θ:底盘自身坐标系x轴与绝对坐标系X轴的夹角

ω \omega ω:自转角速度

L L L:轮子到中心的距离

v 1 v_1 v1 ~ v 4 v_4 v4:四个轮子的速度

公式推导

V ⃗ = u ⃗ + v ⃗ = X ˙ ⃗ + Y ˙ ⃗ \vec{V}=\vec{u}+\vec{v}=\vec{\dot{X}}+\vec{\dot{Y}} V =u +v =X˙ +Y˙

{ X ˙ cos ⁡ θ + Y ˙ sin ⁡ θ = u Y ˙ cos ⁡ θ − X ˙ sin ⁡ θ = v θ ˙ = ω \left\{\begin{array}{c} \dot{X} \cos \theta+\dot{Y} \sin \theta=u \\ \dot{Y} \cos \theta-\dot{X} \sin \theta=v \\ \dot{\theta}=\omega \end{array}\right. X˙cosθ+Y˙sinθ=uY˙cosθX˙sinθ=vθ˙=ω

[ u v ω ] = [ cos ⁡ θ sin ⁡ θ 0 − sin ⁡ θ cos ⁡ θ 0 0 0 1 ] [ X ˙ Y ˙ θ ˙ ] \left[\begin{array}{l} \mathrm{u} \\ \mathrm{v} \\ \omega \end{array}\right]=\left[\begin{array}{ccc} \cos \theta & \sin \theta & 0 \\ -\sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} \dot{X} \\ \dot{Y} \\ \dot{\theta} \end{array}\right] uvω = cosθsinθ0sinθcosθ0001 X˙Y˙θ˙

{ v 1 = 2 2 v − 2 2 u + ω L v 2 = − 2 2 v − 2 2 u + ω L v 3 = − 2 2 v + 2 2 u + ω L v 4 = 2 2 v + 2 2 u + ω L \left\{\begin{array}{l} v_1=\frac{\sqrt{2}}{2} v-\frac{\sqrt{2}}{2} u+\omega L \\ v_2=-\frac{\sqrt{2}}{2} v-\frac{\sqrt{2}}{2} u+\omega L \\ v_3=-\frac{\sqrt{2}}{2} v+\frac{\sqrt{2}}{2} u+\omega L \\ v_4=\frac{\sqrt{2}}{2} v+\frac{\sqrt{2}}{2} u+\omega L \end{array}\right. v1=22 v22 u+ωLv2=22 v22 u+ωLv3=22 v+22 u+ωLv4=22 v+22 u+ωL

[ v 1 v 2 v 3 v 4 ] = [ − 2 2 2 2 L − 2 2 − 2 2 L 2 2 − 2 2 L 2 2 2 2 L ] [ u v ω ] \left[\begin{array}{l} \mathrm{v}_1 \\ \mathrm{v}_2 \\ \mathrm{v}_3 \\ \mathrm{v}_4 \end{array}\right]=\left[\begin{array}{ccc} -\frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & L \\ -\frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & L \\ \frac{\sqrt{2}}{2} & -\frac{\sqrt{2}}{2} & L \\ \frac{\sqrt{2}}{2} & \frac{\sqrt{2}}{2} & L \end{array}\right]\left[\begin{array}{l} u \\ v \\ \omega \end{array}\right] v1v2v3v4 = 22 22 22 22 22 22 22 22 LLLL uvω

= 2 2 [ − 1 1 L − 1 − 1 L 1 − 1 L 1 1 L ] [ u v ω ] =\frac{\sqrt{2}}{2}\left[\begin{array}{ccc} -1 & 1 & L \\ -1 & -1 & L \\ 1 & -1 & L \\ 1 & 1 & L \end{array}\right]\left[\begin{array}{l} u \\ v \\ \omega \end{array}\right] =22 11111111LLLL uvω

= 2 2 [ − 1 1 L − 1 − 1 L 1 − 1 L 1 1 L ] [ cos ⁡ θ sin ⁡ θ 0 − sin ⁡ θ cos ⁡ θ 0 0 0 1 ] [ X ˙ Y ˙ θ ˙ ] =\frac{\sqrt{2}}{2}\left[\begin{array}{ccc} -1 & 1 & L \\ -1 & -1 & L \\ 1 & -1 & L \\ 1 & 1 & L \end{array}\right]\left[\begin{array}{ccc} \cos \theta & \sin \theta & 0 \\ -\sin \theta & \cos \theta & 0 \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{c} \dot{X} \\ \dot{Y} \\ \dot{\theta} \end{array}\right] =22 11111111LLLL cosθsinθ0sinθcosθ0001 X˙Y˙θ˙

= 2 2 [ − cos ⁡ θ − sin ⁡ θ − sin ⁡ θ + cos ⁡ θ L − cos ⁡ θ + sin ⁡ θ − sin ⁡ θ − cos ⁡ θ L cos ⁡ θ + sin ⁡ θ sin ⁡ θ − cos ⁡ θ L − cos ⁡ θ − sin ⁡ θ sin ⁡ θ + cos ⁡ θ L ] [ X ˙ Y ˙ θ ˙ ] =\frac{\sqrt{2}}{2}\left[\begin{array}{ccc} -\cos \theta-\sin \theta & -\sin \theta+\cos \theta & L \\ -\cos \theta+\sin \theta & -\sin \theta-\cos \theta & L \\ \cos \theta+\sin \theta & \sin \theta-\cos \theta & L \\ -\cos \theta-\sin \theta & \sin \theta+\cos \theta & L \end{array}\right]\left[\begin{array}{c} \dot{X} \\ \dot{Y} \\ \dot{\theta} \end{array}\right] =22 cosθsinθcosθ+sinθcosθ+sinθcosθsinθsinθ+cosθsinθcosθsinθcosθsinθ+cosθLLLL X˙Y˙θ˙

参考程序

void chassis_move(float target_speed, float target_dir, float target_omega)
{
    /********直接计算方法********/
    float speed_cal[4];
    float sin_ang = sin(chassis.angle);
    float cos_ang = cos(chassis.angle);
    float speed_X = target_speed * cos(target_dir);
    float speed_Y = target_speed * sin(target_dir);

    speed_cal[0] = ((-cos_ang - sin_ang) * speed_X + (-sin_ang + cos_ang) * speed_Y + chassis.Radius * target_omega) / sqrt(2);
    speed_cal[1] = ((-cos_ang + sin_ang) * speed_X + (-sin_ang - cos_ang) * speed_Y + chassis.Radius * target_omega) / sqrt(2);
    speed_cal[2] = ((cos_ang + sin_ang) * speed_X + (sin_ang - cos_ang) * speed_Y + chassis.Radius * target_omega) / sqrt(2);
    speed_cal[3] = ((cos_ang - sin_ang) * speed_X + (sin_ang + cos_ang) * speed_Y + chassis.Radius * target_omega) / sqrt(2);
    int speed_out[4] = {0, 0, 0, 0};
    for (int i = 0; i < 4; i++)
{
    speed_out[i] = (int)speed_cal[i];
    }
    chassis.SetMotorSpeed(speed_out);
}

底盘四轮差速是指车辆通过控制四个车轮的转速来实现方向调整和运动状态的变化的一种控制方式。在底盘四轮差速模型中,车辆的运动学可以通过以下几个参数来描述: 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; } ``` 上述代码实现了一个简单的底盘四轮差速模型,可以通过调整加速度和横向加速度来模拟车辆的运动状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值