以下代码中四元数的转换是什么?

我已经在代码审查中问过这个问题,因为这是可以工作的c ++代码,但是他们说在这里更好。 因此,我有一些代码可以将四元数(orix,oriy,oriz,oriw)旋转到另一个四元数,但是这种旋转编写得很糟糕,有人可以用更少的行数来做mabye。 所以我有两个问题,有人知道四元数是如何旋转的吗?我认为它以欧拉角围绕y旋转-pi / 2? 其次,有人知道如何更好地编写它吗?

这是完整的代码,它进行了转换(使用tf2导入)。

编辑:是的,tf2是一个库。这里的链接:docs.ros.org/melodic/api/tf2/

            tf2::Quaternion quat(orix,-oriy,oriz,oriw);
            tf2::Quaternion q_rot;
            tf2::Vector3 rotation_vector(0.7071068,0.7071068);
            q_rot.setRotation(rotation_vector,M_PI);
            quat = q_rot*quat;
            quat.normalize();   
            tf2::Matrix3x3 matrix(quat);
            tf2::Matrix3x3 change_y(1,-1,1);
            matrix = change_y * matrix;

            double roll,pitch,yaw;
            matrix.getRPY(roll,yaw);
            quat.setRPY(roll,yaw);`
emrick 回答:以下代码中四元数的转换是什么?

rotation_vector实际上是在定义旋转轴,因此,您将围绕定义为M_PI的向量旋转[0.7 0 0.7],这类似于绕y轴旋转{{ 1}}-从而使用M_PI/4生成新的坐标系-然后围绕当前的z'轴旋转[x' y' z']

也许此ROS tutorial可能有帮助。

这足以让您在需要滚动,俯仰和偏航旋转的情况下旋转四元数。

M_PI
,

下面的行在“ quat”旋转轴的XZ平面上编码反射变换:

tf2::Quaternion quat(orix,-oriy,oriz,oriw);

接下来,他们仅定义pi / 2 rad围绕XZ平面中的轴旋转。

tf2::Vector3 rotation_vector(0.7071068,0.7071068);
q_rot.setRotation(rotation_vector,M_PI);

接下来,他们进行轮换(订单事项):

quat = q_rot*quat;
quat.normalize();  

接下来,他们将数学表示形式从四元数转换为矩阵代数:

tf2::Matrix3x3 matrix(quat);

接下来,他们再次定义关于XZ平面的反射变换:

tf2::Matrix3x3 change_y(1,-1,1);

下一行将反射与当前转换合成:

matrix = change_y * matrix;

最后,它们从矩阵传回四元数:

double roll,pitch,yaw;
matrix.getRPY(roll,yaw);
quat.setRPY(roll,yaw);`

由于您可以使用纯四元数表示反射(请参见https://www.euclideanspace.com/maths/geometry/affine/reflection/quaternion/index.htm),所以我认为以下表达式与上面的代码等效:

// pure quaternion for doing reflection
tf2::Quaternion j(0,1,0); 
// j*X*j is the reflection of X on the plane with normal j
quat = j*q_rot*j*quat*j*j;

可以简化为:

quat = -j*q_rot*j*quat;

由于矩阵和四元数之间的变化,很难确定这些表达式是否真正相等,因此可以进行数值测试以确认我没有把符号弄乱。我尚未对此进行测试,因此请按原样进行。

本文链接:https://www.f2er.com/3148245.html

大家都在问