Autonomous Racing  1
f1tenth Project Group of Technical University Dortmund, Germany
speedometer.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import rospy
4 from gazebo_msgs.msg import ModelState, ModelStates, LinkState, LinkStates
5 
6 from track import track, Point
7 
8 wheel_velocity = None
9 car_velocity = None
10 max_car_velocity = 0
11 
12 model_states_message = None
13 link_states_message = None
14 
15 
16 def model_state_callback(message):
17  global model_states_message
18  model_states_message = message
19 
20 
21 def link_state_callback(message):
22  global link_states_message
23  link_states_message = message
24 
25 
27  global max_car_velocity, car_velocity
28  if len(model_states_message.pose) < 2:
29  return
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
34 
35 
36 LINK_NAMES = [
37  'racer::left_wheel_front',
38  'racer::left_wheel_back',
39  'racer::right_wheel_front',
40  'racer::right_wheel_back']
41 WHEEL_RADIUS = 0.05
42 
43 
45  global wheel_velocity
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]
49 
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
53 
54 
55 def show_info():
56  if car_velocity is None or max_car_velocity is None or wheel_velocity is None:
57  return
58 
59  position = Point(
60  model_states_message.pose[1].position.x,
61  model_states_message.pose[1].position.y)
62 
63  rospy.loginfo(
64  "car: {0:.2f} m/s, max: {1:.2f} m/s, wheels: {2:.2f} m/s, slip: ".format(
65  car_velocity,
66  max_car_velocity,
67  wheel_velocity) +
68  "{0:.2f}, ".format(
69  wheel_velocity -
70  car_velocity).rjust(7) +
71  str(
72  track.localize(position)) +
73  ", world: ({0:.2f}, {1:.2f})".format(
74  position.x,
75  position.y))
76 
77 
78 idle = True
79 
80 
81 def calculate_velocity(event):
82  global idle
83  if model_states_message is None or link_states_message is None:
84  return
85 
88 
89  if abs(car_velocity) < 0.01 and abs(wheel_velocity) < 0.01:
90  if idle:
91  return
92  else:
93  idle = True
94  show_info()
95 
96 
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)
101 
102 rospy.spin()
def link_state_callback(message)
Definition: speedometer.py:21
Point
Definition: circle.py:8
def model_state_callback(message)
Definition: speedometer.py:16