ps4_mapper.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 
3 # Description: This script converts Ds4 Status into Joint Velocity Commands with addtional button publishers
4 # Ps4 Controller mapping:
5 # Axes : axis_left_y axis_right_x axis_right_y axis_l2 axis_r2
6 # Buttons: button_dpad_up button_dpad_down button_dpad_left button_dpad_right button_cross
7 # button_circle button_square button_triangle
8 # button_l1 button_l2button_l3 button_r1 button_r2 button_r3 button_share button_options button_trackpad button_ps
9 
10 import rospy
11 from geometry_msgs.msg import Twist, TwistStamped
12 from std_msgs.msg import Bool, Float32
13 from ds4_driver.msg import Status, Feedback
14 
15 
16 class ps4_mapper(object):
17  def __init__(self):
18  self._stamped = rospy.get_param('~stamped', False)
19  if self._stamped:
20  self._cls = TwistStamped
21  self._frame_id = rospy.get_param('~frame_id', 'base_link')
22  else:
23  self._cls = Twist
24  self._inputs = rospy.get_param('~inputs')
25  self._scales = rospy.get_param('~scales')
26  self.buttonpressed = False
27  self.counter = 0
28  self._attrs = []
29  for attr in Status.__slots__:
30  if attr.startswith('axis_') or attr.startswith('button_'):
31  self._attrs.append(attr)
32 
33  self._pub = rospy.Publisher('cmd_vel/joystick', self._cls, queue_size=1)
34  self._pub_squ = rospy.Publisher('/joystick/square', Bool, queue_size=1, latch=True)
35  self._pub_triangle = rospy.Publisher('/joystick/triangle', Bool, queue_size=1, latch=True)
36  self._pub_circle = rospy.Publisher('/soft_estop/reset', Bool, queue_size=1) # , latch =True)
37  self._pub_cross = rospy.Publisher('/soft_estop/enable', Bool, queue_size=1) # , latch =True)
38  self._pub_trim = rospy.Publisher('/trim_increment', Float32, queue_size=1)
39  self._trim_incre_value = rospy.get_param('~trim_increment_value', 0.05)
40  self._pub_feedback = rospy.Publisher("set_feedback", Feedback, queue_size=1)
41  rospy.Subscriber('status', Status, self.cb_status, queue_size=1)
42  rospy.loginfo("Linear Scale is at %f" , self._scales["linear"]["x"])
43  self._feedback = Feedback()
44 
45  self._feedback.set_rumble = True
46  def cb_status(self, msg):
47  """
48  :param msg:
49  :type msg: Status
50  :return:
51  """
52  input_vals = {}
53  for attr in self._attrs:
54  input_vals[attr] = getattr(msg, attr)
55 
56  to_pub = self._cls()
57  if self._stamped:
58  to_pub.header.stamp = rospy.Time.now()
59  to_pub.header.frame_id = self._frame_id
60  twist = to_pub.twist
61  else:
62  twist = to_pub
63  # go through each velocity input types
64  for vel_type in self._inputs:
65  vel_vec = getattr(twist, vel_type)
66  for k, expr in self._inputs[vel_type].items():
67  scale = self._scales[vel_type].get(k, 1.0)
68  val = eval(expr, {}, input_vals)
69  setattr(vel_vec, k, scale * val)
70  if (msg.button_l1 or msg.button_r1) and self.buttonpressed is False:
71  trim_msg = Float32()
72  if msg.button_r1:
73  trim_msg = -self._trim_incre_value
74  elif msg.button_l1:
75  trim_msg = +self._trim_incre_value
76  self._pub_trim.publish(trim_msg)
77  self.buttonpressed = True
78  elif self.buttonpressed: # Debounce
79  self.counter += 1
80  if self.counter == 50:
81  self.counter = 0
82  self.buttonpressed = False
83  self._feedback.set_rumble = False
84  self._pub_feedback.publish(self._feedback)
85  if (msg.button_dpad_up or msg.button_dpad_down) and self.buttonpressed is False:
86  if msg.button_dpad_up and self._scales["linear"].get("x") < 3:
87  self._scales["linear"]["x"] += 0.05
88  elif msg.button_dpad_down and self._scales["linear"].get("x") > 0.05:
89  self._scales["linear"]["x"] -= 0.05
90  elif self._scales["linear"].get("x") <= 0.06 or self._scales["linear"].get("x") >= 3:
91  self._feedback.set_rumble = True
92  rospy.loginfo("Limit Reach %f", self._scales["linear"].get("x"))
93  self._feedback.rumble_big = 1
94  self._pub_feedback.publish(self._feedback)
95  rospy.loginfo('Linear Scale is at %f' ,self._scales["linear"]["x"])
96  self.buttonpressed = True
97  button_msg = Bool()
98  button_msg.data = False
99  button2_msg = Bool()
100  button2_msg.data = False
101  if msg.button_cross:
102  button_msg = Bool()
103  button_msg.data = True
104  self._pub_cross.publish(button_msg)
105  if msg.button_circle:
106  button2_msg = Bool()
107  button2_msg.data = True
108  self._pub_circle.publish(button2_msg)
109  self._pub_circle.publish(button2_msg)
110  self._pub_cross.publish(button_msg)
111  self._pub.publish(to_pub)
112 
113 
114 def main():
115 
116  rospy.init_node('ps4_mapper')
117  ps4_mapper()
118  rospy.spin()
119 
120 if __name__ == '__main__':
121  main()
def cb_status(self, msg)
Definition: ps4_mapper.py:46
def main()
Definition: ps4_mapper.py:114


rr_control_input_manager
Author(s):
autogenerated on Mon Feb 28 2022 23:43:49