C++ 通过Euler角度输入旋转四元数

C++ 通过Euler角度输入旋转四元数,c++,transformation,eigen,quaternions,euler-angles,C++,Transformation,Eigen,Quaternions,Euler Angles,我正在写一个在3D空间控制机械臂的代码。机械臂通过四元数控制旋转,但我希望用户通过改变偏航、俯仰和滚动来控制它,因为人类使用这些更明智 我编写了一个函数来获取用户希望在每个方向(滚动、俯仰、偏航)上旋转手臂的数量,并输出新的四元数。我将当前的四元数保存为全局变量 我使用C++和EGIN。< /P> Eigen::Quaterniond euler2Quaternion( const double roll, const double pitch,

我正在写一个在3D空间控制机械臂的代码。机械臂通过四元数控制旋转,但我希望用户通过改变偏航、俯仰和滚动来控制它,因为人类使用这些更明智

我编写了一个函数来获取用户希望在每个方向(滚动、俯仰、偏航)上旋转手臂的数量,并输出新的四元数。我将当前的四元数保存为全局变量

<>我使用C++和EGIN。< /P>
Eigen::Quaterniond euler2Quaternion( const double roll,
              const double pitch,
              const double yaw)
{

Eigen::AngleAxisd rollAngle(roll,Eigen::Vector3d::UnitX());
Eigen::AngleAxisd pitchAngle(pitch,Eigen::Vector3d::UnitY());
Eigen::AngleAxisd yawAngle(yaw,Eigen::Vector3d::UnitZ());

Eigen::Quaterniond q = rollAngle*pitchAngle*yawAngle;
current_q=q*current_q;
return current_q;
}

我尝试了很多方法来改变角度相乘的顺序,并将UnitX()、UnitY()和UnitZ()与当前旋转矩阵()相乘,但没有一种方法奏效。

您的示例与

你试过打印组合旋转矩阵的结果吗?我打赌当角度为零时,它是对角线1,1,1

我对你使用当前的_q感到困惑。如果横摇、俯仰、偏航与某个固定的参考方向相对应,那么q将是整个旋转。在这种情况下,这:

current_q=q*current_q;
return current_q;
应该是

current_q=q;
return current_q;
如果
滚转、俯仰、偏航
是指对当前欧拉旋转角度(从某个固定参考方向开始)的更改,则更容易存储这些角度并相应更改:

double m_roll=0, m_pitch=0, m_yaw=0;
 . . .
Eigen::Quaterniond euler2Quaternion(double roll,
              double pitch,
              double yaw)
{
 m_roll+=roll;
 m_pitch+=pitch;
 m_yaw+=yaw;

 Eigen::AngleAxisd rollAngle(m_roll,Eigen::Vector3d::UnitX());
 Eigen::AngleAxisd pitchAngle(m_pitch,Eigen::Vector3d::UnitY());
 Eigen::AngleAxisd yawAngle(m_yaw,Eigen::Vector3d::UnitZ());

 Eigen::Quaterniond q = rollAngle*pitchAngle*yawAngle;
 current_q=q;
 return current_q;
}

sbabbi的评论中也提出了这一点,为什么不直接构建四元数呢

Eigen::Quaterniond rollQuaternion(cos(0.5*roll), sin(0.5*roll), 0.0, 0.0);
Eigen::Quaterniond pitchQuaternion(cos(0.5*roll), 0.0, sin(0.5*roll), 0.0);
Eigen::Quaterniond yawQuaternion(cos(0.5*roll), 0.0, 0.0, sin(0.5*roll));
Eigen::Quaterniond finalOrientation = rollQuaternion*pitchQuaternion*yawQuaternion*current_q;

你说“他们都不工作”是什么意思?如中所示,它没有产生预期的变换?是的,即使所有输入为零,旋转也总是在变化。什么是
角度轴
四元数
?它们有意义吗?简单地存储欧拉角(滚转、俯仰、偏航)而不是
当前_q
,怎么样,需要时,从euler角度生成四元数?@Avi Ginsburg:我从这个问题中得到了我的代码的基础:输入是用户想要改变旋转的小数量,而不是他们自己的旋转。我会尝试一下,然后让你知道…tnx。
Eigen::Quaterniond rollQuaternion(cos(0.5*roll), sin(0.5*roll), 0.0, 0.0);
Eigen::Quaterniond pitchQuaternion(cos(0.5*roll), 0.0, sin(0.5*roll), 0.0);
Eigen::Quaterniond yawQuaternion(cos(0.5*roll), 0.0, 0.0, sin(0.5*roll));
Eigen::Quaterniond finalOrientation = rollQuaternion*pitchQuaternion*yawQuaternion*current_q;