scriptOhio.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 ScriptOhioAction(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("script_ohio_path", Path, queue_size=1)
48 
49  self._as = actionlib.SimpleActionServer("script_ohio", riptide_controllers.msg.ScriptOhioAction, execute_cb=self.execute_cb, auto_start=False)
50  self._as.start()
51  self._result = riptide_controllers.msg.CalibrateBuoyancyResult()
52 
53  PATH = "~/Downloads/script_ohio.csv"
54  self.Z_HEIGHT = 2.0
55  self.TOTAL_TIME = 120.0
56 
57  self.points = []
58 
59  with open(os.path.expanduser(PATH), "r") as csvfile:
60  spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
61  for row in spamreader:
62  self.points.append(list(map(int, map(float, row))))
63 
64  self.points = np.array(self.points)
65  self.points *= np.array([1, -1])
66 
67  self.i_dot = self.points[-1]
68  self.points = self.points[:-1]
69 
70 
71 
72  def input_2_world(self, input_point, position, orientation):
73  body_frame_position = self.scale * np.array([0, input_point[0] - self.middle_x, input_point[1] - self.middle_y])
74  world_frame_position = body_2_world(orientation, body_frame_position) + position
75 
76  return world_frame_position
77 
78 
79  def execute_cb(self, goal):
80 
81 
82 
83  dt = self.TOTAL_TIME / self.points.shape[0]
84  self.min_x = np.min(self.points[:,0])
85  self.max_x = np.max(self.points[:,0])
86  self.middle_x = (self.max_x + self.min_x) / 2
87  self.min_y = np.min(self.points[:,1])
88  self.max_y = np.max(self.points[:,1])
89  self.middle_y = (self.max_y + self.min_y) / 2
90 
91  self.scale = self.Z_HEIGHT / (self.max_y - self.min_y)
92 
93  odom_msg = rospy.wait_for_message("odometry/filtered", Odometry)
94  position = msg_2_numpy(odom_msg.pose.pose.position)
95  orientation = msg_2_numpy(odom_msg.pose.pose.orientation)
96 
97 
98  world_frame_position = self.input_2_world(self.points[0], position, orientation)
99  self.position_pub.publish(Vector3(*world_frame_position))
100  rospy.sleep(10)
101 
102 
103  trajectory = MultiDOFJointTrajectory()
104  path = Path()
105  path.header.frame_id = "world"
106  path.header.stamp = rospy.get_rostime()
107 
108 
109  for i in range(self.points.shape[0]):
110  world_frame_position = self.input_2_world(self.points[i], position, orientation)
111 
112  point = MultiDOFJointTrajectoryPoint()
113  point.transforms.append(Transform(Vector3(*world_frame_position), Quaternion(*orientation)))
114  point.time_from_start = rospy.Duration(i * dt)
115  trajectory.points.append(point)
116 
117  path_point = PoseStamped()
118  path_point.pose.position = Vector3(*world_frame_position)
119  path_point.header.stamp = rospy.get_rostime() + rospy.Duration(i * dt)
120  path_point.header.frame_id = "world"
121  path.poses.append(path_point)
122 
123  trajectory_action = ExecuteTrajectoryActionGoal()
124  trajectory_action.goal.trajectory.multi_dof_joint_trajectory = trajectory
125 
126  self.trajectory_pub.publish(trajectory_action)
127 
128  self._as.set_succeeded(self._result)
129 
130  self.path_pub.publish(path)
131  rospy.sleep(self.TOTAL_TIME)
132 
133  world_frame_end_position = self.input_2_world(np.array(self.i_dot), position, orientation)
134  self.position_pub.publish(Vector3(*world_frame_end_position))
135 
136  rospy.sleep(7)
137 
138  bowed_orientation = quaternion_multiply(orientation, quaternion_from_euler(0, 0.4, 0))
139  self.orientation_pub.publish(Quaternion(*bowed_orientation))
140  rospy.sleep(2)
141  self.orientation_pub.publish(Quaternion(*orientation))
142  rospy.sleep(2)
143 
144 
145 
146 
147 
148 if __name__ == '__main__':
149  rospy.init_node('script_ohio')
150  server = ScriptOhioAction()
151  rospy.spin()
152 
153 
154 
155 
156 
scriptOhio.ScriptOhioAction.path_pub
path_pub
Definition: scriptOhio.py:47
scriptOhio.ScriptOhioAction
Definition: scriptOhio.py:41
scriptOhio.ScriptOhioAction._result
_result
Definition: scriptOhio.py:51
scriptOhio.ScriptOhioAction.execute_cb
def execute_cb(self, goal)
Definition: scriptOhio.py:79
scriptOhio.ScriptOhioAction.__init__
def __init__(self)
Definition: scriptOhio.py:43
scriptOhio.ScriptOhioAction.orientation_pub
orientation_pub
Definition: scriptOhio.py:46
scriptOhio.ScriptOhioAction.i_dot
i_dot
Definition: scriptOhio.py:67
scriptOhio.ScriptOhioAction.middle_y
middle_y
Definition: scriptOhio.py:89
scriptOhio.ScriptOhioAction.max_y
max_y
Definition: scriptOhio.py:88
scriptOhio.ScriptOhioAction.TOTAL_TIME
TOTAL_TIME
Definition: scriptOhio.py:55
scriptOhio.ScriptOhioAction.max_x
max_x
Definition: scriptOhio.py:85
scriptOhio.ScriptOhioAction.min_y
min_y
Definition: scriptOhio.py:87
scriptOhio.ScriptOhioAction.scale
scale
Definition: scriptOhio.py:91
scriptOhio.ScriptOhioAction.middle_x
middle_x
Definition: scriptOhio.py:86
scriptOhio.ScriptOhioAction._as
_as
Definition: scriptOhio.py:49
scriptOhio.ScriptOhioAction.input_2_world
def input_2_world(self, input_point, position, orientation)
Definition: scriptOhio.py:72
scriptOhio.ScriptOhioAction.points
points
Definition: scriptOhio.py:57
scriptOhio.ScriptOhioAction.Z_HEIGHT
Z_HEIGHT
Definition: scriptOhio.py:54
scriptOhio.ScriptOhioAction.trajectory_pub
trajectory_pub
Definition: scriptOhio.py:44
scriptOhio.msg_2_numpy
def msg_2_numpy(msg)
Definition: scriptOhio.py:14
actionlib::SimpleActionServer
scriptOhio.ScriptOhioAction.position_pub
position_pub
Definition: scriptOhio.py:45
scriptOhio.ScriptOhioAction.min_x
min_x
Definition: scriptOhio.py:84
scriptOhio.body_2_world
def body_2_world(orientation, vector)
Definition: scriptOhio.py:19


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