Расчет кватерниона в "RosInertialUnit.cpp" контроллера по умолчанию Webots ROS - PullRequest
1 голос
/ 10 мая 2019

сегодня я более внимательно посмотрел на вычисление кватерниона, используемое в файле "RosInertialUnit.cpp" как части контроллера ROS по умолчанию.

Я хотел опробовать InterialUnit, используя "keyboard_teleop.wbt""- world и добавил датчик к роботу Pioneer.

Затем я сравнивал значения вращения робота, заданные в дереве сцены (в формате оси + угол), с выходом датчика в ROS (преобразование ориентации вкватернион).Вы можете видеть оба на скриншотах ниже: enter image description here enter image description here

На мой взгляд, выход кватерниона не соответствует значениям, заданным в дереве сцены,При использовании функции MATLAB "quat = axang2quat (axang)" для приведенного выше примера я получу следующее:

quat = 0.7936    0.0131   -0.6082    0.0104  % w x y z

, которое при сравнении с сообщением ROS показывает, что y и z переключены.Я не совсем уверен, если это нарочно (может быть, другое соглашение?).Я не хотел сразу запускать запрос на удаление, но хотел обсудить эту проблему здесь раньше.

Я тестировал следующую реализацию в измененной версии RosInertialUnit.cpp, которая дает ожидаемые результаты.(те же результаты, что и в MATLAB).

  double halfRoll = mInertialUnit->getRollPitchYaw()[0] * 0.5;   // turning around x
  double halfPitch = mInertialUnit->getRollPitchYaw()[2] * 0.5;  // turning around y
  double halfYaw = mInertialUnit->getRollPitchYaw()[1] * 0.5;    // turning around z
  double cosYaw = cos(halfYaw);
  double sinYaw = sin(halfYaw);
  double cosPitch = cos(halfPitch);
  double sinPitch = sin(halfPitch);
  double cosRoll = cos(halfRoll);
  double sinRoll = sin(halfRoll);

  value.orientation.x = cosYaw * cosPitch * sinRoll - sinYaw * sinPitch * cosRoll;
  value.orientation.y = sinYaw * cosPitch * sinRoll + cosYaw * sinPitch * cosRoll;
  value.orientation.z = sinYaw * cosPitch * cosRoll - cosYaw * sinPitch * sinRoll;
  value.orientation.w = cosYaw * cosPitch * cosRoll + sinYaw * sinPitch * sinRoll;

Это та же реализация, что и в этой статье в википедии .

1 Ответ

2 голосов
/ 10 мая 2019

Эта инверсия вызвана тем, что системы координат Веб-роботов и АФК не эквивалентны.

В Веб-роботах:

  • Х : влево
  • Y : вверх
  • Z : вперед

Что приводит к: (https://cyberbotics.com/doc/reference/inertialunit#field-summary)

  • крен : слева (Webots X)
  • шаг : вперед (Webots Z) * ​​1031 *
  • рыскание : вверх (Webots Y)

В ROS: (https://www.ros.org/reps/rep-0103.html#axis-orientation)

  • X : вперед
  • Y : влево
  • Z : вверх

Что приводит к: (https://www.ros.org/reps/rep-0103.html#rotation-representation)

  • крен : вперед (ROS X)
  • шаг : слева (ROS Y)
  • рыскание : вверх (ROS Z) * ​​1071 *

Как вы можете видеть, оси крена и тангажа переключаются, поэтому они также включены в коде.

...