Выразить вектор и ориентацию в другом справочнике в C с помощью собственного

#c #eigen

#c #eigen

Вопрос:

Допустим, у меня есть три ссылки (A, B и C)

введите описание изображения здесь

Я знаю следующие значения:

  • положение B в A (как собственное::Vector3d)
  • ориентация B в A (как собственный::Quaterniond)
  • положение C в B (как собственное::Vector3d)
  • ориентация C в B (как собственный::Quaterniond)

Как я могу найти положение и ориентацию A в C с помощью C и собственного?

 Eigen::Vector3d p_B_in_A = Eigen::Vector3d(...);
Eigen::Quaterniond q_B_in_A = Eigen::Quaterniond(...);
Eigen::Vector3d p_C_in_B = Eigen::Vector3d(...);
Eigen::Quaterniond q_C_in_B = Eigen::Quaterniond(...);

Eigen::Vector3d p_A_in_C = ???
Eigen::Quaterniond q_A_in_C = ???
  

Комментарии:

1. Вы спрашиваете о математике, собственном API или о том, как написать это на C ?

2. Как написать это на C с помощью Eigen, я отредактирую это, спасибо

Ответ №1:

Я отвечаю на свой собственный вопрос следующим кодом в качестве примера:

 Eigen::Affine3d B2A = Eigen::Affine3d::Identity();
B2A.translation() << 2 , -1 , 1;
B2A.linear() << std::sqrt(2)/2,  0, std::sqrt(2)/2,
               -std::sqrt(2)/2,  0, std::sqrt(2)/2,
                        0        , -1,         0;

Eigen::Affine3d C2B = Eigen::Affine3d::Identity();
C2B.translation() << 0, 1, 3*sqrt(2);
C2B.linear() <<  1, 0, 0,
                 0,-1, 0,
                 0, 0,-1;

Eigen::Affine3d A2C = C2B.inverse() * B2A.inverse();
// At this point, the orientation of A in C can be found in
// A2C.linear() as a 3x3 rotation matrix. the position of A 
// in C can be found in A2C.translation() as a Vector3d.
  

B2A представляет положение и ориентацию B в кадре A. Таким же образом C2B представляет положение и ориентацию B в C. Выполнив обратное преобразование из двух, можно найти положение и ориентацию A в C. Использование аффинного от собственного действительно полезно для преобразования пространства и объединения переводов и вращения.