def generate_target_line(self, n_samples=100): """ Using object trajectory (self.poses), build a line to compare to for frechet distance. Updates this attribute on object. :param n_samples: number of samples for target line. Defaults to 100 """ x_vals, y_vals = aplt.get_direction(self.trial_translation, n_samples) target_line = np.column_stack((x_vals, y_vals)) # get last object pose and use it for determining how far target line should go last_obj_pose = self.poses.tail(1).to_numpy()[0] target_line_length = acalc.narrow_target(last_obj_pose, target_line) if target_line_length: distance_travelled = acalc.t_distance( [0, 0], target_line[target_line_length + 1]) final_target_ln = target_line[:target_line_length] else: distance_travelled = acalc.t_distance([0, 0], target_line[0]) final_target_ln = target_line[:1] # TODO: distance travelled has error because it is built of target line... maybe use last_obj_pose instead? return final_target_ln, distance_travelled
def plot_direction(self, translation, rotation="n", show_plot=True, save_plot=False): """ Plot the average path for each hand data object contained in this object for a specific translation rotation pair. """ colors = [ "tab:blue", "tab:purple", "tab:red", "tab:olive", "tab:cyan", "tab:green", "tab:pink", "tab:orange" ] # grab the average values from all hands avg_label = f"{translation}_{rotation}" averages_to_plot = [] hand_order = [] for h in self.hands: hand_order.append(h.hand.get_name()) for a in h.averages: a_label = f"{a.trial_translation}_{a.trial_rotation}" if a_label == avg_label: averages_to_plot.append(a) for i, a in enumerate(averages_to_plot): a_x, a_y, _ = a.get_poses() plt.plot(a_x, a_y, color=colors[i], label=hand_order[i]) # plot the straight line t_x, t_y = AsteriskPlotting.get_direction(translation) plt.plot(t_x, t_y, color="r", linestyle="dashed") if save_plot: # added the zero to guarantee that it comes first plt.savefig(f"pics/0all_{rotation}.jpg", format='jpg') # name -> tuple: subj, hand names print("Figure saved.") print(" ") if show_plot: plt.legend() plt.show() return plt