diff --git a/src/grocery_py/scripts/grocery_exec.py b/src/grocery_py/scripts/grocery_exec.py
index a00a4cc35409d093932d3e57737782b68a0d8cf5..c242b951a45b97c796d236df251ea2b31ff21043 100755
--- a/src/grocery_py/scripts/grocery_exec.py
+++ b/src/grocery_py/scripts/grocery_exec.py
@@ -338,6 +338,108 @@ def lab_invk(xWgrip, yWgrip, zWgrip, yaw_WgripDegree):
 #################### End of Lab 4 IK Function ######################
 
 
+################### Shelf Inverse Kinematic Function ##################
+def shelf_invk(xWgrip, yWgrip, zWgrip, yaw_WgripDegree):
+	# =================== Your code starts here ====================#
+
+	#all angles are in radians unless otherwise stated
+	#list the link lengths of the robot
+	L1 = 0.152
+	L2 = 0.12
+	L3 = 0.244
+	L4 = 0.093
+	L5 = 0.213
+	L6 = 0.083
+	L7 = 0.083
+	L8 = 0.082
+	L9 = 0.0535
+	L10 = 0.059
+
+	#initialize variable that keeps track of which quadrant the end-effector is in
+	quadrant = 1
+
+	#check which quadrant the end-effector is in
+	if xWgrip >= -0.15:
+		quadrant = 1
+	else:
+		quadrant = 2
+
+	#adjust the position to be based off of the green point
+	if quadrant == 1:
+		x_grip = xWgrip + 0.15
+	if quadrant == 2:
+		x_grip = abs(abs(xWgrip) - 0.3)
+		xWgrip = x_grip - 0.15
+	y_grip = yWgrip - 0.15
+	
+	#finding theta1
+	theta_a = np.arctan(y_grip / x_grip)
+
+	r0 = np.sqrt((x_grip**2) + (y_grip**2))
+	d0 = L8 + L10
+	d1 = np.sqrt((r0**2) + (d0**2) - (2 * r0 * d0 * np.cos(theta_a)))
+	theta_b = np.arccos(((d1**2) + (r0**2) - (d0**2))/(2 * d1 * r0))
+
+	d2 = L2 - L4 + L6
+	theta_c = np.arcsin(d2 / d1)
+
+	theta1 = theta_a + theta_b - theta_c
+
+	#finding theta5
+	theta5 = -theta1 - (np.pi/2)
+
+	#finding the centerpoint (the ornage point) 
+	x_cen = xWgrip - d0
+	y_cen = yWgrip
+	z_cen = zWgrip
+
+	#finding the endpoint (the yellow point)
+	d3 = L7 + L9
+
+	x3_end = x_cen + (d2 * np.sin(theta1))
+	y3_end = y_cen - (d2 * np.cos(theta1))
+	z3_end = z_cen - d3
+
+	#defining the green point
+	x1 = -0.15
+	y1 = 0.15
+	z1 = L1 + 0.01
+
+	#finding theta3
+	d4 = np.sqrt(((x3_end - x1)**2) + ((y3_end - y1)**2) + ((z3_end - z1)**2))
+	theta3 = np.pi - np.arccos(((L3**2) + (L5**2) - (d4**2)) / (2 * L3 * L5))
+
+	#finding theta2 
+	phi2 = np.arccos(((L3**2) + (d4**2) - (L5**2)) / (2 * L3 * d4))
+	phi1 = np.arcsin((z3_end - z1) / d4)
+	theta2 = -phi1 - phi2
+
+	#finding theta4
+	theta4 = -theta2 - theta3 - (np.pi / 2)
+
+	#constraining theta6
+	theta6 = np.pi / 2
+
+	#adjust theta1 and theta5 if they are in quadrant II
+	if quadrant == 2:
+		theta1 = np.pi - (2 * theta_c) - theta1
+		theta5 = (np.pi / 2) - theta1
+
+
+	#modify theta values to match robot value definitions IF not using lab_fk to return the value
+	# Initialize the return_value
+	return_value = [None, None, None, None, None, None]
+	return_value[0] = theta1 + np.pi
+	return_value[1] = theta2
+	return_value[2] = theta3
+	return_value[3] = theta4 - (0.5*np.pi)
+	return_value[4] = theta5
+	return_value[5] = theta6
+
+	# ==============================================================#
+	return return_value
+
+
 def main():
 
     calculate_shelf_pos(initial_shelf_pos)