驱动运动学:Skid steer滑移转向和mecanum麦克纳姆(包括 ROS Twist)


在这里插入图片描述

概要

我经常需要滑移转向车辆的基本运动方程。我最近也一直在研究麦克纳姆轮车辆。滑移转向方程相当简单且易于找到,但我会将其包含在不同的版本中,并包含 ROS 方法。麦克纳姆轮方程更难找到,而且有不同的版本。我发现的第一个版本有很多三角函数并且大部分都有效。我在这里展示的版本更容易直观地理解,并且似乎工作得更好(我不需要这个版本的随机比例因子),我还为它们提供了 ROS 方法。

滑移转向/差速驱动

以下是 2 轮和 4 轮差速驱动车辆、2 个轮子和一个脚轮或滑移转向履带式车辆的一些数学计算。

基于圆弧的命令

基本的滑移转向方程为:

右速度 = w ( RADIUS_OF_ARC_TO_DRIVE + WHEEL_BASE/2)
左速度 = w ( RADIUS_OF_ARC_TO_DRIVE – WHEEL_BASE/2)

其中w是角度旋转,RADIUS_OF_ARC_TO_DRIVE 是机器人应行驶的圆弧半径,WHEEL_BASE 是从左轮中心到右轮中心的距离(见上图)。

这也可以写成:

w = (右速度-左速度)/WHEEL_BASE

有两种特殊情况:

IFvelocity_right==velocity_left:
那么圆弧的半径是无穷大,因此机器人将直线行驶。

IF Velocity_right == -velocity_left :
THEN 圆弧半径为 0,机器人原地旋转(即点转向)

ROS 的线性和角速度命令

在 ROS 中,如果使用Twist 主题(这是驱动器消息的默认设置)(消息名称通常是 cmd_vel),您通常会在Linear.x字段中设置 Linear_velocity,在Angular.z字段中设置 Angular_velocity 。

velocity_left_cmd = (线性速度 – 角度速度 * WHEEL_BASE / 2.0)/WHEEL_RADIUS;

velocity_right_cmd = (线性速度 + 角度速度 * WHEEL_BASE / 2.0)/WHEEL_RADIUS;

麦克纳姆轮数学

在这里插入图片描述
在 ROS 中,如果使用 Twist 消息,您通常会设置 Linear.x、Linear.y 和 Angular.z 字段。
一个不相关的注意事项是,如果您在不平坦的地形上操作,那么进行麦克纳姆类型的运动将会失败并且会有很多滑动。滑移转向类型的运动通常效果更好(使用麦克纳姆轮)。

WHEEL_SEPARATION_WIDTH = DISTANCE_LEFT_TO_RIGHT_WHEEL / 2

WHEEL_SEPARATION_LENGTH = DISTANCE_FRONT_TO_REAR_WHEEL / 2

正向运动学

(技术上是逆运动学,但地面机器人通常被称为正运动学)

扫描二维码关注公众号,回复: 17274532 查看本文章

车轮命令单位为 rad/s

wheel_front_left = (1/WHEEL_RADIUS) * (线性.x – 线性.y – (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*角度.z);

Wheel_front_right = (1/WHEEL_RADIUS) * (线性.x + 线性.y + (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*角度.z);

wheel_rear_left = (1/WHEEL_RADIUS) * (线性.x + 线性.y – (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*角度.z);

wheel_rear_right = (1/WHEEL_RADIUS) * (线性.x – 线性.y + (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)*角度.z);

要驱动机器人,您可能还需要反转一侧,因为电机安装在另一侧的对面。例如:

轮前右 = -1 * 轮前右

后轮右 = -1 * 后轮右

这也给出了以 rad/s 为单位的输出。如果您的电机控制器以编码器计数为单位运行,您将需要转换单位。

逆运动学

(技术上是正向运动学,但地面机器人通常称为反向运动学)

线性.x = (wheel_front_left +wheel_front_right +wheel_rear_left +wheel_rear_right) * (WHEEL_RADIUS/4)

线性.y = (-wheel_front_left +wheel_front_right +wheel_rear_left –wheel_rear_right) * (WHEEL_RADIUS/4)

角度.z = (-wheel_front_left +wheel_front_right –wheel_rear_left +wheel_rear_right) * (WHEEL_RADIUS/(4 * (WHEEL_SEPARATION_WIDTH + WHEEL_SEPARATION_LENGTH)))

参考

https://www.robotsforroboticists.com/drive-kinematics/

猜你喜欢

转载自blog.csdn.net/weixin_42990464/article/details/134304994