joy_relative_converter.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 import rospy
3 
4 try:
5  from sensor_msgs.msg import Joy, JoyFeedbackArray
6 except:
7  roslib.load_manifest('jsk_teleop_joy')
8  from sensor_msgs.msg import Joy, JoyFeedbackArray
9 from std_msgs.msg import Int8, Empty
10 
12  def __init__(self):
13  self.input_origins = []
14  self.output_origins = []
15  self.prev_output_axes = [i for i in self.output_origins]
16 
17  def adjustAxesSize(self, axes_size):
18  if len(self.input_origins) != axes_size:
19  if len(self.input_origins) == 0:
20  self.input_origins = [None] * axes_size
21  self.output_origins = [0.5] * axes_size
22  rospy.loginfo("[midi_relative_converter] adjust axes size.")
23  else:
24  rospy.logwarn("[midi_relative_converter] different axes size!!")
25 
26  def convert(self, abs_axes):
27  self.adjustAxesSize(len(abs_axes))
28  self.updateInputOrigins(abs_axes)
29  rel_axes = self.__convertAxes(abs_axes, self.input_origins, self.output_origins)
30  self.__updatePrevOutputAxes(rel_axes)
31  return rel_axes
32 
33  def resetAllOrigins(self):
34  self.input_origins = []
35  self.output_origins = []
36  self.prev_output_axes = [i for i in self.output_origins]
37 
38  def resetInputOrigins(self):
39  for i in range(len(self.input_origins)):
40  self.input_origins[i] = None
41 
42  def updateInputOrigins(self, abs_axes):
43  for i in range(len(abs_axes)):
44  if self.input_origins[i] is None and abs_axes[i] != 0:
45  self.input_origins[i] = abs_axes[i]
46 
47  def __updatePrevOutputAxes(self, rel_axes):
48  self.prev_output_axes = list(rel_axes)
49 
51  self.output_origins = list(self.prev_output_axes)
52 
53  def __convertAxes(self, abs_axes, in_origins, out_origins):
54  rel_axes = [None] * len(abs_axes)
55  for i in range(len(abs_axes)):
56  rel_axes[i] = self.__convertAxis(abs_axes[i], in_origins[i], out_origins[i])
57  return rel_axes
58 
59  def __convertAxis(self, abs_axis, in_origin, out_origin):
60  if abs_axis == 1:
61  rel_axis = abs_axis
62  elif in_origin is None:
63  rel_axis = out_origin
64  elif abs_axis < in_origin:
65  rel_axis = (((abs_axis - 0.0) / (in_origin - 0.0)) * (out_origin - 0.0)) + 0.0
66  elif abs_axis == in_origin:
67  rel_axis = out_origin
68  elif abs_axis > in_origin:
69  rel_axis = (((abs_axis - in_origin) / (1.0 - in_origin)) * (1.0 - out_origin)) + out_origin
70  return rel_axis
71 
73  def __init__(self, max_page=1):
74  self.ac = [AxesConverter() for i in range(max_page)]
75  self.crt_page = 0
76  self.prev_input_axes = []
77  for page in range(max_page):
78  joy_pub = rospy.Publisher("/joy_relative/page_" + str(page), Joy)
79  rospy.Subscriber("/joy", Joy, self.joy_callback)
80  rospy.Subscriber("/midi_relative_converter/command/switch_page", Int8, self.switch_page_cmd_cb)
81  rospy.Subscriber("/midi_relative_converter/command/reset", Empty, self.reset_cmd_cb)
82 
83  def convert(self, abs_axes):
84  return self.ac[self.crt_page].convert(abs_axes)
85 
86  def switchPage(self, page):
87  if page >= 0 and page < len(self.ac):
88  if page != self.crt_page:
91  self.crt_page = page
92  return page
93  else:
94  return -1
95 
96  def resetAllOrigins(self):
97  for i in range(len(self.ac)):
98  self.ac[i].resetAllOrigins()
99 
100  def __updateReserveInputOrigins(self, abs_axes):
101  for i in range(len(self.ac)):
102  if i != self.crt_page:
103  self.ac[i].adjustAxesSize(len(abs_axes))
104  self.ac[i].resetInputOrigins()
105  self.ac[i].updateInputOrigins(abs_axes)
106 
108  self.ac[self.crt_page].updateOutputOrigins()
109 
110  def joy_callback(self, data):
111  joy = Joy()
112  joy.header.stamp = rospy.Time.now()
113  joy.axes = self.convert(data.axes)
114  joy.buttons = data.buttons
115  self.prev_input_axes = list(data.axes)
116  joy_pub = rospy.Publisher("/joy_relative/page_" + str(self.crt_page), Joy)
117  joy_pub.publish(joy)
118 
119  def switch_page_cmd_cb(self, msg):
120  self.switchPage(msg.data)
121 
122  def reset_cmd_cb(self, msg):
123  self.resetAllOrigins()
124 
125 def main():
126  rospy.init_node('joy_relative_converter')
127  aca = AxesConverterArray(3)
128  rospy.spin()
129 
130 if __name__ == '__main__':
131  main()
def __convertAxes(self, abs_axes, in_origins, out_origins)
def __convertAxis(self, abs_axis, in_origin, out_origin)


jsk_teleop_joy
Author(s): Ryohei Ueda
autogenerated on Fri May 14 2021 02:52:11