文章目录
- 概要
- 滑移转向/差速驱动
- 基于圆弧的命令
- ROS 的线性和角速度命令
- 麦克纳姆轮数学
- 正向运动学
- 逆运动学
- 参考
概要
我经常需要滑移转向车辆的基本运动方程。我最近也一直在研究麦克纳姆轮车辆。滑移转向方程相当简单且易于找到,但我会将其包含在不同的版本中,并包含 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
正向运动学
(技术上是逆运动学,但地面机器人通常被称为正运动学)
车轮命令单位为 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/