Lie group 实践


代码实践

【一】旋转矩阵 --> 欧拉角

https://blog.csdn.net/u012423865/article/details/78219787?locationNum=9&fps=1

旋转矩阵\mathbf{R}=\left[\begin{matrix} r_{11}& r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33} \end{matrix}\right]

则对应的绕x轴、y轴与z轴的三个旋转矩阵为:
\mathbf{R}_x(\theta)=\left[\begin{matrix} 1& 0 & 0\\ 0 & cos(\theta) & -sin(\theta) \\ 0 & sin(\theta) & cos(\theta) \end{matrix}\right]、\mathbf{R}_y(\theta)=\left[\begin{matrix} cos(\theta)& 0 & sin(\theta)\\ 0 & 1 & 0 \\ -sin(\theta) & 0 & cos(\theta) \end{matrix}\right] \mathbf{R}_z(\theta)=\left[\begin{matrix} cos(\theta) & -sin(\theta) & 0\\ sin(\theta) & cos(\theta) & 0\\ 0 & 0 & 1 \end{matrix}\right]
任何一个旋转可以表示为依次绕着三个旋转轴旋三个角度的组合。这三个角度称为欧拉角。

欧拉角求旋转矩阵

\mathbf{R}(\theta_x, \theta_y, \theta_z)=\mathbf{R}_x(\theta_x)\mathbf{R}_y(\theta_y)\mathbf{R}_z(\theta_z)
\mathbf{R}(\theta_x, \theta_y, \theta_z)=\left[\begin{matrix} c_yc_z & c_zs_xs_y & s_xs_z+c_xc_zs_y\\ c_ys_z & c_xc_z+s_xs_ys_z & c_xs_ys_z-c_zs_z\\ -s_y & c_ys_z & c_xc_y \end{matrix}\right]

旋转矩阵求欧拉角

\mathbf{R}(\theta_x, \theta_y, \theta_z)=\left[\begin{matrix} r_{11}& r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33} \end{matrix}\right]=\left[\begin{matrix} c_yc_z & c_zs_xs_y & s_xs_z+c_xc_zs_y\\ c_ys_z & c_xc_z+s_xs_ys_z & c_xs_ys_z-c_zs_z\\ -s_y & c_ys_z & c_xc_y \end{matrix}\right]求解方程,可得\begin{align} & \theta_{x}=atan2(r_{32}, r_{33})\\ & \theta_{y}=atan2(-r_{31}, \sqrt{r_{32}^2+r_{33}^2})\\ & \theta_{z}=atan2(r_{21}, r_{11}) \end{align}
注:atan2()为C++中的函数,atan2(y, x) 求的是y/x的反正切,其返回值为[-pi,+pi]之间的一个数。

function Eul = RotMat2Euler(R)

% Code provided by Graham Taylor, Geoff Hinton and Sam Roweis 
%
% Finds one of two equivalent Euler angle representations for a Direction
% Cosine Matrix
% Assumes the DCM is in 'zyx' order
% Given R, the rotation matrix
% Returns a vector of Euler angles (in radians)
%  the first about x axis, the second about y axis, the third about z axis
% Based on an article by Gregory G. Slabaugh
%
% Usage Eul = RotMat2Euler(R)

%Note we need to treat the case of cos(E2) = +- pi/2 separately
%This corresponds to element R(1,3) = +- 1

if R(1,3) == 1 | R(1,3) == -1   % 这里对应上面的(3, 1) 
  %special case
  E3 = 0; %set arbitrarily
  dlta = atan2(R(1,2),R(1,3));
  if R(1,3) == -1
    E2 = pi/2;
    E1 = E3 + dlta;
  else
    E2 = -pi/2;
    E1 = -E3 + dlta;
  end
else
  E2 = - asin(R(1,3));
  E1 = atan2(R(2,3)/cos(E2), R(3,3)/cos(E2));
  E3 = atan2(R(1,2)/cos(E2), R(1,1)/cos(E2));
end

Eul = [E1 E2 E3];

【二】四元数 --> 指数映射

给定四元数形式:\mathbf{q}=[\cos(\frac{\theta}{2}), n_x \sin(\frac{\theta}{2}), n_y \sin(\frac{\theta}{2}), n_z \sin(\frac{\theta}{2})]其中,\mathbf{n} 为旋转轴。
\begin{aligned} &\theta=2\arccos q_0\\ &[n_x, n_y, n_z]^T=[q_1, q_2, q_3]^T/sin{\frac{\theta}{2}} \end{aligned} \mathbf{n}是三维向量,它的模长和方向为\theta\mathbf{n_0}。令\mathbf{n_0}为长度为1的方向向量,则有\mathbf{n}=\theta\mathbf{n_0}

function [r]=quat2expmap(q)

% Software provided by Hao Zhang
% http://www.cs.berkeley.edu/~nhz/software/rotations
%
% function [r]=quat2expmap(q)
% convert quaternion q into exponential map r
% 
% denote the axis of rotation by unit vector r0, the angle by theta
% 这里的四元数是单位四元数
% q is of the form (cos(theta/2), r0*sin(theta/2))
% r is of the form r0*theta
  
  % 四元数范数要为1 
  if (abs(norm(q)-1)>1E-3)
    error('quat2expmap: input quaternion is not norm 1');
  end
  sinhalftheta=norm(q(2:4));     % 后三维求范数sin(theta/2)
  coshalftheta=q(1);             % 第一维就是cos(theta/2)
  r0=q(2:4)/(norm(q(2:4))+eps);  % 这一步的得到(n_x, n_y, n_z),即旋转轴
  % 四元数求theta角
  % atan2(y, x) Return the arc tangent (measured in radians) of y/x
  % 因为已经求得sin(x/2)和cos(x/2),所以可以反解出x
  theta=2*atan2(sinhalftheta,coshalftheta);
  % 将角度调整到[0, 2pi)
  theta=mod(theta+2*pi,2*pi);
  if (theta>pi)     % 若角度大于180,则方向取反
    theta=2*pi-theta; 
    r0=-r0; 
  end
  r=r0*theta;

【三】指数映射 --> 旋转矩阵

\mathbf{R}=exp(\mathbf{\phi}^{\wedge})=\cos\theta\mathbf{I}+(1-\cos\theta)\mathbf{a}\mathbf{a}^T+\sin{\theta}\mathbf{a}^{\wedge}

def expmap2rotmat(r):
  """
  Converts an exponential map angle to a rotation matrix
  Matlab port to python for evaluation purposes
  I believe this is also called Rodrigues' formula
  https://github.com/asheshjain399/RNNexp/blob/srnn/structural_rnn/CRFProblems/H3.6m/mhmublv/Motion/expmap2rotmat.m

  Args
    r: 1x3 exponential map
  Returns
    R: 3x3 rotation matrix
  """
  theta = np.linalg.norm( r )
  r0  = np.divide( r, max(theta, np.finfo(np.float32).eps) )
  r0x = np.array([0, -r0[2], r0[1], 0, 0, -r0[0], 0, 0, 0]).reshape(3,3)
  r0x = r0x - r0x.T
  R = np.eye(3,3) + np.sin(theta)*r0x + (1-np.cos(theta))*(r0x).dot(r0x);
  return R

【四】旋转矩阵 --> 四元数

\mathbf{q}=q_0+q_1i+q_2j+q_3k给定四元数形式:\mathbf{q}=[\cos(\frac{\theta}{2}), n_x \sin(\frac{\theta}{2}), n_y \sin(\frac{\theta}{2}), n_z \sin(\frac{\theta}{2})]对应的旋转矩阵\mathbf{R}q_0\! = \!\frac{\sqrt{\mathbf{tr}(\mathbf(R))\!+\!1}}{2},q_1\!=\!\frac{m_{32}\!-\!m_{23}}{4q_0},q_2\!=\!\frac{m_{13}\!-\!m_{31}}{4q_0},\ \ q_3\!=\!\frac{m_{21}\!-\!m_{12}}{4q_0}

function q=rotmat2quat(R)
% function q=rotmat2quat(R)
% convert a rotation matrix R into unit quaternion q
%  
% denote the axis of rotation by unit vector r0, the angle by theta
 % q is of the form (cos(theta/2), r0*sin(theta/2))

  % 如果 (norm(R*R'-eye(3,3))>1E-10 || det(R)<0)
  % rotmat2quat: input matrix is not a rotation matrix
  d=R-R';
  r(1)=-d(2,3);   % m23-m32
  r(2)=d(1,3);    % m31-m13
  r(3)=-d(1,2);   % m12-m32

  % norm(r)的结果是
  sintheta=norm(r)/2;   
  r0=r/(norm(r)+eps);  % 后三项的范数为sin(theta/2),归一化就是r0=(nx,ny,nz)
  % 直接求第一项q0,就等于单位四元数第一项cos(theta)
  costheta=(trace(R)-1)/2;
  
  theta=atan2(sintheta,costheta);
  q=[cos(theta/2) r0*sin(theta/2)];

【五】旋转矩阵 --> 指数映射

先转四元数,再转指数映射

def rotmat2expmap(R):
  return quat2expmap( rotmat2quat(R) );

总结:

欧拉角<->旋转矩阵->四元数->指数映射->旋转矩阵

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,386评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,939评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,851评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,953评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,971评论 5 369
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,784评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,126评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,765评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,148评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,744评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,858评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,479评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,080评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,053评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,278评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,245评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,590评论 2 343