Verify that formula (7.112) in PRO-Lecture.pdf for quaternion composition holds true. It is already present in the script in Maple, you just need to rewrite it in Python using sympy package.
Create a function check_7112(theta1_half, theta2_half, v_theta, v_phi, u_theta, u_phi) which takes two rotation half-angles theta1_half and theta2_half and also parameters v_theta, v_phi, u_theta, u_phi for defining two normalized rotation axes $(~v = [v_1, v_2, v_3]^T, u = [u_1, u_2, u_3]^T$) and returns RR21-R21 following the example in the script. In order to express the coordinates of $v$ and $u$ explicitly, it is convenient to use the trigonometric parametrization of the unit sphere.
Input/Output specifications:
theta1_half : angle associated to the first rotation ($\frac{\theta_1}{2}$) (sympy symbol)
theta2_half : angle associated to the second rotation ($\frac{\theta_2}{2}$) (sympy symbol)
v_theta, v_phi : angles in the trigonometric parametrization of the unit sphere, which define $v$ (sympy symbols)
u_theta, u_phi : angles in the trigonometric parametrization of the unit sphere, which define $u$ (sympy symbols)
sympy matrix. It is expected to have zeros inside (following the example in the script).
Inside check_7112 define $v$ and $u$ as follows:
def check_7112(theta1_half, theta2_half, v_theta, v_phi, u_theta, u_phi):
s1 = sympy.sin(theta1_half)
c1 = sympy.cos(theta1_half)
s2 = sympy.sin(theta2_half)
c2 = sympy.cos(theta2_half)
v1 = sympy.cos(v_theta) * sympy.sin(v_phi)
v2 = sympy.sin(v_theta) * sympy.sin(v_phi)
v3 = sympy.cos(v_phi)
u1 = sympy.cos(u_theta) * sympy.sin(u_phi)
u2 = sympy.sin(u_theta) * sympy.sin(u_phi)
u3 = sympy.cos(u_phi)
v = sympy.Matrix([v1, v2, v3])
u = sympy.Matrix([u1, u2, u3])
Also, create function R_from_theta_half_axis(theta, v) that takes as input rotation half-angle theta_half (sympy symbol) and axis v (sympy Matrix, 3×1, already normalized) and returns rotation matrix $R$ (sympy Matrix).
Verify that formula (7.116) in PRO-Lecture.pdf for quaternion composition holds true:
q1 from c1 and s1v1
q2 from c2 and s2v2
q21 from c21 and s21v21
Create a function check_7116(theta1_half, theta2_half, v_theta, v_phi, u_theta, u_phi) which takes two rotation half-angles theta1_half and theta2_half and also parameters v_theta, v_phi, u_theta, u_phi for defining two normalized rotation axes ($v = [v_1, v_2, v_3]^T, u = [u_1, u_2, u_3]^T$) and returns q2q1 - q21 (4×1, sympy Matrix, expected to be zeros).
Create function R_from_q(q) that takes as input quaternion (sympy Matrix, 4×1) and returns rotation matrix $R$ (sympy Matrix, 3×3).
Create function q_from_R(R) that takes as input rotation matrix $R$ (sympy Matrix, 3×3) and returns quaternion (sympy Matrix, 4×1).
Verify the formula 7.116 with the given rotation. You can use q1.subs() to get numbers
Implement the solution in a single file hw06.py. The file must contain the check_7112, R_from_theta_half_axis, check_7116, R_from_q, q_from_R functions, such that it can be imported (by an automatic evaluation) as
import hw06 res = hw06.check_7112(theta1_half, theta2_half, v_theta, v_phi, u_theta, u_phi) R = hw06.R_from_theta_half_axis(theta_half, v) res = hw06.check_7116(theta1_half, theta2_half, v_theta, v_phi, u_theta, u_phi) R = R_from_q(q) q = q_from_R(R)
Create an empty dictionary in Python:
solution = {}
The keys for this dictionary will be:
“q1” (4×1), “q2” (4×1), “q21” (4×1) containing the values for quaternions from task 6c
“R1” (3×3), “R2” (3×3), “R21” (3×3) containing the values for rotation matrices from task 6c
Finally, save solution to hw06.json:
import json
with open("hw06.json", "w") as outfile:
json.dump(solution, outfile)
Upload via the course ware the zip archive hw06.zip containing
hw06.py Python script (functions) solving the assignment. hw06.pdf short description of the solutionhw06.json