雅可比矩陣完整推導:從關節速度到奇異點分析

2026-07-22
  • jacobian
  • singularity
  • kinematics
  • manipulability
  • svd

問題定義

已知每個關節目前的角速度 θ˙1,θ˙2,,θ˙n\dot{\theta}_1, \dot{\theta}_2, \dots, \dot{\theta}_n,末端執行器的線速度與角速度是多少?反過來,如果要讓末端往某個方向以某個速度移動,各關節角速度該設多少?這兩個問題(速度正解與速度反解)都圍繞著同一個核心工具:雅可比矩陣(Jacobian)。

雅可比矩陣在機器人學裡有三個直接用途,這也是為什麼它是逆向運動學數值解法、速度層級控制、力矩控制三個看似不同的問題背後共用的同一個數學物件:

  1. 速度層級的運動學映射:把關節空間的速度轉換成任務空間(末端)的速度。
  2. 逆向運動學數值迭代的核心:每次迭代都靠 Jacobian 反矩陣(或虛擬反矩陣)決定關節角度該怎麼調整。
  3. 靜力/力矩轉換:Jacobian 轉置把末端施力轉換成各關節所需力矩,這是力控制與阻抗控制的數學基礎。

幾何雅可比矩陣的逐欄推導

雅可比矩陣定義了關節速度與末端速度之間的線性關係:

[vω]=J(θ)θ˙=[JvJω]θ˙\begin{bmatrix} \boldsymbol{v} \\ \boldsymbol{\omega} \end{bmatrix} = J(\boldsymbol{\theta}) \, \dot{\boldsymbol{\theta}} = \begin{bmatrix} J_v \\ J_\omega \end{bmatrix} \dot{\boldsymbol{\theta}}

其中 v\boldsymbol{v} 是末端線速度、ω\boldsymbol{\omega} 是末端角速度,JJ 是一個 6×n6 \times n 的矩陣(nn 是關節數)。關鍵是:Jacobian 的每一欄(column)可以獨立、逐關節地用幾何方式推導出來,不需要對整條運動學鏈做符號微分。

對第 ii 個關節,設 zi1\boldsymbol{z}_{i-1} 是該關節旋轉軸(或平移軸)在基座座標系下的方向向量,oi1\boldsymbol{o}_{i-1} 是該關節座標系原點的位置,on\boldsymbol{o}_n 是末端執行器的位置。第 ii 欄的公式依關節類型而不同:

旋轉關節(revolute joint)

Ji=[zi1×(onoi1)zi1]J_i = \begin{bmatrix} \boldsymbol{z}_{i-1} \times (\boldsymbol{o}_n - \boldsymbol{o}_{i-1}) \\ \boldsymbol{z}_{i-1} \end{bmatrix}

線速度分量是「角速度 × 力臂」的外積形式——關節 ii 以單位角速度旋轉時,末端會因為距離該軸 (onoi1)(\boldsymbol{o}_n - \boldsymbol{o}_{i-1}) 的力臂而產生切線速度,方向由外積決定;角速度分量直接就是該軸方向 zi1\boldsymbol{z}_{i-1},因為旋轉關節的角速度只會沿著自己的軸線方向疊加到末端角速度上。

移動關節(prismatic joint)

Ji=[zi10]J_i = \begin{bmatrix} \boldsymbol{z}_{i-1} \\ \boldsymbol{0} \end{bmatrix}

移動關節只會沿著軸線方向平移,直接貢獻線速度、不貢獻角速度。

這些 zi1\boldsymbol{z}_{i-1}oi1\boldsymbol{o}_{i-1} 全部可以從正向運動學一路累乘 DH 轉換矩陣的過程中順手取出——每算完一個 T0i1T_0^{i-1},第三欄就是 zi1\boldsymbol{z}_{i-1}(旋轉軸方向),第四欄前三個元素就是 oi1\boldsymbol{o}_{i-1}(原點位置),不需要額外的符號運算。

幾何雅可比 vs 解析雅可比

上面推導的是幾何雅可比(Geometric Jacobian):角速度部分是物理上真實的角速度向量 ω\boldsymbol{\omega},量測上有直接意義(例如陀螺儀量到的就是這個)。

但如果姿態是用尤拉角 ϕ=(α,β,γ)\boldsymbol{\phi} = (\alpha, \beta, \gamma) 這類參數化表示,很多控制器會直接對 ϕ\boldsymbol{\phi} 微分得到 ϕ˙\dot{\boldsymbol{\phi}},這種用參數化變化率定義的版本稱為解析雅可比(Analytical Jacobian)。兩者的關係是:

ω=B(ϕ)ϕ˙\boldsymbol{\omega} = B(\boldsymbol{\phi}) \, \dot{\boldsymbol{\phi}}

B(ϕ)B(\boldsymbol{\phi}) 是一個跟尤拉角參數化方式相關的轉換矩陣,在特定姿態下 BB 本身也會變成奇異(這就是尤拉角參數化本身固有的「表示奇異點」,例如萬向鎖 gimbal lock),跟幾何雅可比描述的「機構奇異點」是兩件不同的事,實作控制器時必須分清楚:如果誤差項用尤拉角算,卻拿幾何雅可比去做增量更新,會在特定姿態附近出現數值不一致。

奇異點分析

J(θ)J(\boldsymbol{\theta}) 不滿秩(rank deficient)時,代表手臂在目前姿態下進入了運動學奇異點(kinematic singularity):存在某些方向的末端速度,不管關節怎麼動都無法產生。方陣情形(n=6n=6)下最直接的判斷是行列式:

detJ(θ)=0    奇異點\det J(\boldsymbol{\theta}) = 0 \iff \text{奇異點}

但行列式只能告訴你「是不是」奇異,沒辦法量化「有多接近奇異」,實務上更常用奇異值分解(SVD):

J=UΣVT,Σ=diag(σ1,σ2,,σ6)J = U \Sigma V^T, \qquad \Sigma = \operatorname{diag}(\sigma_1, \sigma_2, \dots, \sigma_6)

奇異值 σi\sigma_i 全部代表末端在各主軸方向上速度輸出的「增益」。當最小奇異值 σmin0\sigma_{\min} \to 0,代表在對應方向上,不管關節轉多快,末端在該方向的速度都趨近於零——這正是逆向運動學一文中提到「Jacobian 反矩陣在奇異點附近數值爆炸」的根本原因:反矩陣裡包含 1/σi1/\sigma_i 項,σi0\sigma_i \to 0 直接讓對應項發散。

可操縱度(Manipulability)

Yoshikawa 提出的可操縱度指標,用一個純量描述手臂在目前姿態下離奇異點有多遠:

w(θ)=det(JJT)=σ1σ2σ6w(\boldsymbol{\theta}) = \sqrt{\det\left(J J^T\right)} = \sigma_1 \sigma_2 \cdots \sigma_6

w=0w = 0 就是奇異點,ww 越大代表手臂在該姿態下的運動靈活度越高。這個指標常被拿來當作軌跡規劃時的最佳化目標之一——在多組可行解裡,優先選擇 ww 較大的姿態,讓手臂遠離奇異點、留有更多操作餘裕。

JJTJ J^T 的特徵值分解幾何上對應一個橢球(可操縱度橢球,manipulability ellipsoid):橢球主軸方向是特徵向量,主軸長度是奇異值——長軸方向代表「小幅度關節運動就能讓末端快速移動」的方向,短軸方向代表末端在該方向移動吃力。這個橢球常見於機械手臂工作站佈局設計:把手臂主要作業方向對齊橢球的長軸方向,能讓同樣的關節出力換到最大的末端運動效率。

常見奇異點型態

  • 邊界奇異點(boundary singularity):手臂完全伸直或完全收起,到達工作空間邊界時發生,直覺上很好理解——手臂伸到最長時,沿著手臂方向已經沒有多餘的自由度可以再往外伸。
  • 內部奇異點(interior singularity):發生在工作空間內部,不直覺、也更常在實際軌跡規劃裡造成問題。最常見的例子是 6 軸手臂的手腕奇異點(wrist singularity):當第 4 軸與第 6 軸的旋轉軸線重合(通常發生在第 5 軸角度接近 0 的姿態),兩個軸線效果上退化成同一個自由度,手臂在該姿態附近會需要第 4、6 軸做出極大幅度、極高速的補償轉動,才能維持末端姿態的微小連續變化——這是很多商用手臂在軌跡規劃軟體裡會標示「警告:接近奇異姿態」的典型情況。

力/力矩對偶關係

Jacobian 轉置描述另一個方向的映射:如果末端施加外力/力矩 F=(f,τ)\boldsymbol{F} = (\boldsymbol{f}, \boldsymbol{\tau}),對應到各關節需要輸出的力矩是:

τjoint=JT(θ)F\boldsymbol{\tau}_{\text{joint}} = J^T(\boldsymbol{\theta}) \, \boldsymbol{F}

這個關係可以直接從虛功原理(virtual work)推導:關節做的虛功 τjointTδθ\boldsymbol{\tau}_{\text{joint}}^T \delta\boldsymbol{\theta} 必須等於末端做的虛功 FTδx\boldsymbol{F}^T \delta\boldsymbol{x},代入 δx=Jδθ\delta\boldsymbol{x} = J \delta\boldsymbol{\theta} 就得到 τjoint=JTF\boldsymbol{\tau}_{\text{joint}} = J^T \boldsymbol{F}。這是力控制、阻抗控制(impedance control)、以及協作型機械手臂碰撞偵測(透過關節力矩感測器反推末端受力)的數學基礎。

值得注意的是速度可操縱度橢球與力可操縱度橢球是彼此的對偶:速度橢球長軸方向,正好是力橢球的短軸方向。也就是說「容易高速移動的方向」與「容易輸出大力量的方向」在幾何上恰好相反——這不是設計缺陷,是 JJJTJ^T 這組對偶關係在物理上的直接體現,跟槓桿「省力就費距離、省距離就費力」的直覺是同一件事的多自由度版本。

程式碼範例

python
import numpy as np


def geometric_jacobian(joint_axes, joint_origins, end_effector_pos, joint_types):
    """
    joint_axes: list of z_{i-1} 方向向量(基座座標系下),長度 n
    joint_origins: list of o_{i-1} 位置向量(基座座標系下),長度 n
    end_effector_pos: 末端執行器位置 o_n
    joint_types: list of 'revolute' 或 'prismatic',長度 n
    """
    n = len(joint_axes)
    J = np.zeros((6, n))
    for i in range(n):
        z = joint_axes[i]
        o = joint_origins[i]
        if joint_types[i] == "revolute":
            J[:3, i] = np.cross(z, end_effector_pos - o)
            J[3:, i] = z
        else:  # prismatic
            J[:3, i] = z
            J[3:, i] = np.zeros(3)
    return J


def manipulability(J):
    """Yoshikawa 可操縱度指標,w = 0 代表奇異點"""
    return np.sqrt(np.linalg.det(J @ J.T))


def singularity_analysis(J):
    """回傳奇異值與最小奇異值,用來判斷是否接近奇異點"""
    singular_values = np.linalg.svd(J, compute_uv=False)
    return singular_values, singular_values.min()

實務上判斷「是否接近奇異點」不會等到 ww 精確等於 0 才反應,而是設一個門檻值(例如 σmin<0.01\sigma_{\min} < 0.01),提前觸發阻尼最小平方法裡的阻尼項或降速保護,這也是逆向運動學一文中阻尼最小平方法公式裡 λ\lambda 的實務調參依據——λ\lambda 通常會設計成隨 σmin\sigma_{\min} 動態調整,離奇異點遠時 λ\lambda 趨近 0(幾乎不犧牲精度),接近奇異點時 λ\lambda 增大(換取穩定性)。

常見錯誤

  • 拿解析雅可比的角速度部分直接當成物理角速度使用:兩者只有在特定條件下相等,混用會在特定姿態附近產生難以除錯的數值誤差。
  • 只用行列式判斷奇異點、卻沒有量化接近程度:行列式非零不代表安全,detJ\det J 很小但非零時,反矩陣仍然可能出現數值不穩定,應該用最小奇異值或可操縱度指標做連續量化的監控,而不是只做布林判斷。
  • 忘記 Jacobian 是姿態相關的J(θ)J(\boldsymbol{\theta}) 每個姿態都不同,不能只算一次就重複使用在整段軌跡上,尤其軌跡經過奇異點附近時差異會非常明顯。
  • 力矩轉換公式方向搞反τ=JTF\boldsymbol{\tau} = J^T \boldsymbol{F} 跟速度公式 x˙=Jθ˙\dot{x} = J\dot{\theta} 用的是同一個 JJ,但轉置方向相反,混淆這兩個公式是實作力控制時常見的符號錯誤來源。

延伸閱讀

常見問題

faq_01.log
幾何雅可比與解析雅可比差在哪裡?什麼時候要注意這個差異?
幾何雅可比(Geometric Jacobian)把末端姿態變化率表示成角速度向量 ω,這個角速度是物理上真實存在、可以直接測量的量;解析雅可比(Analytical Jacobian)則是把姿態用某種參數化(例如尤拉角、RPY 角)表示,姿態變化率是這組參數各自的時間導數,兩者只有在特定條件下才相等。差異在做速度控制時通常可以忽略幾何雅可比就好,但如果你的控制器內部用尤拉角參數化姿態誤差(很多實作是這樣),就必須用解析雅可比,或者透過角速度與尤拉角變化率之間的轉換矩陣做修正,否則在某些姿態附近會出現數值上的不一致。
faq_02.log
為什麼可操縱度橢圓的形狀跟力量或速度的方向有關?
可操縱度橢圓來自對 JJᵀ 做特徵值分解,橢圓的每個主軸方向對應 JJᵀ 的一個特徵向量,主軸長度對應該方向奇異值的大小。這在物理上代表:橢圓拉得長的方向,代表關節只要小幅度運動就能讓末端在該方向產生大幅度移動(速度容易、但輸出力矩相對受限);橢圓壓扁的方向則相反,代表末端在該方向移動困難、但關節出力能有效轉換成末端輸出力(速度受限、出力容易)。這是速度可操縱度橢圓與力可操縱度橢圓互為對偶(力橢圓的主軸正好是速度橢圓主軸的倒數)的原因,也是機械手臂在设计階段要考慮工作姿態、避免橢圓在關鍵作業方向過度扁平的原因。
faq_03.log
奇異點一定要避免嗎?有沒有例外?
在大多數需要在該方向持續施力或持續控速的任務裡,奇異點都應該避免——因為在奇異方向上,即使關節出力或轉速再大,末端在該方向的輸出速度或力矩都趨近於零,控制器會需要不成比例地大的關節動作才能勉強逼近微小的末端運動,這在實務上通常表現成動作卡頓或需求超出馬達極限。但也有刻意利用奇異點的例外案例:某些高精度平面加工任務會刻意把手臂姿態設計在特定奇異點附近,因為該姿態下手臂在其他方向的微小擾動幾乎不會傳導到加工方向上,反而帶來額外的穩定性——這是特例而非常規做法,一般設計仍以規劃軌跡時主動避開奇異點為原則。