Halcon|通过旋转前后3维坐标点求旋转轴及旋转角度

绕空间任意轴的旋转矩阵

绕空间任意轴旋转的旋转矩阵为:空间任意轴的旋转矩阵
点击查看图片来源及公式推导
其中,(u,v,w)为旋转轴的单位矢量,(a,b,c)为旋转轴上任意一点 θ \theta θ旋转角度

Halcon求解旋转矩阵

在Halcon中,已知n个空间点旋转前的坐标:X1,Y1,Z1,以及旋转后的坐标:X2,Y2,Z2,可使用算子 vector_to_hom_mat3d 求解旋转矩阵。X1,Y1,Z1,X2,Y2,Z2均为含n个元素的向量。
例如:

vector_to_hom_mat3d ('rigid', X1 Y1, Z1, X2, Y2, Z2, HomMat3D)

HomMat3D即为求得的旋转矩阵。
vector_to_hom_mat3d算子中,第一个参数选择‘rigid’表示刚体变换(即仅有旋转+平移运动),此时已知旋转前后坐标点的个数至少要等于3,即n>=3;选择‘similarity’表示相似变换(即旋转+平移+缩放),此时需n>=3;选择‘affine’表示仿射变换,此时需n>=4;选择‘projective’表示投影变换,此时需n>=5。当坐标点量大于所需最少点数时,将采用最小二乘法进行拟合。

求旋转轴矢量及旋转角度

在Halcon中,二维矩阵的下标从0开始,并且按照先行后列的方式进行,即 H o m M a t 3 D [ 0 ] = u 2 + ( v 2 + w 2 ) ( 1 − c o s θ ) H o m M a t 3 D [ 1 ] = u v ( 1 − c o s θ ) − w s i n θ HomMat3D[0]=u^2+(v^2+w^2)(1-cos\theta) \\ HomMat3D[1]=uv(1-cos\theta)-wsin\theta HomMat3D[0]=u2+(v2+w2)(1cosθ)HomMat3D[1]=uv(1cosθ)wsinθ依此类推。
则参考旋转矩阵的形式,可知: 2 u s i n θ = H o m M a t 3 D [ 9 ] − H o m M a t 3 D [ 6 ] 2 v s i n θ = H o m M a t 3 D [ 2 ] − H o m M a t 3 D [ 8 ] 2 w s i n θ = H o m M a t 3 D [ 4 ] − H o m M a t 3 D [ 1 ] 2usin\theta = HomMat3D[9]-HomMat3D[6] \\ 2vsin\theta = HomMat3D[2]-HomMat3D[8] \\ 2wsin\theta = HomMat3D[4]-HomMat3D[1] 2usinθ=HomMat3D[9]HomMat3D[6]2vsinθ=HomMat3D[2]HomMat3D[8]2wsinθ=HomMat3D[4]HomMat3D[1]
则利用 u 2 + v 2 + w 2 = 1 u^2+v^2+w^2=1 u2+v2+w2=1可求得: u = u 2 = 1 1 / u 2 = 1 / 1 + v 2 u 2 + w 2 u 2 = 1 / ( 1 + ( 2 v s i n θ 2 u s i n θ ) 2 + ( 2 w s i n θ 2 u s i n θ ) 2 v = u 2 v s i n θ 2 u s i n θ w = u 2 w s i n θ 2 u s i n θ s i n θ = 2 u s i n θ / 2 u c o s θ = u 2 + ( v 2 + w 2 ) ( 1 − c o s θ ) − u 2 v 2 + w 2 = H o m M a t 3 D [ 0 ] − u 2 1 − u 2 u =\sqrt{u^2} =\frac{1}{\sqrt{1/u^2}} = 1/\sqrt{1+\frac{v^2}{u^2}+\frac{w^2}{u^2}} = 1/\sqrt{(1+(\frac{2vsin\theta}{2usin\theta})^2+(\frac{2wsin\theta}{2usin\theta})^2}\\ v = u\frac{2vsin\theta}{2usin\theta} \\ w = u\frac{2wsin\theta}{2usin\theta} \\ sin\theta = 2usin\theta/2u \\ cos\theta = \frac{u^2+(v^2+w^2)(1-cos\theta) - u^2}{v^2+w^2} = \frac{HomMat3D[0]- u^2 }{1-u^2} u=u2 =1/u2 1=1/1+u2v2+u2w2 =1/(1+(2usinθ2vsinθ)2+(2usinθ2wsinθ)2 v=u2usinθ2vsinθw=u2usinθ2wsinθsinθ=2usinθ/2ucosθ=v2+w2u2+(v2+w2)(1cosθ)u2=1u2HomMat3D[0]u2
至此,旋转轴矢量(u,v,w)以及旋转角度 θ \theta θ均已求出。

求旋转轴上一点

设(a,b,c)为旋转轴上任意一点,则根据旋转矩阵第四列的形式可得:
A ∗ x = y A*x=y Ax=y
其中, A = ( ( 1 − u 2 ) ( 1 − c o s θ ) w s i n θ − u v ( 1 − c o s θ ) − v s i n θ − u w ( 1 − c o s θ ) − w s i n θ − u v ( 1 − c o s θ ) ( 1 − v 2 ) ( 1 − c o s θ ) u ∗ s i n θ − v w ∗ ( 1 − c o s θ ) v s i n θ − u w ( 1 − c o s θ ) − u ∗ s i n θ − v w ( 1 − c o s θ ) ( 1 − w 2 ) ( 1 − c o s θ ) ) A=\left( \begin{array}{ccc} (1-u^2)(1-cos\theta) & wsin\theta-uv(1-cos\theta) & -vsin\theta-uw(1-cos\theta)\\ -wsin\theta-uv(1-cos\theta) & (1-v^2)(1-cos\theta) & u*sin\theta-vw*(1-cos\theta)\\ vsin\theta-uw(1-cos\theta) & -u*sin\theta-vw(1-cos\theta) & (1-w^2)(1-cos\theta) \\ \end{array} \right) A=(1u2)(1cosθ)wsinθuv(1cosθ)vsinθuw(1cosθ)wsinθuv(1cosθ)(1v2)(1cosθ)usinθvw(1cosθ)vsinθuw(1cosθ)usinθvw(1cosθ)(1w2)(1cosθ)
x = ( a b c ) x=\left( \begin{array}{c} a \\ b \\ c \\ \end{array} \right) x=abc
y = ( H o m M a t 3 D [ 3 ] H o m M a t 3 D [ 7 ] H o m M a t 3 D [ 11 ] ) y=\left( \begin{array}{c} HomMat3D[3] \\ HomMat3D[7] \\ HomMat3D[11] \\ \end{array} \right) y=HomMat3D[3]HomMat3D[7]HomMat3D[11]
如果直接求解该方程,会发现A近似于奇异,无法求解。原因如下:
我们知道,坐标轴上任一点(a,b,c)可写成如下形式:
( a , b , c ) = ( a 0 , b 0 , c 0 ) + k ( u , v , w ) (a,b,c)=(a_0,b_0,c_0) +k (u,v,w) (a,b,c)=(a0,b0,c0)+k(u,v,w)
其中,k为任意实数, ( a 0 , b 0 , c 0 ) (a_0,b_0,c_0) (a0,b0,c0)为坐标轴上一基点。可知,该方程的解是由一个特解和一个通解组成的,且通解 ( u , v , w ) (u,v,w) (u,v,w)我们已经求得。由线性代数知识可知, r a n k ( A ) = 2 rank(A)=2 rank(A)=2,即A奇异不可逆。
为求通解,可令 c c c为任意值 c 0 c_0 c0,之后使用 A ∗ x = y A*x=y Ax=y 的三个方程中任意两个方程求得 b 0 b_0 b0 c 0 c_0 c0,即可得到通解 ( a 0 , b 0 , c 0 ) (a_0,b_0,c_0) (a0,b0,c0)
需要注意:由于此时A的每一个元素都较小,利用 A ∗ x = y A*x=y Ax=y 任意两个方程的求解的 b 0 b_0 b0 c 0 c_0 c0值,也可能由于矩阵近于奇异造成较大的误差。此时需要其他方法测量得到旋转轴上的一个点。

小结

至此,我们已经求得了旋转轴的单位矢量(u,v,w),旋转轴上任意一点(a,b,c)和旋转角度 θ \theta θ
在机器人学中,控制转动角度 θ \theta θ,利用旋转轴的单位矢量(u,v,w)和旋转轴上任意一点(a,b,c),可直接求解得旋转矩阵,之后利用旋转矩阵,可求解得到数据点旋转后的坐标。
在计算机视觉中,将标定板绕着旋转轴旋转任意角度,利用标定板求得旋转前后的坐标,可使用以上方法可以对旋转轴进行标定。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值