Powiedzmy, że mam trzy referencje (A, B i C)

enter image description here

Znam następujące wartości:

  • Pozycja B w A (jako Eigen :: Vector3d)
  • Orientacja B w A (jako Eigen :: quaterniond)
  • Pozycja C w B (jako Eigen :: Vector3d)
  • Orientacja C w B (jako Eigen :: quaterniond)

Jak mogę znaleźć stanowisko i orientację A w C z C ++ i Eigen?

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 = ???
0
Chris 22 listopad 2020, 12:59

1 odpowiedź

Najlepsza odpowiedź

Odpowiem na moje własne pytanie z następującym kodem jako przykładem:

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 reprezentuje położenie i orientację B w ramce. W ten sam sposób, C2B reprezentuje pozycję i orientację B w C. przez dokonanie odwrotności dwóch transformacji można znaleźć położenie i orientację A w C. Korzystanie z AFFINY z Eigen jest naprawdę przydatny do tworzenia transformacji przestrzeni i łączenia tłumaczeń i rotacji.

1
Chris 24 listopad 2020, 19:04