四舵轮全向移动机器人运动学逆解
项目开源至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 fl−rl的黄色虚线所示距离。当然,也存在四舵轮分布呈现矩形的方式,计算过程一样,只是稍微复杂。
双阿克曼结构运动时会有一个瞬时运动中心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} LC−fl,则有:
V f l V_{fl} Vfl = w w w * L C − f l L_{C-fl} LC−fl。
由几何关系又可得:
L C − f l L_{C-fl} LC−fl = ( A B + H ) 2 + ( B C − H ) 2 \sqrt{(AB+H)^2 + (BC - H)^2} (AB+H)2+(BC−H)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+(BC−H)2
又几何关系也很容易可以看出转角的计算公式:
θ f l \theta_{fl} θfl = arctan A B + H B C − H \arctan\frac{AB+H}{BC-H} arctanBC−HAB+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=(Vx−Hw)2+(Hw+Vy)2Vfr=(Vx+Hw)2+(Hw+Vy)2Vrl=(Vx−Hw)2+(Hw−Vy)2Vrr=(Vx+Hw)2+(Hw−Vy)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=arctan2Vx−HwVy+Hwθfr=arctan2Vx+HwVy+Hwθrl=arctan2Vx−HwVy−Hwθrr=arctan2Vx+HwVy−Hw
应该是写对了,代码也贴上,代码是对的:
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=2H∗wVfr=2H∗wVrl=2H∗wVrr=2H∗w
{ θ 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=arctan2−wwθfr=arctan2wwθrl=arctan2−w−wθrr=arctan2w−w
当 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=arctan2Vx−HwVy−Hwθrr=0=arctan2Vx+HwVy−Hw
得 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=(Vx−Hw)2+(2Hw)2Vfr=(Vx+Hw)2+(2Hw)2Vrl=Vx−HwVrr=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=arctan2Vx−Hw2Hwθ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=(Vx−Hw)2+(Hw+Vy)2Vfr=(Vx+Hw)2+(Hw+Vy)2Vrl=(Vx−Hw)2+(Hw−Vy)2Vrr=(Vx+Hw)2+(Hw−Vy)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=arctan2Vx−HwVy+Hwθfr=arctan2Vx+HwVy+Hwθrl=arctan2Vx−HwVy−Hwθrr=arctan2Vx+HwVy−Hw
通过不同的输入即可实现四种不同的运动!
完
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)