Практическое понимание кватернионов в ROS / MoveIt - PullRequest
0 голосов
/ 25 марта 2020

tl; dr: Как я могу отправить роботу 6 DOF команду «двигаться в (x, y, z, roll, pitch, yaw)» с помощью ROS MoveIt?

Я пытаюсь контролировать руку робота Universal Robots UR5 с 6 степенями свободы с помощью ROS и MoveIt, используя Python Move Group Interface. Я скучаю по основному элементу управления «как отправить конечный эффектор робота в эту точку». Я интерпретирую «конечный эффектор» как «руку» робота на самом конце. Интуитивно я хочу заставить конечный эффектор двигаться, используя что-то вроде:

pose_goal.position.x = x_coordinate # x, y, z, r, p, y are in a fixed reference frame
pose_goal.position.y = y_coordinate
pose_goal.position.z = z_coordinate
pose_goal.orientation.roll = roll_angle
pose_goal.orientation.pitch = pitch_angle
pose_goal.orientation.yaw = yaw_angle

move_group.set_pose_target(pose_goal)
plan = move_group.go(wait=True)

Но объект geometry_msgs.msg.Pose () хочет получить кватернион в формате (x, y, z, w).

Некоторые вещи, которые я сделал / исследовал:

Другая информация:

  • Запуск ROS Melodi c в Ubuntu 18.04
  • Моделирование Рука робота UR5 в RViz и Gazebo, но также имеет физическую руку

Вопросы

  • Мои исследования говорят, что кватернион формы (x, y , z, w) описывает вращение только в трехмерном пространстве. Как робот узнает, в какую позицию двигаться, если он получает только информацию о вращении?
  • Могу ли я конвертировать из (x, y, z, roll, pitch, yaw) в кватернион? Или они описывают две разные вещи?
  • Нужно ли нормализовать кватернионы так, чтобы сумма квадратов равнялась единице? Если да, то как я могу сказать, что мой робот-манипулятор go указывает на физическую точку в пространстве, такую ​​как (0,5 м, 0,3 м, 0 м)?
  • Может ли кто-нибудь дать непрофессиональное объяснение описания вращения (3D) с кватернионом (4D)?

1 Ответ

1 голос
/ 25 марта 2020

Мои исследования говорят, что кватернион формы (x, y, z, w) описывает вращение только в трехмерном пространстве. Как робот узнает, в какую позицию двигаться, если он получает только информацию о вращении?

Правильно, кватернион описывает ориентацию кадра только ; вам также нужно указать положение кадра, чтобы иметь позу complete . Quaternion - это просто другой способ описания ориентации тела, другой способ, как вы уже упоминали, использовать Углы Эйлера (Yaw, Pitch, Roll).

В вашем случае с вашим объектом pose_goal вам нужно указать положение желаемой позы / позы робота, установив компоненты x, y и z для pose_goal.position (это позиция робота в трехмерном пространстве) а затем также укажите ориентацию желаемой позы робота / цели, используя нотации Quaternion w, x, y и z для установки компонентов pose_goal.orientation (обратите внимание, что x, y и z часть кватерниона не совпадает с вашим вектором позиции, это разные вещи). Как только вы определили и pose_goal.position, и pose_goal.orientation, все готово, у вас есть полная поза, которую вы можете отправить MoveIt! планировать и выполнять.

Можно ли преобразовать из (x, y, z, roll, pitch, yaw) в кватернион? Или они описывают две разные вещи?

Здесь, x, y, z, это ваш вектор положения, который не имеет ничего общего с ориентацией (и, следовательно, с кватернионами), поэтому ваш вопрос действительно должен быть " Могу ли я преобразовать углы Эйлера (крен, тангаж, рыскание) в кватернион? " и ответ: да, вы можете преобразовать углы Эйлера в кватернион, но это может быть сложно. Если вы можете представить ориентацию с помощью кватерниона (то есть, если у вас уже есть эта информация), вы должны использовать ее, так как кватернионы являются более численно устойчивыми и не страдают от особенностей (например, углы Эйлера могут вызвать блокировку карданного подвеса, если под указанным c конфигурация вашей системы теряет степень свободы.)

Если у вас есть доступ к кватерниону, используйте его и забудьте об углах Эйлера, иначе вы можете попробовать преобразовать углы Эйлера в кватернион, используя следующую способ использования библиотеки tf ROS:

from tf.transformations import quaternion_from_euler

# Pose Position
pose_goal.position.x = x_coordinate
pose_goal.position.y = y_coordinate
pose_goal.position.z = z_coordinate

# Pose Orientation
quaternion = quaternion_from_euler(roll_angle, pitch_angle, yaw_angle)

pose.orientation.x = quaternion[0]
pose.orientation.y = quaternion[1]
pose.orientation.z = quaternion[2]
pose.orientation.w = quaternion[3]

move_group.set_pose_target(pose_goal)
plan = move_group.go(wait=True)

См. tf.transformations.quaternion_from_euler(ai, aj, ak, axes='sxyz'), где ai, aj, ak - крен, шаг и рыскание соответственно и axes параметр определяет порядок применения углов (что очень важно)

(сам не проверял, но может стоить усилий)

Может ли кто-нибудь предоставить непонятные термины объяснение описания вращения (3D) с кватернионом (4D)?

Кватернионы немного сложны, но я Вот отличное видео здесь , объясняющее их в интерактивной форме. В целом, и, по моему опыту, Quaternions вначале может быть немного разочаровывающим, и вам может показаться, что сначала трудно понять эту концепцию, так что имейте это в виду, изучая их, и наберитесь терпения!

...