# python example of a motor hardware interface

Hi all,

I have a 4WD robot that uses PWM motor controls. I am looking for a good ROS2 python example to convert Twist signal in PWM.

Thanks

edit retag close merge delete

What model of controllers do you have for these PWM motors? This package simple_drive and this AutomaticAddison blog post describe similar things you can try to achieve here

thanks, I've written very similar code. I was looking for something which included odom for a bot without encoders.

Sort by » oldest newest most voted

To convert Twist message to PWM that's what I've done

1. I've created a test script that sends PWM duty cycle signal from the lowest to highest at specific time intervals (e.g. 1sec, 2sec and son on).
2. For each event (e.g. PWM 50 for 2sec) I've measured the distance covered by the robot.
3. With distances (x) and duty cycles (y) I've calculated the slope(m) and y-intercept(b) values of a linear equation y = mx + b
4. With the linear function I can calculate the duty cycle needed. So, for instance from the Twist linear.x velocity message value, defined as meters/second, I can derive the duty cycle. Note that when the robot goes from a stop state to a moving state some initial friction needs to be considered.

Example

def calc_vel(self, x, z): # x and z are coming from Twist
t = self.track #distance between wheels

r_vel = x + ((z * t) /2)
l_vel = x - ((z * t) /2)

dc_r = calc_duty_cycle(r_vel)
dc_l = calc_duty_cycle(dc_l)

return dc_r, dc_l

def calc_duty_cycle(self, vel):
# linear equation variables defined by experimentation
M_SLOPE = 50
Y_INTERCEPT = 2

return M_SLOPE * vel + Y_INTERCEPT

more