精华内容
下载资源
问答
  • 带有投影角度的三维坐标系坐标如何垂直坐标轴旋转旋转公式是什么
  • 三维坐标系旋转——旋转矩阵到旋转角之间的换算

    万次阅读 多人点赞 2019-04-23 20:38:18
    solvepnp 单目三维位姿估计--------利用二维码求解相机世界坐标 solvepnp 单目三维位姿估计--------理论 在做单目三维位姿估计(即估计目标物相对相机的姿态或相机相对目标物的姿态)时会用到solvepnp函数, ...

    相关文章:

    matlab相机标定获取内参

    旋转矩阵到旋转角之间的换算

    solvepnp 单目三维位姿估计--------利用二维码求解相机世界坐标

    solvepnp 单目三维位姿估计--------理论

     

    在做单目三维位姿估计(即估计目标物相对相机的姿态或相机相对目标物的姿态)时会用到solvepnp函数,

    函数原型为:

    cv2.solvePnP(objectPoints, imagePoints, cameraMatrix, distCoeffs[, rvec[, tvec[, useExtrinsicGuess[, flags]]]]) → retval, rvec, tvec

    参数解释

    • objectPoints:世界坐标系中的3D点坐标,单位mm

    • imagePoints:图像坐标系中点的坐标,单位像素

    • cameraMatrix:相机内参矩阵

    • distCoeffs:畸变系数

    • rvec:旋转矩阵

    • tvec:平移矩阵

    • useExtrinsicGuess:是否输出平移矩阵和旋转矩阵,默认为false

    • flags:SOLVEPNP _ITERATIVE、SOLVEPNP _P3P、SOLVEPNP _EPNP、SOLVEPNP _DLS、SOLVEPNP _UPNP

    内参矩阵和畸变系数都是要通过标定得到的,这个不细讲,opencv官方提供了有标定例子(或者参考我的这篇文章:用matlab标定获取相机内参矩阵和畸变系数)。函数输出的是旋转矩阵rvectvec

     

    本文就来说说得到了这个旋转矩阵rvec后,如何得知目标物实际的角度呢~


    旋转矩阵是一个3×3的正交矩阵,有3个自由度。处理旋转矩阵的问题时,通常采用旋转矩阵的方式来描述,也可以用旋转向量来表示,两者之间可以通过罗德里格斯(Rodrigues)变换来进行转换。

    旋转矩阵和旋转向量间的转换请参考旋转矩阵 和 旋转向量

    其中,旋转向量的长度(模)表示绕轴逆时针旋转的角度(弧度)。

    norm为求向量的模。

    代码如下:

    theta = np.linalg.norm(rvec)
    r = rvec / theta
    R_ = np.array([[0, -r[2][0], r[1][0]],
                   [r[2][0], 0, -r[0][0]],
                   [-r[1][0], r[0][0], 0]])
    R = np.cos(theta) * np.eye(3) + (1 - np.cos(theta)) * r * r.T + np.sin(theta) * R_
    print('旋转矩阵')
    print(R)

    反变换也可以很容易的通过如下公式实现:


    空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。下面介绍旋转矩阵(旋转向量)欧拉角实现三维空间坐标变换的方法以及两者之间的关系。

     

    旋转矩阵

    对于一个三维空间的点 P(x,y,z)P(x,y,z),要将其绕 zz 轴旋转 θθ 角度是可以很简单地用旋转矩阵来表示的

     欧拉角

     

     此处得到结论:自旋转的“先转的放前面”


    定角(Fixed angles)

    围绕固定的坐标系转动。固定坐标系的原点,坐标系再围绕已经固定的轴转动,全程原坐标系不动

    注意!移动位置的顺序可以调换,但是旋转的顺序不能调换,结果不一样。

    以X-Y-Z型为例子:即先围绕X轴进行转动γ°,然后围绕Y轴进行转动β°,最后围绕Z轴进行转动α°。注意逆时针为正方向。

    X-Y-Z型公式:

    重点先转的轴的\large R放后面运算,如下

    代码:

    def isRotationMatrix(R):
        Rt = np.transpose(R)   #旋转矩阵R的转置
        shouldBeIdentity = np.dot(Rt, R)   #R的转置矩阵乘以R
        I = np.identity(3, dtype=R.dtype)           # 3阶单位矩阵
        n = np.linalg.norm(I - shouldBeIdentity)   #np.linalg.norm默认求二范数
        return n < 1e-6                            # 目的是判断矩阵R是否正交矩阵(旋转矩阵按道理须为正交矩阵,如此其返回值理论为0)
    
    
    def rotationMatrixToAngles(R):
        assert (isRotationMatrix(R))   #判断是否是旋转矩阵(用到正交矩阵特性)
    
        sy = math.sqrt(R[0, 0] * R[0, 0] + R[1, 0] * R[1, 0])  #矩阵元素下标都从0开始(对应公式中是sqrt(r11*r11+r21*r21)),sy=sqrt(cosβ*cosβ)
    
        singular = sy < 1e-6   # 判断β是否为正负90°
    
        if not singular:   #β不是正负90°
            x = math.atan2(R[2, 1], R[2, 2])
            y = math.atan2(-R[2, 0], sy)
            z = math.atan2(R[1, 0], R[0, 0])
        else:              #β是正负90°
            x = math.atan2(-R[1, 2], R[1, 1])
            y = math.atan2(-R[2, 0], sy)   #当z=0时,此公式也OK,上面图片中的公式也是OK的
            z = 0
    
        return np.array([x, y, z])

     备注:np.linalg.norm(求范数)

     举例:

    由角度推旋转矩阵

    由旋转矩阵推角度

     


    欧拉角(Euler angles)

    “自旋转”,围绕当下(自己)的坐标系某轴转动,就是每次旋转,都固定被围绕的某一轴,另两轴动。

    每次旋转,整个坐标系都会改变位置。

    以Z-Y-Z型为例的公式:

    重点先转的轴的\large R放前面运算,如下

    举例:

    矩阵转角度:

    注意:自旋转的“先转的放前面”


    欧拉角转旋转矩阵 

    欧拉角通过将刚体绕过原点的轴(i,j,k)旋转θ,分解成三步,如下图(蓝色是起始坐标系,而红色的是旋转之后的坐标系) 
    这里写图片描述 
    如果将每一个角度用旋转矩阵表示如下: 
    这里写图片描述 
    所以,容易得到,欧拉角转旋转矩阵如下: 
    这里写图片描述

    代码:

    /**
    欧拉角计算对应的旋转矩阵
    **/
    Mat eulerAnglesToRotationMatrix(Vec3f &theta)
    {
        // 计算旋转矩阵的X分量
        Mat R_x = (Mat_<double>(3,3) <<
                   1,       0,              0,
                   0,       cos(theta[0]),   -sin(theta[0]),
                   0,       sin(theta[0]),   cos(theta[0])
                   );
     
     
        // 计算旋转矩阵的Y分量
        Mat R_y = (Mat_<double>(3,3) <<
                   cos(theta[1]),    0,      sin(theta[1]),
                   0,               1,      0,
                   -sin(theta[1]),   0,      cos(theta[1])
                   );
     
     
        // 计算旋转矩阵的Z分量
        Mat R_z = (Mat_<double>(3,3) <<
                   cos(theta[2]),    -sin(theta[2]),      0,
                   sin(theta[2]),    cos(theta[2]),       0,
                   0,               0,                  1);
     
     
        // 合并 
        Mat R = R_z * R_y * R_x;
     
     
        return R;
    }

     


     旋转矩阵转欧拉角 

    将旋转矩阵表示如下: 
    这里写图片描述 
    则可以如下表示欧拉角: 
    这里写图片描述

    代码:

    /**
     * 功能: 1. 检查是否是旋转矩阵
    **/
    bool isRotationMatrix(Mat &R)
    {
        Mat Rt;
        transpose(R, Rt);
        Mat shouldBeIdentity = Rt * R;
        Mat I = Mat::eye(3,3, shouldBeIdentity.type());
    
        return  norm(I, shouldBeIdentity) < 1e-6;    
    }
    
    /**
     * 功能: 1. 通过给定的旋转矩阵计算对应的欧拉角
    **/
    Vec3f rotationMatrixToEulerAngles(Mat &R)
    {
        assert(isRotationMatrix(R));
    
        float sy = sqrt(R.at<double>(0,0) * R.at<double>(0,0) +  R.at<double>(1,0) * R.at<double>(1,0) );
    
        bool singular = sy < 1e-6; // If
    
        float x, y, z;
        if (!singular) {
            x = atan2(R.at<double>(2,1) , R.at<double>(2,2));
            y = atan2(-R.at<double>(2,0), sy);
            z = atan2(R.at<double>(1,0), R.at<double>(0,0));
        } else {
            x = atan2(-R.at<double>(1,2), R.at<double>(1,1));
            y = atan2(-R.at<double>(2,0), sy);
            z = 0;
        }
        return Vec3f(x, y, z);   
    }
    

    旋转向量转欧拉角(经过四元数)代码如下:

    # 从旋转向量转换为欧拉角
    def get_euler_angle(rotation_vector):
        # calculate rotation angles
        theta = cv2.norm(rotation_vector, cv2.NORM_L2)
        
        # transformed to quaterniond
        w = math.cos(theta / 2)
        x = math.sin(theta / 2)*rotation_vector[0][0] / theta
        y = math.sin(theta / 2)*rotation_vector[1][0] / theta
        z = math.sin(theta / 2)*rotation_vector[2][0] / theta
        
        ysqr = y * y
        # pitch (x-axis rotation)
        t0 = 2.0 * (w * x + y * z)
        t1 = 1.0 - 2.0 * (x * x + ysqr)
        print('t0:{}, t1:{}'.format(t0, t1))
        pitch = math.atan2(t0, t1)
        
        # yaw (y-axis rotation)
        t2 = 2.0 * (w * y - z * x)
        if t2 > 1.0:
            t2 = 1.0
        if t2 < -1.0:
            t2 = -1.0
        yaw = math.asin(t2)
        
        # roll (z-axis rotation)
        t3 = 2.0 * (w * z + x * y)
        t4 = 1.0 - 2.0 * (ysqr + z * z)
        roll = math.atan2(t3, t4)
        
        print('pitch:{}, yaw:{}, roll:{}'.format(pitch, yaw, roll))
        
    	# 单位转换:将弧度转换为度
        Y = int((pitch/math.pi)*180)
        X = int((yaw/math.pi)*180)
        Z = int((roll/math.pi)*180)
        
        return 0, Y, X, Z

    在3D 空间中,表示物体的旋转可以由三个欧拉角来表示: 
    pitch围绕X轴旋转,叫俯仰角。 
    yaw围绕Y轴旋转,叫偏航角。 
    roll围绕Z轴旋转,叫翻滚角。 
    这三个角的顺序对旋转结果有影响。 
    欧拉角

    (欧拉角与四元数的转换关系: 
    http://www.cnblogs.com/wqj1212/archive/2010/11/21/1883033.html)

    四元数到欧拉角的转换公式如下: 
     四元数到欧拉角的转换公式 
    arctan和arcsin的结果为[-pi/2,pi/2],不能覆盖所有的欧拉角,因此采用atan2代替arctan: 

    用atan2代替arctan

     

     

     

    参考:http://blog.miskcoo.com/2016/12/rotation-in-3d-space

    https://blog.csdn.net/aic1999/article/details/82415357#commentBox

    https://www.cnblogs.com/aoru45/p/9781540.html

    https://blog.csdn.net/u012423865/article/details/78219787#commentsedit

    https://blog.csdn.net/u013512448/article/details/77804161

    展开全文
  • 三维空间坐标系变换-旋转矩阵

    万次阅读 多人点赞 2018-09-03 18:38:08
    空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。  这里以常见的世界...

           空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。

           这里以常见的世界坐标系与相机坐标系间的变换为例。

    一、首先介绍从相机坐标系转换到世界坐标系,也就是比较通用的body到世界坐标系间的转换。

           那么旋转的欧拉角按从世界坐标系转换到相机坐标系的过程,先按z轴旋转、之后y轴旋转、之后x轴旋转,最终得到相机坐标系,得到的角度分别是yaw、pitch、roll,那么从相机坐标系到世界坐标系的旋转矩阵按如下方式定义:

    那么得到的相机(body)坐标系到世界坐标系间的旋转矩阵为:

    cv::Mat IMUReader::angleToRotation(COORDINATES& carrier)
    {
    // R
    cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
    R.at<float>(0, 0) = cos(carrier.yaw)*cos(carrier.pitch);
    R.at<float>(0, 1) = cos(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch) - cos(carrier.roll)*sin(carrier.yaw);
    R.at<float>(0, 2) = sin(carrier.yaw)*sin(carrier.roll) + cos(carrier.yaw)*cos(carrier.roll)*sin(carrier.pitch);
    R.at<float>(1, 0) = cos(carrier.pitch)*sin(carrier.yaw);
    R.at<float>(1, 1) = cos(carrier.yaw)*cos(carrier.roll) + sin(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch);
    R.at<float>(1, 2) = cos(carrier.roll)*sin(carrier.yaw)*sin(carrier.pitch) - cos(carrier.yaw)*sin(carrier.roll);
    R.at<float>(2, 0) = - sin(carrier.pitch);
    R.at<float>(2, 1) = cos(carrier.pitch)*sin(carrier.roll);
    R.at<float>(2, 2) = cos(carrier.roll)*cos(carrier.pitch);

    return R;
    }

    对于平移矩阵为相机坐标系原点在世界坐标系下的坐标T,最终得到的坐标变换方程如下:

    其理解过程为从世界坐标系经过z,y,x的旋转以及平移T后得到相机坐标系,那么从相机坐标转换的世界坐标实际上是反变换过程,最后一步是x旋转,那么通过定义Rx为反旋转将相机坐标反旋转过来,之后依次是y,z,旋转后得到的值为与世界坐标系同方向,但是有一个平移的T的坐标系下的坐标,之后再加一个T坐标就得到了在世界坐标系下的坐标。

     

    二、下面介绍从世界坐标系旋转到相机坐标系,这是一个正向旋转的过程,首先绕z,y,x旋转并平移T得到相机坐标系,那么从世界坐标系到与相机坐标系同向的坐标系是只经过旋转,那么旋转矩阵为:

    RxRyRz,而此时三个维度的旋转分别是:

    对于平移矩阵是,此时坐标已经是与相机坐标系同向,但是与世界坐标系原点重合的坐标下的坐标,转换相机坐标系还需要加上的平移是世界坐标系原点在相机坐标系下的坐标T。

    其理解过程就是一个在世界坐标系依照顺序进行z,y,x的旋转,之后再平移的过程。

    其中对于z,y,x方向的旋转都是按照右手系定则,大拇指指向轴线方向,四指方向为旋转的正方向。

     

    下面为之前整理,可能有错误,仅借鉴。

    界坐标系下的坐标(Xw,Yw,Zw)转换到相机坐标系下(Xc,Yc,Zc)。

         那么这里涉及到旋转矩阵和平移矩阵。对于旋转我们有欧拉角描述,根据欧拉角计算出旋转矩阵。对于欧拉角指的是坐标系绕某个轴旋转的角度,那么从一个坐标系旋转到另一个坐标系需要三次旋转能够完成。对于绕坐标轴旋转分为两种,一种是绕原坐标系的固定轴旋转,一种是绕部分旋转后的坐标轴旋转,这里介绍比较常用的绕部分旋转后的坐标轴旋转。同时,对于绕坐标轴旋转其旋转的顺序也是有关系,如绕XYZ旋转和绕ZYX旋转。那么一种比较常用的表示方式是航空航天的偏航-俯仰-滚转表示法,其中坐标可以沿机头朝向为x轴,飞机左侧为y轴,飞机正上方为z轴。那么偏航为绕z轴旋转,之后俯仰是绕y轴旋转,滚转是绕x轴旋转,即该欧拉角的旋转顺序为ZYX.

           上面介绍了旋转方式-欧拉角,下面介绍旋转矩阵的生成。这里分开不同轴讨论,先绕X轴旋转。我们定义旋转变换公式为:

    其中,M为旋转矩阵,公式定义的是从世界坐标系向相机坐标系的转换,那么我们就按世界坐标向相机坐标旋转,如下:

    这里我们定义了从左侧的世界坐标转到右侧的相机坐标,其旋转为绕X轴正向旋转90度,这里的正向旋转是以沿X轴方向看,顺时针旋转为正向,否则为负向。那么从世界坐标系向相机坐标系的旋转矩阵即为:

    此时从世界坐标向相机坐标的转换过程如下:

    所以,这里需要注意的是几点:(1)坐标是从世界坐标系向相机坐标系旋转,所有对于旋转方程是旋转矩阵乘以世界坐标得到相机坐标;(2)旋转是从世界坐标向相机坐标的旋转,即从源坐标系向目标坐标系旋转,这里是从世界坐标系向相机坐标系旋转;(3)旋转角度是沿着坐标轴的正向看,顺时针为正,逆时针为负;(4)旋转矩阵的形式如上,绕坐标轴旋转的轴坐标是不会变化的,所以是对应位置是1,接下来是0 cos(theta)  sin(theta), 在接下来是0   -sin(theta)  cos(theta)。

    以上四个点的方向是与最终的变换公式相关的,有一个地方发生变化,那么最终的旋转变换公式也会发生变化,为了统一,那么这里按这样的规定,从而确定旋转变换公式的固定。

            上面介绍了绕X轴旋转的情况,其它绕Y轴和Z轴的旋转矩阵相同,分别是:

    绕Y轴旋转矩阵:

    绕Z轴旋转矩阵:

    那么假如从世界坐标系向相机坐标系的旋转过程中,显示绕Z轴旋转了theta,之后绕旋转后坐标系的Y轴旋转了beta,之后绕旋转后坐标系X轴旋转了alpha,那么最终的旋转矩阵如下:

    以上是对旋转矩阵的描述,那么对三维坐标系的转换,除了包含旋转,还要包含平移。即坐标系先从源旋转到与目标坐标系相同的方向,之后再平移。对于平移这里也规定从源坐标向目标坐标系。

    这里目标坐标系在源坐标系下的坐标是(1,3,2),那么从源坐标系转到目标坐标系的变换即为:

    于是这里规定几点:(1)变换是从源坐标系到目标坐标系,这里是从世界坐标系到相机坐标系;(2)平移变换是目标坐标系原点在源坐标系旋转到与目标坐标系相同方向后的坐标系下的坐标,这里即变换矩阵是目标坐标系原点在世界坐标系变换为与目标坐标系相同方向后在变换后世界坐标系中的坐标位置;(3)此时的变换矩阵需要加上负号。

    如果不加负号,也可以将变换矩阵定义为源坐标系原点在目标坐标系下的位置,这里不用变换源坐标系。经过以上步骤可以将源坐标系中的坐标点转换到目标坐标系下。

     

    对于旋转矩阵的旋转向量以及欧拉角的关系与变换:

    对于旋转矩阵与旋转向量:

    上面介绍了通过旋转矩阵和平移矩阵描述两个坐标系间的变换,其实也相当于表示了6自由度的三维刚体运行。但是旋转矩阵有几个缺点:SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。因此,这种表达式冗余。而且对于旋转矩阵自身也有约束,它必须是正交矩阵,且行列式为1,这些约束会使求解变得困难。一种更紧凑的方式是使用旋转xian向量描述。即对于坐标系的旋转,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴yizh一致,而长度等于旋转角。这种向量称为旋转向量(或轴角,Axis-Angle)。这种表示法只需一个三维向量即可描述旋转。对于xuan旋转向量和旋转矩阵间的转换可以通过罗德里格斯公司(Rodrigues Formula)来计算。

    对于旋转矩阵与欧拉角:

    展开全文
  • 三维坐标系旋转矩阵

    万次阅读 多人点赞 2014-03-24 22:06:27
    为了方便自己记忆,记录一下三维坐标旋转矩阵的推导过程。  坐标的旋转变换在很多地方都会用到,比如机器视觉中的摄像机标定、图像处理中的图像旋转、游戏编程等。  任何维的旋转可以表述为向量与合适尺寸的方阵...

        为了方便自己记忆,记录一下三维坐标旋转矩阵的推导过程。


        坐标的旋转变换在很多地方都会用到,比如机器视觉中的摄像机标定、图像处理中的图像旋转、游戏编程等。

        任何维的旋转可以表述为向量与合适尺寸的方阵的乘积。最终一个旋转等价于在另一个不同坐标系下对点位置的重新表述。坐标系旋转角度θ则等同于将目标点围绕坐标原点反方向旋转同样的角θ。

        若以坐标系的三个坐标轴X、Y、Z分别作为旋转轴,则点实际上只在垂直坐标轴的平面上作二维旋转。

        假设三维坐标系中的某一向量,其在直角坐标系中的图如图1所示。其中点P在XY平面、XZ平面、YZ平面的投影分别为点M、点P、点N。
     
                                                  
                                                                      图1 直角坐标系XYZ

        一、绕Z轴旋转θ
        绕Z轴旋转,相当于在XY平面的投影OM绕原点旋转,如下图所示,OM旋转θ角到OM'。
                                                     
                                                                
                                                                        图2 向量绕Z轴旋转示意图

       设旋转前的坐标为,旋转后的坐标为,则点M的坐标为,点M'的坐标为。由此可得:

                                                                          
                                                      
                                                            
                                                      
                                                   
        对于进行三角展开可得:
                                                  

                                                  
        且有;可得绕Z轴旋转角的旋转矩阵为:
                             
                                                                       

        二、绕X轴旋旋转θ
        绕X轴旋转,相当于在YZ平面的投影ON绕原点旋转,如下图所示,ON旋转θ角到ON'。
                                                     
                                                                
                                                                        图3 向量绕X轴旋转示意图

        设旋转前的坐标为,旋转后的坐标为,则点N的坐标为,点N'的坐标为。由此可得:

                                                                          
                                                      
                                                            
                                                      
                                                   
        对于进行三角展开可得:
                                                  

                                                  
        且有;可得绕X轴旋转角的旋转矩阵为:
                             
                                                                       

        三、 绕Y轴旋旋转θ
        绕Y轴旋转,相当于 在XZ平面的投影OQ绕原点旋转,如下图所示,OQ旋转 θ角到OQ'。
                                                     
                                                                
                                                                        图4 向量绕Y轴旋转示意图

        设旋转前的坐标为,旋转后的坐标为,则点Q的坐标为,点Q'的坐标为。由此可得:

                                                                          
                                                      
                                                            
                                                      
                                                   
        对于进行三角展开可得:
                                                  

                                                  
        且有;可得绕Y轴旋转角的旋转矩阵为:
                             
                                                                       



        四、绕X、Y、Z轴旋转的旋转矩阵分别为:
     
                                   
                     

        五、总结
        
        啰啰嗦嗦终于打完所有的公式了,其实三个轴会推导其中一个轴的旋转矩阵的话,另外两个轴也类似地可以很容易推导出来。这里给出所有的推导过程只是为了我自己记忆的方便。当然也可以不旋转向量,而使用旋转坐标系的方法推导,两种方法是等价的。

        公式的输入我使用了这篇博客http://blog.csdn.net/linraise/article/details/11712937给出的方法。还有一个小技巧,就是可以双击公式,在最上面的工具栏“图片”选项里直接修改公式的内容。

    参考:
    1、《学习OpenCV》
        




        



    展开全文
  • 三维空间坐标系变换——旋转矩阵

    万次阅读 2018-11-14 18:38:29
    空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。  这里以常见的世界...

    空间中三维坐标变换一般由三种方式实现,第一种是旋转矩阵和旋转向量;第二种是欧拉角;第三种是四元数。这里先介绍旋转矩阵(旋转向量)与欧拉角实现三维空间坐标变换的方法以及两者之间的关系。

           这里以常见的世界坐标系与相机坐标系间的变换为例。

    一、首先介绍从相机坐标系转换到世界坐标系,也就是比较通用的body到世界坐标系间的转换。

           那么旋转的欧拉角按从世界坐标系转换到相机坐标系的过程,先按z轴旋转、之后y轴旋转、之后x轴旋转,最终得到相机坐标系,得到的角度分别是yaw、pitch、roll,那么从相机坐标系到世界坐标系的旋转矩阵按如下方式定义:

    那么得到的相机(body)坐标系到世界坐标系间的旋转矩阵为:

    cv::Mat IMUReader::angleToRotation(COORDINATES& carrier)
    {
    // R
    cv::Mat R = cv::Mat::eye(3, 3, CV_32F);
    R.at<float>(0, 0) = cos(carrier.yaw)*cos(carrier.pitch);
    R.at<float>(0, 1) = cos(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch) - cos(carrier.roll)*sin(carrier.yaw);
    R.at<float>(0, 2) = sin(carrier.yaw)*sin(carrier.roll) + cos(carrier.yaw)*cos(carrier.roll)*sin(carrier.pitch);
    R.at<float>(1, 0) = cos(carrier.pitch)*sin(carrier.yaw);
    R.at<float>(1, 1) = cos(carrier.yaw)*cos(carrier.roll) + sin(carrier.yaw)*sin(carrier.roll)*sin(carrier.pitch);
    R.at<float>(1, 2) = cos(carrier.roll)*sin(carrier.yaw)*sin(carrier.pitch) - cos(carrier.yaw)*sin(carrier.roll);
    R.at<float>(2, 0) = - sin(carrier.pitch);
    R.at<float>(2, 1) = cos(carrier.pitch)*sin(carrier.roll);
    R.at<float>(2, 2) = cos(carrier.roll)*cos(carrier.pitch);
    
    return R;
    }

    对于平移矩阵为相机坐标系原点在世界坐标系下的坐标T,最终得到的坐标变换方程如下:

    其理解过程为从世界坐标系经过z,y,x的旋转以及平移T后得到相机坐标系,那么从相机坐标转换的世界坐标实际上是反变换过程,最后一步是x旋转,那么通过定义Rx为反旋转将相机坐标反旋转过来,之后依次是y,z,旋转后得到的值为与世界坐标系同方向,但是有一个平移的T的坐标系下的坐标,之后再加一个T坐标就得到了在世界坐标系下的坐标。

     

    二、下面介绍从世界坐标系旋转到相机坐标系,这是一个正向旋转的过程,首先绕z,y,x旋转并平移T得到相机坐标系,那么从世界坐标系到与相机坐标系同向的坐标系是只经过旋转,那么旋转矩阵为:

    RxRyRz,而此时三个维度的旋转分别是:

     

     

    对于平移矩阵是,此时坐标已经是与相机坐标系同向,但是与世界坐标系原点重合的坐标下的坐标,转换相机坐标系还需要加上的平移是世界坐标系原点在相机坐标系下的坐标T。

    其理解过程就是一个在世界坐标系依照顺序进行z,y,x的旋转,之后再平移的过程。

    其中对于z,y,x方向的旋转都是按照右手系定则,大拇指指向轴线方向,四指方向为旋转的正方向。

     

    下面为之前整理,可能有错误,仅借鉴。

    界坐标系下的坐标(Xw,Yw,Zw)转换到相机坐标系下(Xc,Yc,Zc)。

         那么这里涉及到旋转矩阵和平移矩阵。对于旋转我们有欧拉角描述,根据欧拉角计算出旋转矩阵。对于欧拉角指的是坐标系绕某个轴旋转的角度,那么从一个坐标系旋转到另一个坐标系需要三次旋转能够完成。对于绕坐标轴旋转分为两种,一种是绕原坐标系的固定轴旋转,一种是绕部分旋转后的坐标轴旋转,这里介绍比较常用的绕部分旋转后的坐标轴旋转。同时,对于绕坐标轴旋转其旋转的顺序也是有关系,如绕XYZ旋转和绕ZYX旋转。那么一种比较常用的表示方式是航空航天的偏航-俯仰-滚转表示法,其中坐标可以沿机头朝向为x轴,飞机左侧为y轴,飞机正上方为z轴。那么偏航为绕z轴旋转,之后俯仰是绕y轴旋转,滚转是绕x轴旋转,即该欧拉角的旋转顺序为ZYX.

           上面介绍了旋转方式-欧拉角,下面介绍旋转矩阵的生成。这里分开不同轴讨论,先绕X轴旋转。我们定义旋转变换公式为:

    其中,M为旋转矩阵,公式定义的是从世界坐标系向相机坐标系的转换,那么我们就按世界坐标向相机坐标旋转,如下:

    这里我们定义了从左侧的世界坐标转到右侧的相机坐标,其旋转为绕X轴正向旋转90度,这里的正向旋转是以沿X轴方向看,顺时针旋转为正向,否则为负向。那么从世界坐标系向相机坐标系的旋转矩阵即为:

    此时从世界坐标向相机坐标的转换过程如下:

    所以,这里需要注意的是几点:(1)坐标是从世界坐标系向相机坐标系旋转,所有对于旋转方程是旋转矩阵乘以世界坐标得到相机坐标;(2)旋转是从世界坐标向相机坐标的旋转,即从源坐标系向目标坐标系旋转,这里是从世界坐标系向相机坐标系旋转;(3)旋转角度是沿着坐标轴的正向看,顺时针为正,逆时针为负;(4)旋转矩阵的形式如上,绕坐标轴旋转的轴坐标是不会变化的,所以是对应位置是1,接下来是0 cos(theta)  sin(theta), 在接下来是0   -sin(theta)  cos(theta)。

    以上四个点的方向是与最终的变换公式相关的,有一个地方发生变化,那么最终的旋转变换公式也会发生变化,为了统一,那么这里按这样的规定,从而确定旋转变换公式的固定。

            上面介绍了绕X轴旋转的情况,其它绕Y轴和Z轴的旋转矩阵相同,分别是:

    绕Y轴旋转矩阵:

    绕Z轴旋转矩阵:

    那么假如从世界坐标系向相机坐标系的旋转过程中,显示绕Z轴旋转了theta,之后绕旋转后坐标系的Y轴旋转了beta,之后绕旋转后坐标系X轴旋转了alpha,那么最终的旋转矩阵如下:

    以上是对旋转矩阵的描述,那么对三维坐标系的转换,除了包含旋转,还要包含平移。即坐标系先从源旋转到与目标坐标系相同的方向,之后再平移。对于平移这里也规定从源坐标向目标坐标系。

    这里目标坐标系在源坐标系下的坐标是(1,3,2),那么从源坐标系转到目标坐标系的变换即为:

     

    于是这里规定几点:(1)变换是从源坐标系到目标坐标系,这里是从世界坐标系到相机坐标系;(2)平移变换是目标坐标系原点在源坐标系旋转到与目标坐标系相同方向后的坐标系下的坐标,这里即变换矩阵是目标坐标系原点在世界坐标系变换为与目标坐标系相同方向后在变换后世界坐标系中的坐标位置;(3)此时的变换矩阵需要加上负号。

    如果不加负号,也可以将变换矩阵定义为源坐标系原点在目标坐标系下的位置,这里不用变换源坐标系。经过以上步骤可以将源坐标系中的坐标点转换到目标坐标系下。

     

    对于旋转矩阵的旋转向量以及欧拉角的关系与变换:

    对于旋转矩阵与旋转向量:

    上面介绍了通过旋转矩阵和平移矩阵描述两个坐标系间的变换,其实也相当于表示了6自由度的三维刚体运行。但是旋转矩阵有几个缺点:SO(3)的旋转矩阵有9个量,但一次旋转只有3个自由度。因此,这种表达式冗余。而且对于旋转矩阵自身也有约束,它必须是正交矩阵,且行列式为1,这些约束会使求解变得困难。一种更紧凑的方式是使用旋转xian向量描述。即对于坐标系的旋转,任意旋转都可以用一个旋转轴和一个旋转角来刻画。于是,我们可以使用一个向量,其方向与旋转轴yizh一致,而长度等于旋转角。这种向量称为旋转向量(或轴角,Axis-Angle)。这种表示法只需一个三维向量即可描述旋转。对于xuan旋转向量和旋转矩阵间的转换可以通过罗德里格斯公司(Rodrigues Formula)来计算。

    对于旋转矩阵与欧拉角:

    展开全文
  • 三维坐标绕轴坐标旋转公式

    千次阅读 2013-11-14 11:29:00
    原文来自: ... 三维空间中的旋转变换比二维空间中的旋转变换... 若以坐标系的三个坐标轴x,y,z分别作为旋转轴,则点实际上仅仅在垂直坐标轴的平面上作二维旋转。此时用二维旋转公式就能够直接推出三维旋转变换矩...
  • 三维坐标系z轴旋转θ的矩阵Rz(θ) {cosθ−sinθ00sinθcosθ0000100001} \left\{ \begin{matrix} cosθ& -sinθ & 0& 0\\ sinθ & cosθ & 0& 0\\ 0 & 0 & 1 &0\\ ...
  • 引言 做iOS开发,不免要接触到一些特效,其中不乏3D特效,这时候就要对iOS所使用的坐标系了解才行。若不限于iOS开发,还有MacOS开发,若不知道它们所使用坐标系的不同,...做3D特效,就要用到三维坐标系,这是后...
  • 平面坐标系绕原点顺时针变化

    千次阅读 2017-05-15 22:26:12
    搞了半天,发现这还是个公式,(x,y)为某点先前坐标,变化θ度后某点新坐标(x’,y’),先上公式再搞科学。x′=x∗cos(θ)−y∗sin(θ);x'=x*cos(θ)-y*sin(θ); y′=y∗cose(θ)+x∗sin(θ);y'=y*cose(θ)+x*sin(θ)...
  • 关于三维空间坐标轴的旋转变换的左右手坐标系区分详解 左右手区别: 右手坐标系进行变换时将T与需要变换的点或向量A(列向量)相乘,即TA。 左手坐标系进行变换时将T与需要变换的点或向量A(行向量)相乘,即AT。...
  • 三维坐标旋转矩阵

    万次阅读 多人点赞 2016-03-05 20:48:11
    1.三维坐标旋转矩阵的推导过程任何维的旋转可以表述为向量与合适尺寸的方阵的乘积。最终一个旋转等价于在另一个不同...假设三维坐标系(右手坐标系,拇指即指向X轴的正方向。伸出食指和中指,如右图所示,食指指向Y轴的正
  • 这是最基本的坐标点坐标原点旋转问题,通过这样的思想我们还可以求解坐标系旋转后坐标的新位置以及三维坐标系旋转的求解等。 我们开始推导计算,首先需要知道以下常用三角公式: sin(α+β)=sinαcosβ+cosα...
  • 那么任意轴旋转就可以先将此轴移到通过原点,然后再旋转,再将旋转完的新坐标做反向平移。 则问题化为 计算通过原点的向量旋转任意角度后的新点。假设单位向量为(rx,ry,rz),那么旋转矩阵如下:
  •   现有三维模型Model(vtx),坐标系中任意朝向。需要将该模型进行旋转,使得该模型能够基本摆正。 理论介绍   相关旋转的数学理论,可以参考下面链接:[https://www.cnblogs.com/zhoug2020/p/7842808.html]...
  • 右手坐标系 ,比如说Z轴旋转,大拇指指向Z轴,其余手指弯曲的方向就是Z轴旋转正方向。这个正方向,其实是逆时针方向,所以一般规定逆时针为正就是这么来的。怎么判断是逆时针?眼睛顺着Z轴往原点的方向看,看到XOY...
  • 三维坐标系

    千次阅读 2008-12-03 15:48:00
    三维坐标系19.1.1三维笛卡儿坐标系三维笛卡儿坐标系是在二维笛卡儿坐标系的基础上根据右手定则增加第三维坐标(即Z轴)而形成的。同二维坐标系一样,AutoCAD中的三维坐标系有世界坐标系(WCS)和用户坐标系(UCS)两...
  • 三维坐标系变换

    千次阅读 2017-06-22 11:00:45
    即模型的建模坐标系,如在3dmax中,模型建模时,模型中心可以位于坐标原点(0,0,0),也可以偏移一定位置,此处的原点就是模型坐标系原点。 World Space 世界坐标系 即模型在3d场景中所处的位置,整个场景属于同一...
  • 三维空间的旋转变换

    万次阅读 2019-03-09 10:02:42
    最近在看文献的时候看到作者有用到三维轴变换。我看了好久都没摸清他的矩阵是怎么得到的。待我提笔一画,妈呀,果然这脑子是废了,这么easy的问题都他么的解...如下,这是一个三维坐标(没错就是右手坐标系),然后...
  • 概要:三维坐标系的变换,实质上则是原点以及正交基向量的变化,在空间中表现为平移和旋转。 如图所示的坐标系变换,可以用一个变换矩阵来表示。 虽然原理也比较简单,但是大一学的线性代数已经有点忘记了。=////...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,534
精华内容 4,613
关键字:

三维坐标系绕原点旋转