# Actual wheels RPM velocities from ticks, target velocity and robot velocity

Hi all
I'm working on a differential drive robot and I'm a little bit confused about three main things, they seems to work, but i wanna be sure that they re the correct ones.
How to transform the ticks coming from the encoders to the RPM from the single wheels? I have all the parameters like ticks count per rev, wheel radius, wheel distance.
At the moment I'm performing it like this

ticks_current_time = ros::Time::now();
ticks_dt = (ticks_current_time - ticks_then).toSec();
ticks_dtm = ticks_dt / 60;
right_ticks_delta_ticks = right_ticks_enc - right_ticks_prev_encoder;
left_ticks_delta_ticks = left_ticks_enc - left_ticks_prev_encoder;
right_ticks_vel_rpm = (right_ticks_delta_ticks / Ticks_per_rev ) / ticks_dtm;
left_ticks_vel_rpm = (left_ticks_delta_ticks / Ticks_per_rev) / ticks_dtm;


How to transform the target velocities linear.x and angular.z coming from /cmd_vel to RPM for the single wheel??
At the moment I'm performing it like this

vel_target_right_rad_sec = ((2*required_linear_x_vel)+(required_angular_vel*Base_width))/(2*(Wheel_diameter/2));
vel_target_right_rpm =  vel_target_right_minute / (pi * 2);
vel_target_left_rpm =  vel_target_left_minute / (pi * 2);


How to transform the ticks reading from the encoders into the actual linear (m/s) and angular (rad/s) velocities of the robot (to compare to the ones coming from /cmd_vel)?
At the moment I'm performing something like this

average_rpm_x = (left_ticks_vel + right_ticks_vel) / 2;
average_rps_x = average_rpm_x / 60;
linear_velocity = (average_rps_x * (Wheel_diameter * pi));
average_rpm_a = (right_ticks_vel - left_ticks_vel) / 2;
average_rps_a = average_rpm_a / 60;
angular_velocity = (average_rps_a * (Wheel_diameter * pi)) / Base_width;


Thank you so much in advance!!!

edit retag close merge delete