fixed equation
parent
0dcef71f80
commit
a58d1f8ffb
|
@ -28,13 +28,14 @@
|
|||
#include "Arduino.h"
|
||||
#include "Kinematics.h"
|
||||
|
||||
Kinematics::Kinematics(int motor_max_rpm, float wheel_diameter, float base_width, int pwm_bits)
|
||||
Kinematics::Kinematics(int motor_max_rpm, float wheel_diameter, float fr_wheels_dist, float lr_wheels_dist, int pwm_bits):
|
||||
wheel_diameter_(wheel_diameter),
|
||||
circumference_(PI * wheel_diameter_),
|
||||
max_rpm_(motor_max_rpm),
|
||||
fr_wheels_dist_(fr_wheels_dist),
|
||||
lr_wheels_dist_(lr_wheels_dist),
|
||||
pwm_res_ (pow(2, pwm_bits) - 1)
|
||||
{
|
||||
wheel_diameter_ = wheel_diameter;
|
||||
circumference_ = PI * wheel_diameter_;
|
||||
max_rpm_ = motor_max_rpm;
|
||||
base_width_ = base_width;
|
||||
pwm_res_ = pow(2, pwm_bits) - 1;
|
||||
}
|
||||
|
||||
Kinematics::output Kinematics::getRPM(float linear_x, float linear_y, float angular_z)
|
||||
|
@ -47,7 +48,7 @@ Kinematics::output Kinematics::getRPM(float linear_x, float linear_y, float angu
|
|||
angular_vel_z_mins_ = angular_z * 60;
|
||||
|
||||
//Vt = ω * radius
|
||||
tangential_vel_ = angular_vel_z_mins_ * base_width_;
|
||||
tangential_vel_ = angular_vel_z_mins_ * lr_wheels_dist_;
|
||||
|
||||
x_rpm_ = linear_vel_x_mins_ / circumference_;
|
||||
y_rpm_ = linear_vel_y_mins_ / circumference_;
|
||||
|
@ -94,15 +95,15 @@ Kinematics::velocities Kinematics::getVelocities(int motor1, int motor2)
|
|||
{
|
||||
Kinematics::velocities vel;
|
||||
|
||||
double average_rpm_x = (motor1 + motor2) / 2; // RPM
|
||||
float average_rpm_x = (float)(motor1 + motor2) / 2; // RPM
|
||||
//convert revolutions per minute to revolutions per second
|
||||
double average_rps_x = average_rpm_x / 60; // RPS
|
||||
vel.linear_x = (average_rps_x * (wheel_diameter_ * PI)); // m/s
|
||||
float average_rps_x = average_rpm_x / 60; // RPS
|
||||
vel.linear_x = (average_rps_x * circumference_); // m/s
|
||||
|
||||
double average_rpm_a = (motor2 - motor1) / 2;
|
||||
float average_rpm_a = (float)(motor2 - motor1) / 2;
|
||||
//convert revolutions per minute to revolutions per second
|
||||
double average_rps_a = average_rpm_a / 60;
|
||||
vel.angular_z = (average_rps_a * (wheel_diameter_ * PI)) / base_width_;
|
||||
float average_rps_a = average_rpm_a / 60;
|
||||
vel.angular_z = (average_rps_a * circumference_) / (lr_wheels_dist_ / 2);
|
||||
|
||||
return vel;
|
||||
}
|
||||
|
@ -111,20 +112,20 @@ Kinematics::velocities Kinematics::getVelocities(int motor1, int motor2, int mot
|
|||
{
|
||||
Kinematics::velocities vel;
|
||||
|
||||
double average_rpm_x = (motor1 + motor2 + motor3 + motor4) / 4; // RPM
|
||||
float average_rpm_x = (float)(motor1 + motor2 + motor3 + motor4) / 4; // RPM
|
||||
//convert revolutions per minute to revolutions per second
|
||||
double average_rps_x = average_rpm_x / 60; // RPS
|
||||
vel.linear_x = (average_rps_x * (wheel_diameter_ * PI)); // m/s
|
||||
float average_rps_x = average_rpm_x / 60; // RPS
|
||||
vel.linear_x = (average_rps_x * circumference_); // m/s
|
||||
|
||||
double average_rpm_y = (-motor1 + motor2 + motor3 - motor4) / 4; // RPM
|
||||
float average_rpm_y = (float)(-motor1 + motor2 + motor3 - motor4) / 4; // RPM
|
||||
//convert revolutions per minute in y axis to revolutions per second
|
||||
double average_rps_y = average_rpm_y / 60; // RPS
|
||||
vel.linear_y = (average_rps_y * (wheel_diameter_ * PI)); // m/s
|
||||
float average_rps_y = average_rpm_y / 60; // RPS
|
||||
vel.linear_y = (average_rps_y * circumference_); // m/s
|
||||
|
||||
double average_rpm_a = (-motor1 + motor2 - motor3 + motor4) / 4;
|
||||
float average_rpm_a = (float)(-motor1 + motor2 - motor3 + motor4) / 4;
|
||||
//convert revolutions per minute to revolutions per second
|
||||
double average_rps_a = average_rpm_a / 60;
|
||||
vel.angular_z = (average_rps_a * (wheel_diameter_ * PI)) / base_width_;
|
||||
float average_rps_a = average_rpm_a / 60;
|
||||
vel.angular_z = (average_rps_a * circumference_) / ((fr_wheels_dist_ / 2) + (lr_wheels_dist_ / 2));
|
||||
|
||||
return vel;
|
||||
}
|
||||
|
@ -132,5 +133,5 @@ Kinematics::velocities Kinematics::getVelocities(int motor1, int motor2, int mot
|
|||
int Kinematics::rpmToPWM(int rpm)
|
||||
{
|
||||
//remap scale of target RPM vs MAX_RPM to PWM
|
||||
return (((double) rpm / (double) max_rpm_) * pwm_res_);
|
||||
return (((float) rpm / (float) max_rpm_) * pwm_res_);
|
||||
}
|
||||
|
|
|
@ -46,7 +46,7 @@ class Kinematics
|
|||
float linear_y;
|
||||
float angular_z;
|
||||
};
|
||||
Kinematics(int motor_max_rpm, float wheel_diameter, float base_width, int pwm_bits);
|
||||
Kinematics(int motor_max_rpm, float wheel_diameter, float fr_wheels_dist, float lr_wheels_dist, int pwm_bits);
|
||||
velocities getVelocities(int motor1, int motor2);
|
||||
velocities getVelocities(int motor1, int motor2, int motor3, int motor4);
|
||||
output getRPM(float linear_x, float linear_y, float angular_z);
|
||||
|
@ -63,9 +63,10 @@ class Kinematics
|
|||
float y_rpm_;
|
||||
float tan_rpm_;
|
||||
int max_rpm_;
|
||||
double wheel_diameter_;
|
||||
float base_width_;
|
||||
double pwm_res_;
|
||||
float wheel_diameter_;
|
||||
float fr_wheels_dist_;
|
||||
float lr_wheels_dist_;
|
||||
float pwm_res_;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue