3 import riptide_controllers.msg
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
10 from tf.transformations
import quaternion_multiply, quaternion_inverse, quaternion_from_euler
16 return np.array([msg.x, msg.y, msg.z, msg.w])
17 return np.array([msg.x, msg.y, msg.z])
21 Rotates world-frame vector to body-frame
23 Rotates vector to body frame
26 orientation (np.array): The current orientation of the robot as a quaternion
27 vector (np.array): The 3D vector to rotate
30 np.array: 3 dimensional rotated vector
34 vector = np.append(vector, 0)
35 orientation_inv = quaternion_inverse(orientation)
36 new_vector = quaternion_multiply(orientation, quaternion_multiply(vector, orientation_inv))
44 self.
trajectory_pub = rospy.Publisher(
"execute_trajectory/goal/", ExecuteTrajectoryActionGoal, queue_size=1)
45 self.
position_pub = rospy.Publisher(
"position", Vector3, queue_size=1)
47 self.
path_pub = rospy.Publisher(
"sick_trick_path", Path, queue_size=1)
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)
61 return world_frame_position, world_frame_orientation
66 PATH =
"~/osu-uwrt/riptide_software/src/riptide_controllers/cfg/%s.csv" % goal.trick
70 with open(os.path.expanduser(PATH),
"r")
as csvfile:
71 reader = csv.reader(csvfile, delimiter=
',', quotechar=
'|')
73 self.
points.append(list(map(float, row)))
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)
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))
99 trajectory = MultiDOFJointTrajectory()
101 path.header.frame_id =
"world"
102 path.header.stamp = rospy.get_rostime()
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)
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)
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)
120 trajectory_action = ExecuteTrajectoryActionGoal()
121 trajectory_action.goal.trajectory.multi_dof_joint_trajectory = trajectory
126 rospy.sleep(len(self.
points) * self.
DT)
128 self.
_as.set_succeeded()
134 if __name__ ==
'__main__':
135 rospy.init_node(
'sick_trick')