4 from gazebo_msgs.msg
import ModelState, ModelStates, LinkState, LinkStates
6 from track
import track, Point
12 model_states_message =
None 13 link_states_message =
None 17 global model_states_message
18 model_states_message = message
22 global link_states_message
23 link_states_message = message
27 global max_car_velocity, car_velocity
28 if len(model_states_message.pose) < 2:
30 car_velocity = (model_states_message.twist[1].linear.x**2 +
31 model_states_message.twist[1].linear.y**2)**0.5
32 if car_velocity > max_car_velocity:
33 max_car_velocity = car_velocity
37 'racer::left_wheel_front',
38 'racer::left_wheel_back',
39 'racer::right_wheel_front',
40 'racer::right_wheel_back']
46 indices = [i
for i
in range(len(link_states_message.name))
47 if link_states_message.name[i]
in LINK_NAMES]
48 twists = [link_states_message.twist[i].angular
for i
in indices]
50 angle_velocities = [(t.x**2 + t.y**2)**0.5
for t
in twists]
51 angular_velocity = sum(angle_velocities) / len(angle_velocities)
52 wheel_velocity = angular_velocity * WHEEL_RADIUS
56 if car_velocity
is None or max_car_velocity
is None or wheel_velocity
is None:
60 model_states_message.pose[1].position.x,
61 model_states_message.pose[1].position.y)
64 "car: {0:.2f} m/s, max: {1:.2f} m/s, wheels: {2:.2f} m/s, slip: ".format(
70 car_velocity).rjust(7) +
72 track.localize(position)) +
73 ", world: ({0:.2f}, {1:.2f})".format(
83 if model_states_message
is None or link_states_message
is None:
89 if abs(car_velocity) < 0.01
and abs(wheel_velocity) < 0.01:
97 rospy.init_node(
'speedometer', anonymous=
True)
98 rospy.Subscriber(
"/gazebo/model_states", ModelStates, model_state_callback)
99 rospy.Subscriber(
"/gazebo/link_states", LinkStates, link_state_callback)
100 rospy.Timer(rospy.Duration(0.05, 0), calculate_velocity)