Строка ниже кодирует преобразование отражения на плоскости XZ оси вращения "quat":
tf2::Quaternion quat(orix, -oriy, oriz, oriw);
Затем они просто определяют вращение pi / 2 рад вокруг оси вXZ-plane.
tf2::Vector3 rotation_vector(0.7071068, 0, 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,0, 0, 0, -1,0 ,0 ,0, 1);
Следующая строка объединяет это отражение с текущим преобразованием:
matrix = change_y * matrix;
Наконец онипереходя от матрицы к кватернионам:
double roll, pitch, yaw;
matrix.getRPY(roll, pitch, yaw);
quat.setRPY(roll,pitch,yaw);`
Поскольку вы можете представлять отражение, используя чистые кватернионы (см. https://www.euclideanspace.com/maths/geometry/affine/reflection/quaternion/index.htm), тогда я утверждаю, что следующее выражение эквивалентно приведенному выше коду:
// pure quaternion for doing reflection
tf2::Quaternion j(0, 1, 0, 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;
Трудно сказать, действительно ли эти выражения эквивалентны из-за изменения между матрицей и кватернионами, поэтомуможно было бы провести числовой тест для подтверждения того, что я не испортил вещи со знаками. Я не проверял это, так что принимайте это как есть.