Source code for rofunc.utils.robolab.ergonomics.reba_calculate.pose2degree.upper_arm_degree
import numpy as np
import rofunc as rf
[docs]class UpperArmDegree:
def __init__(self, joints_position):
self.joints_position = joints_position
[docs] def trunk_plane(self):
m_body_number = rf.ergolab.body_part_number()
trunk_joint_numbers = m_body_number.trunk_upper_body()
# finding a plane of upper body
u = self.joints_position[trunk_joint_numbers[1]] - self.joints_position[trunk_joint_numbers[0]]
v = self.joints_position[trunk_joint_numbers[3]] - self.joints_position[trunk_joint_numbers[0]]
normal_plane = np.cross(u, v)
return normal_plane
[docs] def upper_arm_flex(self):
m_body_number = rf.ergolab.body_part_number()
right_upper_arm_joint_numbers = m_body_number.right_arm()
left_upper_arm_joint_numbers = m_body_number.left_arm()
trunk_joint_numbers = m_body_number.trunk_whole_body()
right_upper_arm_vector = self.joints_position[right_upper_arm_joint_numbers[1]] - self.joints_position[
right_upper_arm_joint_numbers[0]]
left_upper_arm_vector = self.joints_position[left_upper_arm_joint_numbers[1]] - self.joints_position[
left_upper_arm_joint_numbers[0]]
normal_trunk_plane = self.trunk_plane()
spine_vector = self.joints_position[trunk_joint_numbers[3]] - self.joints_position[trunk_joint_numbers[2]]
sagittal_plane_normal = np.cross(normal_trunk_plane, spine_vector)
sagittal_plane_normal /= np.linalg.norm(sagittal_plane_normal)
right_arm_projection = right_upper_arm_vector - np.dot(right_upper_arm_vector,
sagittal_plane_normal) * sagittal_plane_normal
left_arm_projection = left_upper_arm_vector - np.dot(left_upper_arm_vector,
sagittal_plane_normal) * sagittal_plane_normal
# Calculate flexion angles using the projection and the normalized spine vector
flex_right_upper_arm = np.degrees(np.arccos(np.dot(right_arm_projection, spine_vector) /
(np.linalg.norm(right_arm_projection) * np.linalg.norm(
spine_vector))))
flex_left_upper_arm = np.degrees(np.arccos(np.dot(left_arm_projection, spine_vector) /
(np.linalg.norm(left_arm_projection) * np.linalg.norm(
spine_vector))))
return [flex_right_upper_arm, flex_left_upper_arm]
[docs] def upper_arm_abduct(self):
m_body_number = rf.ergolab.body_part_number()
right_upper_arm_joint_numbers = m_body_number.right_arm()
left_upper_arm_joint_numbers = m_body_number.left_arm()
trunk_joint_numbers = m_body_number.trunk_whole_body()
right_upper_arm_vector = self.joints_position[right_upper_arm_joint_numbers[1]] - self.joints_position[
right_upper_arm_joint_numbers[0]]
left_upper_arm_vector = self.joints_position[left_upper_arm_joint_numbers[1]] - self.joints_position[
left_upper_arm_joint_numbers[0]]
normal_trunk_plane = self.trunk_plane()
proj_right_upperarm_on_plane = right_upper_arm_vector - np.dot(right_upper_arm_vector,
normal_trunk_plane) * normal_trunk_plane
proj_left_upperarm_on_plane = left_upper_arm_vector - np.dot(left_upper_arm_vector,
normal_trunk_plane) * normal_trunk_plane
spine_vector = self.joints_position[trunk_joint_numbers[3]] - self.joints_position[trunk_joint_numbers[2]]
right_side_degree = rf.ergolab.get_angle_between_degs(spine_vector, proj_right_upperarm_on_plane)
left_side_degree = rf.ergolab.get_angle_between_degs(spine_vector, proj_left_upperarm_on_plane)
if np.dot(np.cross(spine_vector, right_upper_arm_vector), normal_trunk_plane) < 0:
# if the arm go to the body: adduction
right_side_degree *= -1
if np.dot(np.cross(spine_vector, left_upper_arm_vector), normal_trunk_plane) > 0:
left_side_degree *= -1
return [right_side_degree, left_side_degree]
[docs] def shoulder_rise(self):
m_body_number = rf.ergolab.body_part_number()
trunk_joint_numbers = m_body_number.trunk_upper_body()
right_shoulder_joint_numbers = m_body_number.right_shoulder()
left_shoulder_joint_numbers = m_body_number.left_shoulder()
spine_vector = self.joints_position[trunk_joint_numbers[0]] - self.joints_position[trunk_joint_numbers[2]]
right_shoulder_vector = self.joints_position[right_shoulder_joint_numbers[1]] - self.joints_position[
right_shoulder_joint_numbers[0]]
left_shoulder_vector = self.joints_position[left_shoulder_joint_numbers[1]] - self.joints_position[left_shoulder_joint_numbers[0]]
right_shoulder_rise_degree = 90 - rf.ergolab.get_angle_between_degs(spine_vector, right_shoulder_vector)
left_shoulder_rise_degree = 90 - rf.ergolab.get_angle_between_degs(spine_vector, left_shoulder_vector)
return [right_shoulder_rise_degree, left_shoulder_rise_degree]
[docs] def upper_arm_degrees(self):
flexion = self.upper_arm_flex()
side = self.upper_arm_abduct()
shoulder_rise = self.shoulder_rise()
right_flexion = flexion[0]
left_flexion = flexion[1]
right_side = side[0]
left_side = side[1]
right_shoulder_rise = shoulder_rise[0]
left_shoulder_rise = shoulder_rise[1]
return [right_flexion,left_flexion,right_side,left_side,right_shoulder_rise,left_shoulder_rise]