sickTrick.py
Go to the documentation of this file.
1 #! /usr/bin/env python3
2 import rospy
3 import riptide_controllers.msg
4 import actionlib
5 from trajectory_msgs.msg import MultiDOFJointTrajectory, MultiDOFJointTrajectoryPoint
6 from geometry_msgs.msg import Transform, Quaternion, Vector3, PoseStamped
7 from moveit_msgs.msg import ExecuteTrajectoryActionGoal
8 from nav_msgs.msg import Path, Odometry
9 import numpy as np
10 from tf.transformations import quaternion_multiply, quaternion_inverse, quaternion_from_euler
11 import os
12 import csv
13 
14 def msg_2_numpy(msg):
15  if hasattr(msg, "w"):
16  return np.array([msg.x, msg.y, msg.z, msg.w])
17  return np.array([msg.x, msg.y, msg.z])
18 
19 def body_2_world(orientation, vector):
20  """
21  Rotates world-frame vector to body-frame
22 
23  Rotates vector to body frame
24 
25  Parameters:
26  orientation (np.array): The current orientation of the robot as a quaternion
27  vector (np.array): The 3D vector to rotate
28 
29  Returns:
30  np.array: 3 dimensional rotated vector
31 
32  """
33 
34  vector = np.append(vector, 0)
35  orientation_inv = quaternion_inverse(orientation)
36  new_vector = quaternion_multiply(orientation, quaternion_multiply(vector, orientation_inv))
37  return new_vector[:3]
38 
39 
40 
41 class SickTrickAction(object):
42 
43  def __init__(self):
44  self.trajectory_pub = rospy.Publisher("execute_trajectory/goal/", ExecuteTrajectoryActionGoal, queue_size=1)
45  self.position_pub = rospy.Publisher("position", Vector3, queue_size=1)
46  self.orientation_pub = rospy.Publisher("orientation", Quaternion, queue_size=1)
47  self.path_pub = rospy.Publisher("sick_trick_path", Path, queue_size=1)
48 
49  self._as = actionlib.SimpleActionServer("sick_trick", riptide_controllers.msg.SickTrickAction, execute_cb=self.execute_cb, auto_start=False)
50  self._as.start()
51 
52  self.DT = 0.1
53 
54 
55 
56  def input_2_world(self, input_point, input_orientation, position, orientation):
57  body_frame_position = np.array([input_point[0] - self.middle_x, input_point[1] - self.middle_y, input_point[2] - self.middle_z])
58  world_frame_position = body_2_world(orientation, body_frame_position) + position
59  world_frame_orientation = quaternion_multiply(orientation, input_orientation)
60 
61  return world_frame_position, world_frame_orientation
62 
63 
64  def execute_cb(self, goal):
65 
66  PATH = "~/osu-uwrt/riptide_software/src/riptide_controllers/cfg/%s.csv" % goal.trick
67 
68  self.points = []
69 
70  with open(os.path.expanduser(PATH), "r") as csvfile:
71  reader = csv.reader(csvfile, delimiter=',', quotechar='|')
72  for row in reader:
73  self.points.append(list(map(float, row)))
74 
75  self.points = np.array(self.points)
76 
77 
78  self.min_x = np.min(self.points[:,0])
79  self.max_x = np.max(self.points[:,0])
80  self.middle_x = (self.max_x + self.min_x) / 2
81  self.min_y = np.min(self.points[:,1])
82  self.max_y = np.max(self.points[:,1])
83  self.middle_y = (self.max_y + self.min_y) / 2
84  self.min_z = np.min(self.points[:,2])
85  self.max_z = np.max(self.points[:,2])
86  self.middle_z = (self.max_z + self.min_z) / 2
87 
88  odom_msg = rospy.wait_for_message("odometry/filtered", Odometry)
89  initial_position = msg_2_numpy(odom_msg.pose.pose.position)
90  initial_orientation = msg_2_numpy(odom_msg.pose.pose.orientation)
91 
92 
93  world_frame_position, world_frame_orientation = self.input_2_world(self.points[0][:3], self.points[0][3:], initial_position, initial_orientation)
94  self.position_pub.publish(Vector3(*world_frame_position))
95  self.orientation_pub.publish(Quaternion(*world_frame_orientation))
96  rospy.sleep(10)
97 
98 
99  trajectory = MultiDOFJointTrajectory()
100  path = Path()
101  path.header.frame_id = "world"
102  path.header.stamp = rospy.get_rostime()
103 
104 
105  for i in range(self.points.shape[0]):
106  world_frame_position, world_frame_orientation = self.input_2_world(self.points[i][:3], self.points[i][3:], initial_position, initial_orientation)
107 
108  point = MultiDOFJointTrajectoryPoint()
109  point.transforms.append(Transform(Vector3(*world_frame_position), Quaternion(*world_frame_orientation)))
110  point.time_from_start = rospy.Duration(i * self.DT)
111  trajectory.points.append(point)
112 
113  path_point = PoseStamped()
114  path_point.pose.position = Vector3(*world_frame_position)
115  path_point.pose.orientation = Quaternion(*world_frame_orientation)
116  path_point.header.stamp = rospy.get_rostime() + rospy.Duration(i * self.DT)
117  path_point.header.frame_id = "world"
118  path.poses.append(path_point)
119 
120  trajectory_action = ExecuteTrajectoryActionGoal()
121  trajectory_action.goal.trajectory.multi_dof_joint_trajectory = trajectory
122 
123  self.trajectory_pub.publish(trajectory_action)
124 
125  self.path_pub.publish(path)
126  rospy.sleep(len(self.points) * self.DT)
127 
128  self._as.set_succeeded()
129 
130 
131 
132 
133 
134 if __name__ == '__main__':
135  rospy.init_node('sick_trick')
136  server = SickTrickAction()
137  rospy.spin()
138 
139 
140 
141 
142 
sickTrick.msg_2_numpy
def msg_2_numpy(msg)
Definition: sickTrick.py:14
sickTrick.SickTrickAction.execute_cb
def execute_cb(self, goal)
Definition: sickTrick.py:64
sickTrick.SickTrickAction.__init__
def __init__(self)
Definition: sickTrick.py:43
sickTrick.SickTrickAction.points
points
Definition: sickTrick.py:68
sickTrick.SickTrickAction.min_y
min_y
Definition: sickTrick.py:81
sickTrick.SickTrickAction.min_x
min_x
Definition: sickTrick.py:78
sickTrick.SickTrickAction.middle_z
middle_z
Definition: sickTrick.py:86
sickTrick.SickTrickAction.position_pub
position_pub
Definition: sickTrick.py:45
sickTrick.body_2_world
def body_2_world(orientation, vector)
Definition: sickTrick.py:19
sickTrick.SickTrickAction.DT
DT
Definition: sickTrick.py:52
sickTrick.SickTrickAction.max_y
max_y
Definition: sickTrick.py:82
sickTrick.SickTrickAction.max_z
max_z
Definition: sickTrick.py:85
sickTrick.SickTrickAction.middle_x
middle_x
Definition: sickTrick.py:80
sickTrick.SickTrickAction
Definition: sickTrick.py:41
sickTrick.SickTrickAction.min_z
min_z
Definition: sickTrick.py:84
sickTrick.SickTrickAction.orientation_pub
orientation_pub
Definition: sickTrick.py:46
sickTrick.SickTrickAction.middle_y
middle_y
Definition: sickTrick.py:83
sickTrick.SickTrickAction.max_x
max_x
Definition: sickTrick.py:79
sickTrick.SickTrickAction._as
_as
Definition: sickTrick.py:49
actionlib::SimpleActionServer
sickTrick.SickTrickAction.path_pub
path_pub
Definition: sickTrick.py:47
sickTrick.SickTrickAction.trajectory_pub
trajectory_pub
Definition: sickTrick.py:44
sickTrick.SickTrickAction.input_2_world
def input_2_world(self, input_point, input_orientation, position, orientation)
Definition: sickTrick.py:56


riptide_controllers
Author(s): Blaine Miller, Mitchell Sayre
autogenerated on Wed Mar 2 2022 00:50:23