项目开源至Github:four_wheel_steering_mobile_robot

本文分析四舵轮移动机器人底盘的运动学逆解。

四舵轮底盘拥有8个自由度,每个舵轮都是双关节结构,分为舵轮的旋转和舵轮驱动轮的转动。由此,四舵轮底盘可以产生原地旋转、蟹行的平动、两后轮保持前向固定而两前轮转动的传统阿克曼结构、以及后轮参与转向的双阿克曼结构这四种运动方式。

运动学逆解是根据输入的机器速度 v x v_x vx v y v_y vy w w w,反推四舵轮的角度和转速。
这里先分析双阿克曼结构,分析完会发现双阿克曼的运动学模型可以退化成其他几种。

双阿克曼结构运动学分析图

运动学分析图如下(图丑,将就看):

在这里插入图片描述

如图可见我的四舵轮分布在底盘正方形的四个定点上,并分别以 f l , f r , r l , r r fl, fr, rl, rr fl,fr,rl,rr命名。轮间距定义为 H H H,如图中 f l − r l fl-rl flrl的黄色虚线所示距离。当然,也存在四舵轮分布呈现矩形的方式,计算过程一样,只是稍微复杂。

双阿克曼结构运动时会有一个瞬时运动中心C点,该点与四个舵轮的连线,与舵轮方向垂直;并且,C与运动学中心A的连线,与机器人的线速度方向垂直。这是我们分析运动学的关键。

定义世界坐标系 X O Y XOY XOY,如图中红色所示。
定义机器人坐标系中的坐标 x A y xAy xAy,如图中蓝色所示,满足右手定则。机器人运动学中心为A点。
在机器人坐标系中, x x x轴指向机器人正前方, y y y轴指向机器人左侧,则对应的前向速度设置为 v x v_x vx,左侧速度设置为 v y v_y vy,角速度为 w , ( 图中为 o m e g a ) w,(图中为omega) w,(图中为omega),如图中紫色所示。 V V V表示机器人运动学中心的真实线速度,它与机器人正前方是存在夹角的,称之为滑移角,计算方式为 tan ⁡ θ = v y v x \tan\theta=\frac{v_y}{v_x} tanθ=vxvy,图中并未标出。

以左前舵轮为例,定义舵轮的线速度和转角分别为 V f l V_{fl} Vfl, θ f l \theta_{fl} θfl,其他三个类似。

至此,运动学定义完毕,下面开始计算。

双阿克曼模式运动学逆解

首先关注两个距离: A B AB AB B C BC BC,以下分析会重点用到。

下面先分析四个舵轮的线速度和转角与 A B AB AB B C BC BC的关系:
还是以左前舵轮为例,假设左前轮 f l fl fl C C C点的距离为 L C − f l L_{C-fl} LCfl,则有:
V f l V_{fl} Vfl = w w w * L C − f l L_{C-fl} LCfl
由几何关系又可得:
L C − f l L_{C-fl} LCfl = ( A B + H ) 2 + ( B C − H ) 2 \sqrt{(AB+H)^2 + (BC - H)^2} (AB+H)2+(BCH)2
图画的不好,但这里也容易理解。
那么,我们就得到了舵轮线速度和 A B AB AB B C BC BC的关系:

V f l V_{fl} Vfl = w w w * ( A B + H ) 2 + ( B C − H ) 2 \sqrt{(AB+H)^2 + (BC - H)^2} (AB+H)2+(BCH)2

又几何关系也很容易可以看出转角的计算公式:

θ f l \theta_{fl} θfl = arctan ⁡ A B + H B C − H \arctan\frac{AB+H}{BC-H} arctanBCHAB+H 这里需要注意方向,这样算出来的两个前轮是对的,但后轮算出来要加负号,可以理解下。

注意,这里算出的角度不能用于计算机计算,code的时候应该用 a t a n 2 ( ) atan2() atan2()函数。
其他三个舵轮的线速度和转角也类似,不再赘述。

可以看到,舵轮的转角和速度是跟 A B AB AB B C BC BC有关的,而 A B AB AB B C BC BC又如何由已知量 v x v_x vx v y v_y vy w w w推导出来呢,继续:

机器线速度有如下关系:

V = v x 2 + v y 2 V = \sqrt{v_x^2 + v_y^2} V=vx2+vy2 = w w w * A C AC AC = w w w * A B 2 + B C 2 \sqrt{AB^2 + BC^2} AB2+BC2

则可得:

A B 2 + B C 2 AB^2 + BC^2 AB2+BC2 = v x 2 + v y 2 w 2 \frac{v_x^2 + v_y^2}{w^2} w2vx2+vy2

再由滑移角的计算可得:

tan ⁡ θ = v y v x \tan\theta = \frac{v_y}{v_x} tanθ=vxvy = A B B C \frac{AB}{BC} BCAB

联立上两式可得:

A B = v x w AB = \frac{v_x}{w} AB=wvx , B C = v y w BC = \frac{v_y}{w} BC=wvy

这时,消去 A B AB AB B C BC BC,就得到了四舵轮转角和线速度,与输入的机身速度 v x v_x vx v y v_y vy w w w之间的关系:

{ V f l = ( V x − H w ) 2 + ( H w + V y ) 2 V f r = ( V x + H w ) 2 + ( H w + V y ) 2 V r l = ( V x − H w ) 2 + ( H w − V y ) 2 V r r = ( V x + H w ) 2 + ( H w − V y ) 2 \begin{cases} V_{fl} = \sqrt{(V_x - Hw)^2 + (Hw + V_y)^2} \\ V_{fr} = \sqrt{(V_x + Hw)^2 + (Hw + V_y)^2} \\ V_{rl} = \sqrt{(V_x - Hw)^2 + (Hw - V_y)^2} \\ V_{rr} = \sqrt{(V_x + Hw)^2 + (Hw - V_y)^2} \end{cases} Vfl=(VxHw)2+(Hw+Vy)2 Vfr=(Vx+Hw)2+(Hw+Vy)2 Vrl=(VxHw)2+(HwVy)2 Vrr=(Vx+Hw)2+(HwVy)2

{ θ f l = arctan ⁡ 2 V y + H w V x − H w θ f r = arctan ⁡ 2 V y + H w V x + H w θ r l = arctan ⁡ 2 V y − H w V x − H w θ r r = arctan ⁡ 2 V y − H w V x + H w \begin{cases} \theta_{fl} = \arctan2\frac{V_y + Hw}{V_x - Hw} \\ \theta_{fr} = \arctan2\frac{V_y + Hw}{V_x + Hw} \\ \theta_{rl} = \arctan2\frac{V_y - Hw}{V_x - Hw} \\ \theta_{rr} = \arctan2\frac{V_y - Hw}{V_x + Hw} \end{cases} θfl=arctan2VxHwVy+Hwθfr=arctan2Vx+HwVy+Hwθrl=arctan2VxHwVyHwθrr=arctan2Vx+HwVyHw

应该是写对了,代码也贴上,代码是对的:

void FourSteeredWheeledRobot::inverseKinematics(double Vx, double Vy, double Omega, std::array<double, 4>& target_steer, std::array<double, 4>& target_drive) {
    double h = CHASSIS_HALF_WIDTH;
    double hw = h * Omega;

    target_steer = {
        std::atan2((Vy + hw), (Vx - hw)),
        std::atan2((Vy + hw), (Vx + hw)),
        std::atan2((Vy - hw), (Vx - hw)),
        std::atan2((Vy - hw), (Vx + hw))
    };

    target_drive = {
        std::sqrt(std::pow(Vx - hw, 2) + std::pow(hw + Vy, 2)) / WHEEL_RADIUS,
        std::sqrt(std::pow(Vx + hw, 2) + std::pow(hw + Vy, 2)) / WHEEL_RADIUS,
        std::sqrt(std::pow(Vx - hw, 2) + std::pow(hw - Vy, 2)) / WHEEL_RADIUS,
        std::sqrt(std::pow(Vx + hw, 2) + std::pow(hw - Vy, 2)) / WHEEL_RADIUS
    };
}

至此,双阿克曼结构的运动学逆解分析完毕。

我们用webots仿真来验证一下:

四舵轮双阿克曼运动

从视频可以发现后退时舵轮有时转角非常大,导致切换不丝滑,这是因为我们设定了舵轮的转角范围是 [ − π , π ] [-\pi, \pi] [π,π],而舵轮驱动轮的速度总是非负。所以前进时舵轮角度为0,速度为正,后退时舵轮角度为 π \pi π,速度还是为正,这样舵轮转角就很大。后续可以通过一个转换函数来将舵轮转角限制在 [ − π / 2 , π / 2 ] [-\pi/2, \pi/2] [π/2,π/2]范围内,速度则可以取负,这样舵轮的转动就平滑了。

下面看看套这个公式会不会直接得出其他几种运动学模型的公式:

自旋模式运动学逆解

自旋模式下,机器人只有角速度 w w w,线速度 v x = 0 v_x = 0 vx=0 v y = 0 v_y = 0 vy=0. 套公式可得:

{ V f l = 2 H ∗ w V f r = 2 H ∗ w V r l = 2 H ∗ w V r r = 2 H ∗ w \begin{cases} V_{fl} = \sqrt{2}H * w \\ V_{fr} = \sqrt{2}H * w \\ V_{rl} = \sqrt{2}H * w \\ V_{rr} = \sqrt{2}H * w \end{cases} Vfl=2 HwVfr=2 HwVrl=2 HwVrr=2 Hw

{ θ f l = arctan ⁡ 2 w − w θ f r = arctan ⁡ 2 w w θ r l = arctan ⁡ 2 − w − w θ r r = arctan ⁡ 2 − w w \begin{cases} \theta_{fl} = \arctan2\frac{w}{-w}\\ \theta_{fr} = \arctan2\frac{w}{w} \\ \theta_{rl} = \arctan2\frac{-w}{-w} \\ \theta_{rr} = \arctan2\frac{-w}{w} \end{cases} θfl=arctan2wwθfr=arctan2wwθrl=arctan2wwθrr=arctan2ww

w > 0 w>0 w>0时,机器逆时针旋转,此时四舵轮角度为
{ θ f l = 135 ° θ f r = 45 ° θ r l = − 135 ° θ r r = − 45 ° \begin{cases} \theta_{fl} = 135°\\ \theta_{fr} = 45° \\ \theta_{rl} = -135° \\ \theta_{rr} = -45° \end{cases} θfl=135°θfr=45°θrl=135°θrr=45°

w < 0 w<0 w<0时,机器顺时针旋转,此时四舵轮角度为
{ θ f l = − 45 ° θ f r = − 135 ° θ r l = 45 ° θ r r = 135 ° \begin{cases} \theta_{fl} = -45°\\ \theta_{fr} = -135° \\ \theta_{rl} = 45° \\ \theta_{rr} = 135° \end{cases} θfl=45°θfr=135°θrl=45°θrr=135°

上述公式是不是退化成了自旋模型!

我们用webots仿真来验证一下:

四舵轮自旋

蟹行模式运动学逆解

蟹行模式下,机器人只有速度 v x v_x vx v y v_y vy,姿态不变故 w = 0 w = 0 w=0. 套公式可得:

{ V f l = ( V x ) 2 + ( V y ) 2 = V V f r = ( V x ) 2 + ( V y ) 2 = V V r l = ( V x ) 2 + ( − V y ) 2 = V V r r = ( V x ) 2 + ( − V y ) 2 = V \begin{cases} V_{fl} = \sqrt{(V_x)^2 + (V_y)^2} = V \\ V_{fr} = \sqrt{(V_x)^2 + (V_y)^2} = V \\ V_{rl} = \sqrt{(V_x)^2 + (-V_y)^2} = V \\ V_{rr} = \sqrt{(V_x)^2 + (-V_y)^2} = V \end{cases} Vfl=(Vx)2+(Vy)2 =VVfr=(Vx)2+(Vy)2 =VVrl=(Vx)2+(Vy)2 =VVrr=(Vx)2+(Vy)2 =V

{ θ f l = arctan ⁡ 2 V y V x = θ θ f r = arctan ⁡ 2 V y V x = θ θ r l = arctan ⁡ 2 V y V x = θ θ r r = arctan ⁡ 2 V y V x = θ \begin{cases} \theta_{fl} = \arctan2\frac{V_y}{V_x} = \theta \\ \theta_{fr} = \arctan2\frac{V_y}{V_x} = \theta \\ \theta_{rl} = \arctan2\frac{V_y}{V_x} = \theta \\ \theta_{rr} = \arctan2\frac{V_y}{V_x} = \theta \end{cases} θfl=arctan2VxVy=θθfr=arctan2VxVy=θθrl=arctan2VxVy=θθrr=arctan2VxVy=θ

四轮的速度即车体的速度 V V V,四轮的转角即车体的滑移角 θ \theta θ

上述公式是不是退化成了蟹行模型!

我们用webots仿真来验证一下:

四舵轮蟹行运动

常规阿克曼模式运动学逆解

当两个后轮保持前向固定而两个前轮转动时,机器人运动学模型为常规阿克曼模型。
那么此时的运动学模型如下:

在这里插入图片描述

从图中可以看出:

{ θ r l = 0 θ r r = 0 \begin{cases} \theta_{rl} = 0 \\ \theta_{rr} = 0 \end{cases} {θrl=0θrr=0

再套公式有:

{ θ r l = 0 = arctan ⁡ 2 V y − H w V x − H w θ r r = 0 = arctan ⁡ 2 V y − H w V x + H w \begin{cases} \theta_{rl} = 0 = \arctan2\frac{V_y - Hw}{V_x - Hw} \\ \theta_{rr} = 0 = \arctan2\frac{V_y - Hw}{V_x + Hw} \end{cases} {θrl=0=arctan2VxHwVyHwθrr=0=arctan2Vx+HwVyHw

V y = H w V_y = Hw Vy=Hw,此时公式变为:

{ V f l = ( V x − H w ) 2 + ( 2 H w ) 2 V f r = ( V x + H w ) 2 + ( 2 H w ) 2 V r l = V x − H w V r r = V x + H w \begin{cases} V_{fl} = \sqrt{(V_x - Hw)^2 + (2Hw)^2} \\ V_{fr} = \sqrt{(V_x + Hw)^2 + (2Hw)^2} \\ V_{rl} = V_x - Hw \\ V_{rr} = V_x + Hw \end{cases} Vfl=(VxHw)2+(2Hw)2 Vfr=(Vx+Hw)2+(2Hw)2 Vrl=VxHwVrr=Vx+Hw

{ θ f l = arctan ⁡ 2 2 H w V x − H w θ f r = arctan ⁡ 2 2 H w V x + H w θ r l = 0 θ r r = 0 \begin{cases} \theta_{fl} = \arctan2\frac{2Hw}{V_x - Hw} \\ \theta_{fr} = \arctan2\frac{2Hw}{V_x + Hw} \\ \theta_{rl} = 0 \\ \theta_{rr} = 0 \end{cases} θfl=arctan2VxHw2Hwθfr=arctan2Vx+Hw2Hwθrl=0θrr=0

似乎看起来并不明显。因为传统阿克曼模型的输入为速度 V V V和滑移角 θ \theta θ。我们用仿真来看:

四舵轮传统阿克曼模式

是不是退化成了传统阿克曼模型!

总结

四舵轮转角和线速度,与输入的机身速度 v x v_x vx v y v_y vy w w w之间的通用公式:

{ V f l = ( V x − H w ) 2 + ( H w + V y ) 2 V f r = ( V x + H w ) 2 + ( H w + V y ) 2 V r l = ( V x − H w ) 2 + ( H w − V y ) 2 V r r = ( V x + H w ) 2 + ( H w − V y ) 2 \begin{cases} V_{fl} = \sqrt{(V_x - Hw)^2 + (Hw + V_y)^2} \\ V_{fr} = \sqrt{(V_x + Hw)^2 + (Hw + V_y)^2} \\ V_{rl} = \sqrt{(V_x - Hw)^2 + (Hw - V_y)^2} \\ V_{rr} = \sqrt{(V_x + Hw)^2 + (Hw - V_y)^2} \end{cases} Vfl=(VxHw)2+(Hw+Vy)2 Vfr=(Vx+Hw)2+(Hw+Vy)2 Vrl=(VxHw)2+(HwVy)2 Vrr=(Vx+Hw)2+(HwVy)2

{ θ f l = arctan ⁡ 2 V y + H w V x − H w θ f r = arctan ⁡ 2 V y + H w V x + H w θ r l = arctan ⁡ 2 V y − H w V x − H w θ r r = arctan ⁡ 2 V y − H w V x + H w \begin{cases} \theta_{fl} = \arctan2\frac{V_y + Hw}{V_x - Hw} \\ \theta_{fr} = \arctan2\frac{V_y + Hw}{V_x + Hw} \\ \theta_{rl} = \arctan2\frac{V_y - Hw}{V_x - Hw} \\ \theta_{rr} = \arctan2\frac{V_y - Hw}{V_x + Hw} \end{cases} θfl=arctan2VxHwVy+Hwθfr=arctan2Vx+HwVy+Hwθrl=arctan2VxHwVyHwθrr=arctan2Vx+HwVyHw

通过不同的输入即可实现四种不同的运动!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐