Arduino Kinematics library for differential drive(2WD, 4WD) and mecanum drive robots.
The library requires the following robot's specification as an input:
- Robot's maximum RPM
- Distance between wheels (Front-Left and Front-Rear )
- Wheel's Diameter
Object constructor which requires the robot's specification.
- MOTOR_MAX_RPM : Maximum RPM of the motor
- WHEEL_DIAMETER : Robot wheel's diameter expressed in meters
- FR_WHEEL_DISTANCE : Distance between front wheel and rear wheel
- LR_WHEEL_DISTANCE : Distance between left wheel and right wheel
- PWM_BITS : PWM resolution of the Microcontroller. Arduino Uno/Mega, Teensy is 8 bits by default
Returns a Vector of Motor RPMs from a given linear velocity in x and y axis and angular velocity in z axis using right hand rule. The returned values can be used in a PID controller as "setpoint" vs a wheel encoder's feedback expressed in RPM.
- linear_x : target linear speed of the robot in x axis (forward or reverse) expressed in m/s.
- linear_y : target linear speed of the robot in y axis (strafing left or strafing right for mecanum drive) expressed in m/s.
- angular_z : target angular speed of the robot in z axis (rotating CCW or CW) rad/sec.
The same output as getRPM() function converted to a PWM value. The returned values can be used to drive motor drivers using the PWM signals.
This is the inverse of getRPM(). Returns linear velocities in x and y axis, and angular velocity in z axis given two measured RPMs on each motor of a 2WD robot. The returned values can be used to calculate the distance traveled in a specific axis - where distance traveled is the product of the change in velocity and change in time.
- motor1: left motor's measured RPM
- motor2: right motor's measured RPM
*each motor's RPM value must be signed. + to signify forward direction and - to signify reverse direction of the motor.
The same output as No.4 but requires 4 measured RPMs on each motor of a 4WD robot. This can be used for both 4 wheeled differential drive and mecanum drive robots.
- motor1: front left motor's measured RPM
- motor2: front right motor's measured RPM
- motor3: front right motor's measured RPM
- motor4: front right motor's measured RPM
*each motor's RPM value must be signed. + to signify forward direction and - to signify reverse direction of the motor.
Struct returned by getRPM() and getPWM used to store PWM or RPM values.
struct output{
int motor1;
int motor2;
int motor3;
int motor4;
};
- each returned motor RPM or PWM value is signed to signify the motor's direction. + forward direction ; - reverse direction.
Struct returned by getVelocities() used to store linear velocities in x and y axis, and angular velocity in z axis (right hand rule).
struct velocities{
float linear_x;
float linear_y;
float angular_z;
};
- linear_x and linear_y are expressed in m/s. angular_z is expressed in rad/s