2.7 欧拉角

为了继续深入,我们最终必须指定一组广义坐标。我们首先使用传统的欧拉角来做到这一点。之后,我们会找到描述刚体取向的其他方法。

我们正在使用一种关于广义坐标的函数 M 的中间表示来描述取向,该函数给出将物体从某个参考取向旋转到广义坐标指定的取向的旋转变换。这里我们选择的参考取向使得主轴单位向量 hata, , 与基向量 i 重合,这些基向量在此标记为 , ,

我们通过绕坐标轴的简单旋转来定义欧拉角。令 Rx() 为绕 轴右手旋转角度 ,令 Rz() 为绕 轴右手旋转角度 。欧拉角的函数 M 写作这三个简单坐标轴旋转的复合:

对应欧拉角 , ,

欧拉角可以指定物体的任何取向,但取向并不总是对应唯一的一组欧拉角。特别地,如果 = 0,则取向仅依赖于和 + ,因此取向并不能唯一确定

练习2.8. 欧拉角 并非显而易见所有取向都能用欧拉角表示。为了证明欧拉角足以表示所有取向,求解给出任意旋转 R 的欧拉角。请记住,某些取向并不对应欧拉角的唯一表示。

尽管欧拉角允许我们指定所有取向,因此可以用作广义坐标,但欧拉角的定义相当随意。事实上,我们并没有经过任何推理就得到了它们。这反映在我们对它们的介绍中,只是说“它们就是这样。”欧拉角对某些问题很适用,但对另一些问题则很繁琐。

还有其他定义类似角度集合的方法。例如,我们也可以取广义坐标使其满足

欧拉角的这些替代方案时不时会派上用场。

每个基本旋转都可以用一个矩阵来表示。表示绕 轴右手旋转角度 的旋转矩阵为

而绕 x 轴右手旋转角度 由矩阵

表示将物体从参考取向带到实际取向的旋转的矩阵为

旋转矩阵及其乘积可以通过简单程序构建:

(define (rotate-z-matrix angle)
  (matrix-by-rows
    (list (cos angle) (- (sin angle))               0)
    (list (sin angle)     (cos angle)               0)
    (list           0               0               1)))

(define (rotate-x-matrix angle)
  (matrix-by-rows 
    (list           1               0               0)
    (list           0     (cos angle) (- (sin angle)))
    (list           0     (sin angle)     (cos angle))))

(define (Euler->M angles)
  (let ((theta (ref angles 0))
        (phi   (ref angles 1))
        (psi   (ref angles 2)))
    (* (rotate-z-matrix phi)
       (rotate-x-matrix theta)
       (rotate-z-matrix psi))))

现在我们有了实现一个示例 M 的过程,我们可以使用第2.6节中的过程 M-of-q->omega-of-tM-of-q->omega-body-of-t 来求角速度向量的分量和角速度向量的体分量。例如,

(show-expression
 (((M-of-q->omega-body-of-t Euler->M)
   (up (literal-function 'theta)
       (literal-function 'phi)
       (literal-function 'psi)))
  't))



为了构建动能,我们需要给出角速度向量体分量的状态过程:

(show-expression
 ((M->omega-body Euler->M)
  (up 't 
      (up 'theta 'phi 'psi)
      (up 'thetadot 'phidot 'psidot))))



我们将这个结果封装为一个过程:

(define (Euler-state->omega-body local)
  (let ((q (coordinate local)) (qdot (velocity local)))
    (let ((theta (ref q 0)) 
          (psi (ref q 2))
          (thetadot (ref qdot 0))
          (phidot (ref qdot 1))
          (psidot (ref qdot 2)))
      (let ((omega-a (+ (* thetadot (cos psi))
                        (* phidot (sin theta) (sin psi))))
            (omega-b (+ (* -1 thetadot (sin psi))
                        (* phidot (sin theta) (cos psi))))
            (omega-c (+ (* phidot (cos theta)) psidot)))
        (column-matrix omega-a omega-b omega-c)))))

动能可以写为:

(define ((T-rigid-body A B C) local)
  (let ((omega-body (Euler-state->omega-body local)))
    (* 1/2
       (+ (* A (square (ref omega-body 0)))
          (* B (square (ref omega-body 1)))
          (* C (square (ref omega-body 2)))))))