罗德里格斯旋转公式

前置计算,先求与旋转轴垂直的向量的表示
  • 元素定义:
    • 旋转轴为k\vec{k},注意k\vec{k}是单位向量
    • v\vec{v}是将要旋转的向量,vrot\vec{v_{rot}}是旋转后的结果
    • θ是旋转角度
    • v\vec{v}k\vec{k} 相互垂直,根据右手螺旋定则可得 y轴就是k\vec{k}×\timesv\vec{v}
注意此y轴是叉乘的结果,不是世俗意义的y轴
  • 公式:vrot\vec{v_{rot}}​​ =cosθ\cos\theta · v\vec{v} + sinθ\sin\theta· k\vec{k}×\timesv\vec{v} ;
    • 推导过程:
      • 因为垂直,所以可以忽略一个坐标轴,我们只要算xy平面
      • 分解vrot\vec{v_{rot}}⟹ 在x,y轴的分量,易得他们是cosθ\cos\thetav\vec{v}sinθ\sin\thetak\vec{k}×\timesv\vec{v}vrot\vec{v_{rot}}就是他们的和。
普遍情况的计算
  • 核心思路:把向量分解成平行于旋转轴的v\vec{v_{||}}​​,和垂直于旋转轴的v\vec{v_{\perp}}
  • 结论:vrot\vec{v_{rot}}=cosθ\cos\theta· v\vec{v} + (1 – cosθ\cos\theta ) · v\vec{v} ·k\vec{k} · k\vec{k}+ sinθ\sin\theta k\vec{k}×\timesv\vec{v} = v\vec{v_{||}}​​ + v\vec{v_{\perp}}​​’;
  • 先求v\vec{v_{||}}​​ ,旋转后他不会改变
    • v\vec{v_{||}}​​ =| v\vec{v} | · cos<k,v>\cos{< \vec{k},\vec{v}>} · k\vec{k} ,因为 v\vec{v} · k\vec{k} =|v\vec{v}|·|k\vec{k}cos<k,v>\cos{< \vec{k},\vec{v}>} ;|k\vec{k} |==1 ,所以 v\vec{v_{||}}​​ =v\vec{v} · k\vec{k} · k\vec{k};
      | v\vec{v} | · cos<k,v>\cos{< \vec{k},\vec{v}>}是标量,后面的k\vec{k}制定了方向
  • 再求v\vec{v_{\perp}}​​ =v\vec{v}v\vec{v_{||}}​​ =v\vec{v}v\vec{v} · k\vec{k} · k\vec{k}
  • 然后! v\vec{v_{\perp}}​​’ 的值就用垂直情况的公式:vrot\vec{v_{rot}} =cosθ\cos\theta​​​​​​​​​​ · v\vec{v}​​​​​​​ +sinθ\sin\theta​​​​​​​​​​ · (k\vec{k}​​​ ×\times​​​​​​ v\vec{v}​​​​​​​) ;将 v\vec{v_{\perp}}代入公式中的v\vec{v}
    • v\vec{v_{\perp}}​​’ = cosθ·vcos\theta ·\vec{v}cosθ\cos\theta · v\vec{v} · v\vec{v} · k\vec{k} + sinθ\sin\theta · (k\vec{k} ×\timesv\vec{v_{\perp}})= cosθ·vcos\theta·\vec{v}cosθ\cos\theta · v\vec{v} · k\vec{k} · k\vec{k} + sinθ\sin\theta ·( k\vec{k} ×\timesv\vec{v})
      • sin90\sin90^\circ =1 ,k\vec{k} ×\timesv\vec{v_{\perp}}​​= k\vec{k}×\timesv\vec{v}的推导:
        k\vec{k}×\timesv\vec{v} = k\vec{k}×\times( v\vec{v_{||}}​​ + v\vec{v_{\perp}}​​)= k\vec{k}×\timesv\vec{v_{||}}​​ + k\vec{k}×\timesv\vec{v_{\perp}}k\vec{k}×\timesv\vec{v_{||}}​​ =0
矩阵表示
  • vrot\vec{v}_{rot}=cosθ\cos\theta · v\vec{v} + (1 – cosθ\cos\theta ) · vT\vec{v^{T}} · k\vec{k} · k\vec{k} + sinθ\sin\theta ( k\vec{k}×\timesv\vec{v})
    注意矩阵要用向量的转置
  • vrot\vec{v_{rot}}​​ =R · v\vec{v} 的R矩阵
    • 观察矩阵,公因数是v\vec{v} ,想办法把它提出来。
      • 点乘符合交换律⟹ vT\vec{v^{T}} · k\vec{k} · k\vec{k} = k\vec{k} · kT\vec{k^{T}} · v\vec{v}
      • 利用叉乘的性质,叉乘变换成点乘 sinθ\sin\theta ( k\vec{k}×\timesv\vec{v})
        • 如果有 a\vec{a}=[a1a_{1}​,a2a_{2}​,a3a_{3}​] , b\vec{b}=[b1b_{1}​,b2b_{2}b3b_{3}​] ,三维坐标轴i\vec{i} j\vec{j} k\vec{k}
          • a\vec{a} = a1a_{1}​ · i\vec{i} + a2a_{2}​ · j\vec{j}​ + a3a_{3}​ · k\vec{k} ; b\vec{b} = b1b_{1}​ · i\vec{i} +b2b_{2}​ · j\vec{j}+ b3b_{3} · k\vec{k}
          • a\vec{a}× b\vec{b} = ( a2a_{2} b3b_{3}​ – a3a_{3}b2b_{2} ) · i\vec{i} + ( a3a_{3}b1b_{1}​ – a1a_{1}b3b_{3}​ ) · j\vec{j}​ + ( a1a_{1}b2b_{2}​ – a2a_{2}b1b_{1}​ ) · k\vec{k} 写成矩阵
          • 可推出a\vec{a}×\timesb\vec{b} =R · b\vec{b} ,R= [a]X[a]_{X} 向量a的叉乘矩阵
  • 带入 k\vec{k}×\timesv\vec{v} 得到 [k]X[k]_{X}​ · v\vec{v}
  • 总结,把v\vec{v}提出来 R=cosθ\cos\theta · I3×3I_{3\times3}​ + (1 – cosθ\cos\theta) · kT\vec{k^{T}} · k\vec{k} + sinθ\sin\theta · [k]X[k]_{X}
CPP函数实现

注意要对axis进行归一化,注意矩阵乘法的维度对应。

学习了B站up机长与茶,感谢感谢

3.矩阵形式_哔哩哔哩_bilibili

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注