机器人学与OROCOS-KDL(三)姿态描述与旋转矩阵

一、姿态的数学表示

为表示空间中的一点,不仅需要点的位置,而且需要点的姿态。为规定空间刚体的姿态,用一直角坐标系 { B } \{B\} {B}与此刚体固接。设 { B } \{B\} {B}中单位主矢量为 x B , y B , z B x_B,y_B,z_B xB,yB,zB相对于参考坐标系 { A } \{A\} {A}的方向余弦组成 3 × 3 3\times3 3×3矩阵 B A R _B^AR BAR来表示刚体B相对于坐标系 { A } \{A\} {A}的方位。 B A R _B^AR BAR称为旋转矩阵
B A R = [ A x B A y B A z B ] = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] _B^AR= \begin{bmatrix} ^Ax_B & ^Ay_B & ^Az_B\end{bmatrix}= \begin{bmatrix} r_{11} & r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33}\\ \end{bmatrix} BAR=[AxBAyBAzB]=r11r21r31r12r22r32r13r23r33

二、OROCOS-KDL应用

1.主要成员变量

Rotation类的主要成员变量为一个double型的数组,数组储存旋转矩阵的九个数值。

/*源码 orocos_kdl/src/frames.hpp*/
public:
    double data[9];

2.创建旋转矩阵

/*实例 orocos_kdl/examples/geometry.cpp*/
//默认构造函数
KDL::Rotation r1;
//从三个单位向量(Vx, Vy, Vz)中创建一个旋转矩阵
KDL::Rotation r2(KDL::Vector(0,0,1),
                 KDL::Vector(0,-1,0),
                 KDL::Vector(-1,0,0));
//从九个值中创建一个旋转矩阵
KDL::Rotation r3(0,0,-1,1,0,0,0,-1,0);
//创建一个单位旋转矩阵
KDL::Rotation r4=KDL::Rotation::Identity();
//创建一个绕X轴旋转的旋转矩阵
KDL::Rotation r5=KDL::Rotation::RotX(M_PI/3);
//创建一个绕Y轴旋转的旋转矩阵
KDL::Rotation r6=KDL::Rotation::RotY(M_PI/3);
//创建一个绕Z轴旋转的旋转矩阵
KDL::Rotation r7=KDL::Rotation::RotZ(M_PI/3);
//创建一个绕任意(非单位)向量旋转的旋转矩阵
KDL::Rotation r8=KDL::Rotation::Rot(KDL::Vector(1.,2.,3.),M_PI/4);
//创建一个绕任意(单位)向量旋转的旋转矩阵
KDL::Rotation r9=KDL::Rotation::Rot2(KDL::Vector(0.4472,0.5477,0.7071),M_PI/4);
//从ZYZ欧拉角创建旋转矩阵
KDL::Rotation r10=KDL::Rotation::EulerZYZ(1.,2.,3.);
//从ZYX欧拉角创建旋转矩阵
KDL::Rotation r11=KDL::Rotation::EulerZYX(1.,2.,3.);
//从RPY(Roll-Pitch-Yaw)创建旋转矩阵
KDL::Rotation r12=KDL::Rotation::RPY(1.,2.,3.);

//打印旋转矩阵:
std::cout<<"r1: "<<r1<<std::endl;
std::cout<<"r2: "<<r2<<std::endl;
std::cout<<"r3: "<<r3<<std::endl;
std::cout<<"r4: "<<r4<<std::endl;
std::cout<<"r5: "<<r5<<std::endl;
std::cout<<"r6: "<<r6<<std::endl;
std::cout<<"r7: "<<r7<<std::endl;
std::cout<<"r8: "<<r8<<std::endl;
std::cout<<"r9: "<<r9<<std::endl;
std::cout<<"r10: "<<r10<<std::endl;
std::cout<<"r11: "<<r11<<std::endl;
std::cout<<"r12: "<<r12<<std::endl;

打印结果:
在这里插入图片描述

3.设置和获取旋转矩阵

/*实例 orocos_kdl/examples/geometry.cpp*/
//获取单个元素
std::cout<<"r8(1,2): "<<r8(1,2)<<std::endl;
//获取等效旋转向量
std::cout<<"equiv rot vector of r11: "<<r11.GetRot()<<std::endl;
//获取等效旋转向量和角度
double angle=r10.GetRotAngle(v1);
std::cout<<"equiv rot vector of r10:"<<v1<<"and angle: "<<angle<<std::endl;
//获取ZYZ欧拉角
double alfa,beta,gamma;
r9.GetEulerZYZ(alfa,beta,gamma);
std::cout<<"EulerZYZ: "<<alfa<<", "<<beta<<", "<<gamma<<std::endl;
//获取ZYZ欧拉角
r9.GetEulerZYX(alfa,beta,gamma);
std::cout<<"EulerZYX: "<<alfa<<", "<<beta<<", "<<gamma<<std::endl;
//获取RPY(Roll-Pitch-Yaw)角
r9.GetRPY(alfa,beta,gamma);
std::cout<<"Roll-Pitch-Yaw: "<<alfa<<", "<<beta<<", "<<gamma<<std::endl;

打印结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值