首页 > 其他 > 详细

Codes: MODERN ROBOTICS_Ch.3_矩阵指数映射与对数映射的代码实现

时间:2019-08-23 01:14:39      阅读:229      评论:0      收藏:0      [点我收藏+]
%% Matrix exponential for so3
% 根据wtheta_mat,求取旋转矩阵
function [R]=MatExp3r(wtheta_mat)
    % 求出w与theta
    wtheta = so3ToVecr(wtheta_mat);
    theta = norm(wtheta);
    w = wtheta./theta;
    % 求w的矩阵表示w_mat
    w_mat = vecToso3r(w);
    % 求矩阵指数映射
    R= eye(3)+sin(theta).* w_mat+(1-cos(theta)).* w_mat^2;
end

%% 矩阵对数算法,根据旋转矩阵R,求旋转指数坐标的矩阵表示wtheta_mat
% R to so3mat, namely, so3omghat.*theta
function wtheta_mat = MatLog3r(R)
    if isequal(R,eye(3))
        theta = 0;
        fprintf(‘omghat is undefined‘);
        wtheta_mat = zeros(3);
    elseif trace(R)==-1
        theta = pi;
        if ~NearZero(1+R(3,3))
            w =(1/sqrt(2*(1+R(3,3))))...
                    .*[R(1,3);R(2,3);1+R(3,3)]
        elseif ~NearZero(1+R(2,2))
            w =(1/sqrt(2*(1+R(2,2))))...
                    .*[R(1,2);1+R(2,2);R(3,2)]
        elseif ~NearZero(1+R(3,3))
            w =(1/sqrt(2*(1+R(1,1))))...
                    .*[1+R(1,1);R(2,1);R(3,1)]
        end
        w_mat = vecToso3r(w);
        wtheta_mat = w_mat.*theta;
    else
        theta = acos((trace(R)-1)/2);
        w_mat = (1/(2*sin(theta))).*(R-R‘);
        wtheta_mat = w_mat.*theta;
    end
end

%% 根据指数坐标的矩阵表示stheta_mat,求变换矩阵T
function T = MatExp6r(stheta_mat)
    % 从指数坐标的矩阵表示se3中,解出螺旋轴s、theta
    stheta = se3ToVecr(stheta_mat);
    wtheta = stheta(1:3);
    vtheta = stheta(4:6);
    % 根据wtheta是否为零,判断theta的取值
    if ~NearZero(norm(wtheta))
        theta = norm(wtheta);
    else
        theta = norm(vtheta);
    end
    % 从stheta中求单位螺旋轴s
    s = stheta./theta;
    w = s(1:3);
    v = s(4:6);
    % 求旋转轴向量w的矩阵表示w_mat
    w_mat = vecToso3r(w);
    % 求旋转指数坐标wtheta的矩阵表示wtheta_mat
    wtheta_mat = vecToso3r(wtheta);
    % 求指数坐标的矩阵表示对应的指数映射,R
    R = MatExp3r(wtheta_mat);
    Gv = (eye(3).*theta+(1-cos(theta)).*w_mat+(theta-sin(theta)).*w_mat^2)*v;
    T=[R, Gv; 
       0,0,0,1];
end

%% 根据变换矩阵T,求螺旋指数坐标stheta_mat
function stheta_mat = MatLog6r(T)
    [R,p] = TransToRpr(T);
    if isequal(eye(3), R)
        w = zeros(3,1);
        theta = norm(p);
        v = p./theta;
    else
        wtheta_mat = MatLog3r(R);
        wtheta = so3ToVecr(wtheta_mat);
        theta = norm(wtheta);
        w = (wtheta)‘./theta;
        w_mat = vecToso3r(w);
        v = ((1/theta).*eye(3)-1/2.*w_mat+(1/theta-1/2*cot(theta/2)).*w_mat^2)*p;
    end
    s = [w; v];
    stheta = s.*theta;
    stheta_mat = VecTose3r(stheta);
end

  

Codes: MODERN ROBOTICS_Ch.3_矩阵指数映射与对数映射的代码实现

原文:https://www.cnblogs.com/yuankai-ren/p/11397545.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!