cmd_vel_listener.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 import rospy, oculusprimesocket, math, re, thread, time
4 from geometry_msgs.msg import Twist
5 
6 lastlinear = 0
7 lastangular = 0
8 lastmove = 0
9 smoothingdelay = 0.3
10 twistid = 0
11 
12 
13 def twistCallback(data):
14  global twistid
15 
16  linear = data.linear.x
17  angular = data.angular.z
18 
19  twistid = rospy.Time.now()
20  thread.start_new_thread(waitifnecessary, (linear, angular, twistid) )
21  # print twistid
22 
23 
24 def waitifnecessary(linear, angular, threadid):
25 
26  if linear == 0 and angular == 0: # always stop immediately
27  move(linear, angular)
28  return
29 
30  while twistid == threadid and smoothingdelay - (rospy.Time.now()-lastmove).to_sec() > 0:
31  rospy.sleep(0.01)
32 
33  if twistid == threadid:
34  move(linear, angular)
35 
36 
37 def move(linear, angular):
38  global lastlinear, lastangular, lastmove
39 
40  lastmove = rospy.Time.now()
41 
42  # don't send repeat stop commands
43  if linear == lastlinear and angular == lastangular and linear == 0 and angular == 0:
44  return
45 
46  lastlinear = linear
47  lastangular = angular
48 
49  cmd = None
50 
51  d = "0.3" # .3
52  a = "25" # 40
53  arcmult = 3 # 3
54 
55  if linear == 0 and angular == 0:
56  cmd = "move stop"
57 
58  elif linear > 0 and angular == 0:
59  cmd = "forward "+d
60 
61  elif linear < 0 and angular == 0:
62  cmd = "backward "+d
63 
64  elif linear == 0 and angular > 0:
65  cmd = "left "+a
66 
67  elif linear == 0 and angular < 0:
68  cmd = "right "+a
69 
70  elif linear > 0 and not angular == 0: # forward arc
71  angle = str(int(math.degrees(angular))/arcmult)
72  cmd = "arcmove "+d+" "+angle
73 
74  elif linear < 0 and not angular == 0: # backwards arc
75  angle = str(int(math.degrees(angular))/arcmult)
76  cmd = "arcmove -"+d+" "+angle
77 
78  if not cmd == None:
80  # print (str(linear)+", "+str(angular)+", "+cmd)
81 
82 
83 def cleanup():
84  oculusprimesocket.sendString("odometrystop")
85  oculusprimesocket.sendString("log cmd_vel_listener.py disconnecting") # goodbye
86 
87 
88 # Main
89 
90 # initialize node
91 rospy.init_node('cmd_vel_listener', anonymous=False)
92 rospy.on_shutdown(cleanup)
93 lastmove = rospy.Time.now()
94 
95 # connect to oculusprime java server
97 oculusprimesocket.sendString("log cmd_vel_listener.py connected")
98 oculusprimesocket.sendString("odometrystart")
99 
100 # twist message event listener
101 rospy.Subscriber("cmd_vel", Twist, twistCallback)
102 
103 rospy.spin()
def twistCallback(data)
def move(linear, angular)
def waitifnecessary(linear, angular, threadid)


oculusprime
Author(s): Colin Adamson
autogenerated on Wed Mar 10 2021 03:14:59