target_marker.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 from interactive_markers.interactive_marker_server import InteractiveMarkerServer
3 from visualization_msgs.msg import Marker, InteractiveMarker, InteractiveMarkerControl
4 from geometry_msgs.msg import Pose, Point, Quaternion
5 import PyKDL as kdl
6 import pyexotica as exo
7 
8 __all__ = ['TargetMarker']
9 
10 def list_to_pose(p):
11  if len(p) == 3:
12  return Pose(Point(x = p[0], y = p[1], z = p[2]), Quaternion(x = 0., y = 0., z = 0., w = 1.))
13  elif len(p) == 6:
14  quat = exo.KDLFrame(p).get_quaternion()
15  return Pose(Point(x = p[0], y = p[1], z = p[2]), Quaternion(x = quat[0], y = quat[1], z = quat[2], w = quat[3]))
16  elif len(p) == 7:
17  return Pose(Point(x = p[0], y = p[1], z = p[2]), Quaternion(x = p[3], y = p[4], z = p[5], w = p[6]))
18  else:
19  raise RuntimeError('Invalid transform! Can only accept vectors of length 3, 6 or 7')
20 
21 
23  def __init__(self, pose=[0, 0, 0, 0, 0, 0, 1],
24  description='Target',
25  server_name='target_marker',
26  frame_id='exotica/world_frame',
27  marker_shape=Marker.ARROW,
28  marker_size=[0.2, 0.05, 0.05],
29  marker_color=[0.0, 0.5, 0.5, 1.0],
30  controls=[],
31  controls_rotate=True,
32  controls_translate=True):
33  self.position = kdl.Frame()
34  self.position_exo = exo.KDLFrame()
35  self.server = InteractiveMarkerServer(server_name)
36  self.int_marker = InteractiveMarker()
37  self.int_marker.header.frame_id = frame_id
38  self.int_marker.name = server_name
39  self.int_marker.description = description
40  self.int_marker.pose = list_to_pose(pose)
41  self.position_exo = exo.KDLFrame(pose)
42  self.position = kdl.Frame(
43  kdl.Rotation.Quaternion(self.int_marker.pose.orientation.x, self.int_marker.pose.orientation.y, self.int_marker.pose.orientation.z, self.int_marker.pose.orientation.w),
44  kdl.Vector(self.int_marker.pose.position.x, self.int_marker.pose.position.y, self.int_marker.pose.position.z))
45 
46  # create a grey box marker
47  visual_marker = Marker()
48  visual_marker.type = marker_shape
49  if len(marker_size) != 3:
50  raise RuntimeError("Length of marker_size needs to be 3.")
51  visual_marker.scale.x = marker_size[0]
52  visual_marker.scale.y = marker_size[1]
53  visual_marker.scale.z = marker_size[2]
54  if len(marker_color) != 4:
55  raise RuntimeError("Length of marker_color needs to be 4.")
56  visual_marker.color.r = marker_color[0]
57  visual_marker.color.g = marker_color[1]
58  visual_marker.color.b = marker_color[2]
59  visual_marker.color.a = marker_color[3]
60 
61  # create a non-interactive control which contains the box
62  visual_control = InteractiveMarkerControl()
63  visual_control.always_visible = True
64  visual_control.markers.append( visual_marker )
65 
66  # add the control to the interactive marker
67  self.int_marker.controls.append( visual_control )
68 
69  if controls_rotate:
70  self.addControl([1, 0, 0], InteractiveMarkerControl.ROTATE_AXIS)
71  self.addControl([0, 1, 0], InteractiveMarkerControl.ROTATE_AXIS)
72  self.addControl([0, 0, 1], InteractiveMarkerControl.ROTATE_AXIS)
73  if controls_translate:
74  self.addControl([1, 0, 0], InteractiveMarkerControl.MOVE_AXIS)
75  self.addControl([0, 1, 0], InteractiveMarkerControl.MOVE_AXIS)
76  self.addControl([0, 0, 1], InteractiveMarkerControl.MOVE_AXIS)
77 
78  for control in controls:
79  self.int_marker.controls.append(control)
80 
81  self.server.insert(self.int_marker, self.process_feedback)
82  self.server.applyChanges()
83 
84  def addControl(self, direction, control_type):
85  control = InteractiveMarkerControl()
86  quat = exo.KDLFrame([0, 0, 0] + direction + [1]).get_quaternion()
87  control.orientation.x = quat[0]
88  control.orientation.y = quat[1]
89  control.orientation.z = quat[2]
90  control.orientation.w = quat[3]
91  control.interaction_mode = control_type
92  self.int_marker.controls.append(control)
93 
94  def process_feedback(self, feedback):
95  self.position = kdl.Frame(
96  kdl.Rotation.Quaternion(feedback.pose.orientation.x, feedback.pose.orientation.y, feedback.pose.orientation.z, feedback.pose.orientation.w),
97  kdl.Vector(feedback.pose.position.x, feedback.pose.position.y, feedback.pose.position.z))
98  self.position_exo = exo.KDLFrame([feedback.pose.position.x, feedback.pose.position.y, feedback.pose.position.z,
99  feedback.pose.orientation.x, feedback.pose.orientation.y, feedback.pose.orientation.z, feedback.pose.orientation.w])
def __init__(self, pose=[0, description='Target', server_name='target_marker', frame_id='exotica/world_frame', marker_shape=Marker.ARROW, marker_size=[0.2, marker_color=[0.0, controls=[], controls_rotate=True, controls_translate=True)
def addControl(self, direction, control_type)


exotica_examples
Author(s):
autogenerated on Mon Feb 28 2022 22:26:13