机器人位姿数据形式转换与旋转矩阵总结(欧拉角、RPY、NOAP)

一、机器人位姿数据的基本概念

        以下概念仅指机器人轨迹规划领域内的位姿坐标,与广义概念无关。

        1.欧拉角(KUKA)

        欧拉角用来唯一地确定定点转动刚体位置的三个一组独立角参量,由章动角θ、进动角ψ和自转角φ组成。

        机器人位姿数据中,数据格式为{ X , Y , Z , A , B , C }

        其中,X、Y、Z 代表三个坐标轴上的位置;A、B、C 代表机器人姿态,即新坐标分别绕原坐标系中 Z,Y,X 三个坐标轴旋转的角度。

        2.RPY(新松)

        RPY角是一种表示机体姿态的旋转角度,它由三个分量组成:Roll(横滚)、Pitch(俯仰)和Yaw(偏航)。

        机器人位姿数据中,数据格式为{ X , Y , Z , Rx , Ry , Rz }

        其中,X、Y、Z 代表三个坐标轴上的位置;Rx、Ry、Rz 代表机器人姿态,即新坐标分别绕原坐标系中 X,Y,Z 三个坐标轴旋转的角度。

        3.四元数(ABB)

        暂略。

        4.旋转矩阵与NOAP

        旋转矩阵:旋转矩阵是在乘以一个向量的时候改变向量方向但不改变向量大小,并保持手性的矩阵。顺便一提,机器人中的XYZ坐标系均符合右手定则且正交。

        机器人位姿数据中,通用的旋转矩阵为4x4正交矩阵。

        NOAP坐标:N、O、A均为用原本XYZ坐标系中的坐标来进行描述的单位向量,三者正交并组成了新的右手坐标系,以此描述此时机器人位姿坐标系与原XYZ坐标系间的变化关系。

        对于欧拉角,用NOAP描述的旋转矩阵,形如下:

\begin{bmatrix} N_{C}& O_{C}& A_{C}& P_{X}\\ N_{B}& O_{B}& A_{B}& P_{Y}\\ N_{A}& O_{A}& A_{A}& P_{Z}\\ 0& 0& 0& 1\\ \end{bmatrix} 

        对于RPY角,用NOAP描述的旋转矩阵,形如下:

\begin{bmatrix} N_{X}& O_{X}& A_{X}& P_{X}\\ N_{Y}& O_{Y}& A_{Y}& P_{Y}\\ N_{Z}& O_{Z}& A_{Z}& P_{Z}\\ 0& 0& 0& 1\\ \end{bmatrix} 

二、各类位姿数据转换公式

        1.欧拉角与RPY角转换

        由定义易知,{ X , Y , Z , A , B , C } 与 { X , Y , Z , Rx , Ry , Rz } 间互相转换,仅需将A、C或Rx、Rz对调即可。

        2.RPY角数据转NOAP坐标公式

\begin{bmatrix} N_{X}& O_{X}& A_{X}& P_{X}\\ N_{Y}& O_{Y}& A_{Y}& P_{Y}\\ N_{Z}& O_{Z}& A_{Z}& P_{Z}\\ 0& 0& 0& 1\\ \end{bmatrix} = \begin{bmatrix} cosZ cosY&cosZ sinY sinX - sinZ cosX & cosZsinYcosX + sinZsinX& P_{X}\\ sinZcosY& sinZsinYsinX + cosZcosX& sinZsinYcosX - cosZsinX& P_{Y}\\ -sinY& cosYsinX& cosYcosX& P_{Z}\\ 0& 0& 0& 1\\ \end{bmatrix}

        欧拉角数据转NOAP坐标公式仅需将上一公式中的X与Z对调。

        3.NOAP坐标转RPY角数据公式

        Y= arctan\left ( \frac{-N_{Z}}{\sqrt{N_{X}^{2}+N_{Y}^{2}}}\right )

X= arctan\left ( \frac{O_{Z}}{N_{Z}} \right )

Z= arctan\left ( \frac{N_{Y}}{N_{Z}} \right )

        NOAP坐标转欧拉角数据公式仅需将上一公式中的X与Z对调。

三、代码实现

        1.RPY角数据转NOAP坐标

        注:此函数已将输出转置。

vector <double> RpyTrans::Rpy_to_NOAP(double rx_, double ry_, double rz_)
{
	const double Pi = acos(-1);
	double rx = rx_ / 180.0 * Pi, ry = ry_ / 180.0 * Pi, rz = rz_ / 180.0 * Pi;
	vector <double> res;
	res.clear();
	res.resize(9);
	double Nx = cos(rz) * cos(ry);
	double Ny = sin(rz) * cos(ry);
	double Nz = -sin(ry);

	double Ox = (cos(rz) * sin(ry) * sin(rx)) - (sin(rz) * cos(rx));
	double Oy = (sin(rz) * sin(ry) * sin(rx)) + (cos(rz) * cos(rx));
	double Oz = cos(ry) * sin(rx);

	double Ax = (cos(rz) * sin(ry) * cos(rx)) + (sin(rz) * sin(rx));
	double Ay = (sin(rz) * sin(ry) * cos(rx)) - (cos(rz) * sin(rx));
	double Az = cos(ry) * cos(rx);

	res[0] = Nx; res[1] = Ny; res[2] = Nz;
	res[3] = Ox; res[4] = Oy; res[5] = Oz;
	res[6] = Ax; res[7] = Ay; res[8] = Az;

	return res;
}

        2.NOAP坐标转RPY角数据

        注:此函数已将输入转置。

vector <double> RpyTrans::NOAP_to_Rpy(vector <double> Rpy)
{
	double rx, ry, rz;
	Rpy.resize(9);
	const double Pi = acos(-1);

	ry = atan2(-Rpy[2], sqrt(pow(Rpy[0], 2) + pow(Rpy[1], 2)));
	rx = atan2(Rpy[5] / cos(ry), Rpy[8] / cos(ry));
	rz = atan2(Rpy[1] / cos(ry), Rpy[0] / cos(ry));
	
	double rx_, ry_, rz_;
	rx != 0 ? rx_ = rx / Pi * 180.0 : rx_ = 0;
	ry != 0 ? ry_ = ry / Pi * 180.0 : ry_ = 0;
	rz != 0 ? rz_ = rz / Pi * 180.0 : rz_ = 0;

	abs(rx_) < 0.00000001 ? rx_ = 0.0 : rx_ = rx_;
	abs(ry_) < 0.00000001 ? ry_ = 0.0 : ry_ = ry_;
	abs(rz_) < 0.00000001 ? rz_ = 0.0 : rz_ = rz_;

	vector <double> res;
	res.push_back(rx_);
	res.push_back(ry_);
	res.push_back(rz_);
	return res;
}

 四、坐标转换

        1.一般情况,对于形如下的旋转矩阵Rot,对原坐标点P_{A}进行左乘,得到旋转后的坐标P_{B}

Rot=\begin{bmatrix} N_{X}& O_{X}& A_{X}& P_{X}\\ N_{Y}& O_{Y}& A_{Y}& P_{Y}\\ N_{Z}& O_{Z}& A_{Z}& P_{Z}\\ 0& 0& 0& 1\\ \end{bmatrix}

P_{B}=Rot\times P_{A}

        2.若对于已经转置的旋转矩阵Rot^{T},则对原坐标点的转置P_{A}^{T}进行右乘,得到旋转后的坐标转置P_{B}^{T}

Rot^{T}=\begin{bmatrix} N_{X}& N_{Y}& N_{Z}& 0\\ O_{X}& O_{Y}& O_{Z}& 0\\ A_{X}& A_{Y}& A_{Z}& 0\\ P_{X}& P_{Y}& P_{Z}& 1\\ \end{bmatrix}

P_{B}^{T}= P_{A}^{T} \times Rot^{T}

  • 20
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 在Matlab中,我们可以使用旋转矩阵来计算物体的欧拉角欧拉角是描述三维物体在空间中旋转的方式之一。 首先,需要确定旋转矩阵的值。假设旋转矩阵为R,它是一个3x3的矩阵。然后,我们可以使用Matlab中的相关函数来计算欧拉角。 Matlab提供了一个函数叫做“eul2rotm”,它可以将欧拉角转化为旋转矩阵。具体应用方法如下: 1. 定义欧拉角的值。例如,假设欧拉角的三个分量分别为alpha、beta和gamma。 2. 使用“eul2rotm”函数来将欧拉角转化为旋转矩阵。例如,可以使用下面的代码来实现: R = eul2rotm([alpha, beta, gamma]); 3. 得到旋转矩阵R后,我们可以使用“rotm2eul”函数来将旋转矩阵转化为欧拉角。例如,可以使用下面的代码来实现: [alpha, beta, gamma] = rotm2eul(R); 这样,就可以从旋转矩阵中求得欧拉角了。 需要注意的是,欧拉角的定义方式有很多种,而且旋转矩阵欧拉角之间的转换不唯一。因此,在使用Matlab进行计算时,需要根据具体的问题和定义方式选择对应的函数来进行计算,以得到正确的结果。 ### 回答2: 在MATLAB中,可以使用旋转矩阵来求取物体的欧拉角。利用MATLAB提供的旋转矩阵函数,可以将旋转矩阵转换欧拉角。 首先,需要利用欧拉角的顺序和角度定义一个旋转矩阵。例如,对于欧拉角的顺序为Z-Y-X的情况,可以使用eul2rotm函数来生成一个旋转矩阵。该函数的输入参数为欧拉角的顺序和角度,输出为对应的旋转矩阵。 接下来,可以使用rotm2eul函数将旋转矩阵转换欧拉角。该函数的输入参数为旋转矩阵,输出为对应的欧拉角。 以下是一个示例代码: % 定义旋转矩阵 R = [0.8660, 0.5000, 0.0000; -0.5000, 0.8660, 0.0000; 0.0000, 0.0000, 1.0000]; % 将旋转矩阵转换欧拉角 eul = rotm2eul(R, 'ZYZ'); % 打印欧拉角 disp(eul); 运行以上代码,即可通过旋转矩阵计算得到对应的欧拉角。在本例中,输出的欧拉角为[1.0472, 0.0000, 0.0000],表示绕Z轴旋转1.0472弧度,然后绕Y轴旋转0弧度,最后绕X轴旋转0弧度。 需要注意的是,MATLAB提供了不同的旋转矩阵欧拉角表示方法,具体使用哪种方法取决于问题的需求。可以通过查阅MATLAB文档了解更多的旋转矩阵欧拉角的定义和使用方法。 ### 回答3: 在Matlab中,可以通过旋转矩阵求解欧拉角旋转矩阵可以表示三维空间中的旋转操作。欧拉角是一种表示三维空间中物体旋转的方法,通常包括绕x轴的旋转角度、绕y轴的旋转角度和绕z轴的旋转角度。 在Matlab中,可使用以下函数将旋转矩阵转换欧拉角: ``` eulerAngles = rotm2eul(rotationMatrix) ``` 其中,`rotationMatrix`是输入的旋转矩阵,`eulerAngles`是输出的欧拉角。 需要注意的是,Matlab中使用的是ZYZ欧拉角(或称为ZXZ欧拉角)的约定。这意味着首先绕z轴旋转一个角度,然后绕旋转后的y轴旋转一个角度,最后绕旋转后的z轴旋转一个角度。 返回的欧拉角是一个包含三个元素的向量,分别表示绕x轴、y轴和z轴的旋转角度。单位是弧度。 如果需要将欧拉角转换旋转矩阵,可以使用以下函数: ``` rotationMatrix = eul2rotm(eulerAngles) ``` 同样,`eulerAngles`是输入的欧拉角,`rotationMatrix`是输出的旋转矩阵。 以上是在Matlab中根据旋转矩阵求解欧拉角的方法。希望能对你有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值