【旋转矩阵的求导及ICP问题的迭代求解与Maltab代码实现】

介绍

旋转矩阵的求导是在相机标定、ICP求解、PnP求解中经常涉及的问题。但是由于旋转矩阵本身特殊的约束存在,使得旋转矩阵的求导不像其它参数的求解那么简单。《视觉SLAM十四讲》从李群-李代数角度对旋转矩阵的求导做了详细的介绍,但笔者在看的时候,一直是云里雾里的,看了好几遍才看懂。实际上,旋转矩阵的求导涉及的核心是罗德里格斯公式,《Computer Vision: Algorithms and Applications》这本书里从罗德里格斯公式小角度旋转下的近似出发,对旋转矩阵的求导有一段精要的介绍,很方便小白的理解。这里结合个人理解进行分享,并以ICP问题求解为例,给出雅可比矩阵及迭代公式的形式,以及相应的Matlab代码实现。

旋转矩阵

三维空间中的旋转矩阵 R R R 3 × 3 3\times3 3×3的矩阵,满足如下约束
R R T = I , det ⁡ ( R ) = 1 RR^T=I,\det(R)=1 RRT=I,det(R)=1此性质说明,旋转矩阵是单位正交矩阵,且行列式值为1。但要注意的是,并非所有单位正交矩阵都是旋转矩阵,一些单位正交矩阵的行列式值为-1,这种矩阵是旋转镜像矩阵。

罗德里格斯公式

旋转有多种表示方法,旋转矩阵是其中一种,此外还有轴角(旋转向量)、欧拉角、四元数等,几种表示方法可以相互进行转换。
轴角把旋转描述为绕某一轴单位向量 n = [ n 1 , n 2 , n 3 ] T n=[n_1,n_2,n_3]^T n=[n1,n2,n3]T旋转一定角度 θ \theta θ的形式,或等效地用向量 ω = θ n \omega= \theta n ω=θn表示。罗德里格斯公式定义了从轴角到旋转矩阵的变换
R = cos ⁡ θ I + ( 1 − cos ⁡ θ ) n n T + sin ⁡ θ n ∧ R = \cos\theta I + (1-\cos\theta )n n^T+\sin\theta n^\wedge R=cosθI+(1cosθ)nnT+sinθn其中,符号 ∧ \wedge 表示向量的反对称矩阵,表示为
n ∧ = [ 0 − n 3 n 2 n 3 0 − n 1 − n 2 n 1 0 ] n^\wedge=\begin{bmatrix}0&-n_3&n_2\\n_3&0&-n_1\\-n_2&n_1&0\end{bmatrix} n= 0n3n2n30n1n2n10

小角度近似

Computer Vision: Algorithms and Applications, 2nd ed, p47.

θ \theta θ较小时,罗德里格斯公式近似为(对 cos ⁡ θ , sin ⁡ θ \cos\theta,\sin\theta cosθ,sinθ进行泰勒展开得到)
R = I + θ n ∧ + O ( θ 2 ) ≈ I + ω ∧ = [ 1 − ω 3 ω 2 ω 3 1 − ω 1 − ω 2 ω 1 1 ] R = I +\theta n^\wedge+O(\theta^2) \approx I+\omega^\wedge=\begin{bmatrix}1&-\omega_3&\omega_2\\\omega_3&1&-\omega_1\\-\omega_2&\omega_1&1\end{bmatrix} R=I+θn+O(θ2)I+ω= 1ω3ω2ω31ω1ω2ω11 则旋转矩阵 R ( ω ) R(\omega) R(ω)与点 p p p的乘积在小角度旋转下可以近似表示为 R ( ω ) p ≈ p + ω ∧ p = p − p ∧ ω R(\omega)p \approx p+\omega^\wedge p=p-p^\wedge\omega R(ω)pp+ωp=ppω则有 ∂ R ( ω ) p ∂ ω = − p ∧ \frac{\partial R(\omega)p}{\partial \omega}=-p^\wedge ωR(ω)p=p

ICP问题求解

以点云对齐ICP问题为例介绍旋转矩阵的求导,已知初始点云 p 1 , p 2 , . . . , p N p_1,p_2,...,p_N p1,p2,...,pN和经过位姿变换后匹配的点云 p 1 ′ , p 2 ′ , . . . , p N ′ p_1',p_2',...,p_N' p1,p2,...,pN,求旋转矩阵 R ( ω ) R(\omega) R(ω)和平移向量 t t t。优化问题表示为
min ⁡ ω , t ∑ n ∥ R ( ω ) p n + t − p n ′ ∥ 2 2 \min_{\omega,t} \sum_n \| R(\omega)p_n+t-p_n'\|^2_2 ω,tminnR(ω)pn+tpn22尽管此问题可通过SVD直接求解,但本文介绍通过迭代求解的方法,方便读者对旋转矩阵求导的理解。令 f ( ω , t ) = R ( ω ) p + t − p ′ f(\omega,t)=R(\omega)p+t-p' f(ω,t)=R(ω)p+tp,则有 ∂ f ( ω , t ) ∂ ω = lim ⁡ Δ ω → 0 R ( Δ ω ) R ( w ) p + t − p ′ − ( R ( w ) p + t − p ′ ) Δ ω = lim ⁡ Δ ω → 0 R ( Δ ω ) R ( w ) p − R ( w ) p Δ ω \frac{\partial f(\omega,t)}{\partial\omega}=\lim_{\Delta\omega\to0}\frac{R(\Delta\omega)R(w)p+t-p'-(R(w)p+t-p')}{\Delta\omega}\\=\lim_{\Delta\omega\to0}\frac{R(\Delta\omega)R(w)p-R(w)p}{\Delta\omega} ωf(ω,t)=Δω0limΔωR(Δω)R(w)p+tp(R(w)p+tp)=Δω0limΔωR(Δω)R(w)pR(w)p带入上述小角度近似公式 ∂ f ( ω , t ) ∂ ω ≈ ( I + ( Δ ω ) ∧ ) R ( w ) p − R ( w ) p Δ ω = ( Δ ω ∧ ) R ( w ) p Δ ω = − ( R ( w ) p ) ∧ Δ ω Δ ω = − ( R ( ω ) p ) ∧ \frac{\partial f(\omega,t)}{\partial\omega}\approx\frac{(I+(\Delta\omega)^\wedge)R(w)p-R(w)p}{\Delta\omega}\\=\frac{(\Delta\omega^\wedge)R(w)p}{\Delta\omega}\\=\frac{-(R(w)p)^\wedge\Delta\omega}{\Delta\omega}\\=-(R(\omega)p)^\wedge ωf(ω,t)Δω(I+(Δω))R(w)pR(w)p=Δω(Δω)R(w)p=Δω(R(w)p)Δω=(R(ω)p)对于平移向量,易得 ∂ f ( ω , t ) ∂ t = I \frac{\partial f(\omega,t)}{\partial t}=I tf(ω,t)=I注意 f , w , t f,w,t f,w,t均为 3 × 1 3\times1 3×1的向量,雅可比矩阵 J f = [ ∂ f 1 ∂ ω 1 ∂ f 1 ∂ ω 2 ∂ f 1 ∂ ω 3 ∂ f 1 ∂ t 1 ∂ f 1 ∂ t 2 ∂ f 1 ∂ t 3 ∂ f 2 ∂ ω 1 ∂ f 2 ∂ ω 2 ∂ f 2 ∂ ω 3 ∂ f 2 ∂ t 1 ∂ f 2 ∂ t 2 ∂ f 2 ∂ t 3 ∂ f 3 ∂ ω 1 ∂ f 3 ∂ ω 2 ∂ f 3 ∂ ω 3 ∂ f 3 ∂ t 1 ∂ f 3 ∂ t 2 ∂ f 3 ∂ t 3 ] = [ − ( R ( ω ) p ) ∧ I ] J_f=\begin{bmatrix}\frac{\partial f_1}{\partial\omega_1}&\frac{\partial f_1}{\partial\omega_2}&\frac{\partial f_1}{\partial\omega_3}&\frac{\partial f_1}{\partial t_1}&\frac{\partial f_1}{\partial t_2}&\frac{\partial f_1}{\partial t_3}\\\frac{\partial f_2}{\partial\omega_1}&\frac{\partial f_2}{\partial\omega_2}&\frac{\partial f_2}{\partial\omega_3}&\frac{\partial f_2}{\partial t_1}&\frac{\partial f_2}{\partial t_2}&\frac{\partial f_2}{\partial t_3}\\\frac{\partial f_3}{\partial\omega_1}&\frac{\partial f_3}{\partial\omega_2}&\frac{\partial f_3}{\partial\omega_3}&\frac{\partial f_3}{\partial t_1}&\frac{\partial f_3}{\partial t_2}&\frac{\partial f_3}{\partial t_3}\end{bmatrix}=\begin{bmatrix}-(R(\omega)p)^\wedge&I\end{bmatrix} Jf= ω1f1ω1f2ω1f3ω2f1ω2f2ω2f3ω3f1ω3f2ω3f3t1f1t1f2t1f3t2f1t2f2t2f3t3f1t3f2t3f3 =[(R(ω)p)I]

可以使用高斯牛顿法求解优化问题,迭代增量为
Δ x = ( J T ( x ) J ( x ) ) − 1 J T ( x ) F ( x ) J = [ J f 1 , ⋯   , J f N ] T F = [ f 1 , ⋯   , f N ] T ⇓ [ Δ ω Δ t ] = ( ∑ n J f n T J f n ) − 1 ⋅ ∑ n J f n T f n \Delta x=(J^T(x)J(x))^{-1}J^T(x)F(x)\\J=[J_{f_1}, \cdots, J_{f_N}]^T\\F=[f_1,\cdots,f_N]^T\\\Downarrow\\\begin{bmatrix}\Delta\omega\\\Delta t\end{bmatrix}=(\sum_{n}{J_{f_n}^TJ_{f_n}})^{-1}\cdot\sum_{n}{J_{f_n}^Tf_n} Δx=(JT(x)J(x))1JT(x)F(x)J=[Jf1,,JfN]TF=[f1,,fN]T[ΔωΔt]=(nJfnTJfn)1nJfnTfn旋转矩阵和平移向量的增量更新方式为
R = R ( Δ ω ) T R t = t − Δ t R=R(\Delta\omega)^TR\\t=t-\Delta t R=R(Δω)TRt=tΔt

Matlab代码

clear
clc
close all

% 读取点云
load('xyzPoints');
xyz1 = xyzPoints';
% 随机变换位姿
trans = randn(3,1);
rotm = rodrigues(randn(3,1));
xyz2 = rotm*xyz1+trans;
% 显示点云
figure,subplot(1,2,1),pcshowpair(pointCloud(xyz1'),pointCloud(xyz2')),title('优化前')

% ICP,高斯牛顿
R = eye(3);
t = zeros(3,1);
i = 1;
while(1)
    % 梯度
    grad = zeros(6,1);
    % J^T*J
    jtj = zeros(6,6);
    for j = 1:size(xyz1,2)
        p1 = xyz1(:,j);
        p2 = xyz2(:,j);
        f = R*p1+t-p2;
        jcb = [-ssm(R*p1),eye(3)];
        g = jcb'*f;
        grad = grad+g;
        jtj = jtj+jcb'*jcb;
    end
    deltaRt = jtj\grad;
    dR = rodrigues(deltaRt(1:3));
    dt = deltaRt(4:6);
    R = dR'*R;
    t = t-dt;
    err(i) = mean((R*xyz1+t-xyz2).^2,'all');
    if err(i)<1e-10
        break
    end
    i = i+1;
end
subplot(1,2,2),pcshowpair(pointCloud(xyz2'),pointCloud((R*xyz1+t)')),title('优化后')
figure,plot(err),xlabel('迭代次数'),ylabel('目标函数值')

% 反对称矩阵
function m = ssm(a)
m = [0 -a(3) a(2); a(3) 0 -a(1);-a(2) a(1) 0];
end
% 罗德里格斯公式
function m = rodrigues(rvec)
theta = sqrt(rvec'*rvec);
n = rvec/theta;
m = cos(theta)*eye(3)+(1-cos(theta))*(n*n')+sin(theta)*ssm(n);
end
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值