Инвертировать трехмерную кватернионную последовательность вращения в собственных - PullRequest
0 голосов
/ 05 мая 2018

Как я могу инвертировать последовательность трехмерного вращения, построенную в кватернионах, используя библиотеку Eigen?

Я строю кватернионы с точки зрения рыскания, крена, шага, как показано ниже:

Eigen::AngleAxisf yawAngle(thetaZ, Eigen::Vector3f::UnitZ());
Eigen::AngleAxisf rollAngle(thetaY, Eigen::Vector3f::UnitY());
Eigen::AngleAxisf pitchAngle(thetaX, Eigen::Vector3f::UnitX());

Eigen::Quaternionf qauternion = pitchAngle * rollAngle * yawAngle;

Eigen::Vector3f offset = Eigen::Vector3f(0.0f, 0.0f, 0.0f);
pcl::transformPointCloud(*pclCloud, *pclCloud, offset, qauternion);

Как мне вернуться с конца?

EDIT: То, что я пытаюсь сделать, это преобразовать обратно отсканированные результаты на управляемом поворотном столе XZ. Разработанный код ниже

Eigen :: Quaternionf _quaternion; pcl :: PointCloud :: Ptr pclCloud;

void initTransformation(float yaw, float pitch){
   _transformation = Eigen::Affine3f::Identity();
   _yaw = yaw;
   _pitch = pitch;
}

void updateTransformation(float newYaw, float newPitch){
    // Warning!
    // Don't change both axis at the same time
    // Yaw: Z  // Pitch: X

    float yawDif = _yaw - newYaw;
    float pitchDif = _pitch - newPitch;

    float yawRad = M_PI * yawDif / 180.0f;
    float pitchRad = M_PI * pitchDif / 180.0f;

    Eigen::AngleAxisf yawAngle(yawRad, Eigen::Vector3f::UnitZ());
    Eigen::AngleAxisf rollAngle(0.0f, Eigen::Vector3f::UnitY());
    Eigen::AngleAxisf pitchAngle(pitchRad, Eigen::Vector3f::UnitX());

    Eigen::Quaternionf quater = pitchAngle * rollAngle * yawAngle;
    _quaternion = quater * _quaternion;

    _yaw = newYaw;
    _pitch = newPitch;
}


 void inversetheCloud();
    Eigen::Quaternionf invQuaternion = _quaternion.inverse();
    Eigen::Vector3f offset = Eigen::Vector3f(0.0f, 0.0f, 0.0f);
    pcl::transformPointCloud(*pclCloud, *pclCloud, offset, invQuaternion);
 }

// Sample Usage
void main(){
    initTransformation(45.0f, 0.0f);
    updateTransformation(45.0f, 90.0f);
    updateTransformation(0.0f, 90.0f);
    inversetheCloud();
}

В результате второе обратное преобразование истинно, но более поздние неверны, как видно на изображении. Белое облако: 1-е Пурпурное облако: 2-е Зеленое облако: 3-е

transformresult2 transformresult3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...