tf система в ROS отслеживает несколько координат, структурирует и поддерживает отношения между ними в древовидной структуре. tf распределяется, так, чтобы информация обо всех координатных кадрах была доступна каждому узлу в сети ROS. MATLAB® позволяет вам получать доступ к этому дереву преобразования. Этот пример ознакомляет вас с доступом к доступным координатным кадрам, получая преобразования между ними, и преобразуйте точки, векторы и другие сущности между любыми двумя координатными кадрами.
Предпосылки: Запуск с ROS, соединитесь с сетью ROS
Инициализируйте систему ROS.
rosinit
Initializing ROS master on http://bat6230glnxa64:46805/. Initializing global node /matlab_global_node_11012 with NodeURI http://bat6230glnxa64:40657/
Чтобы создать реалистическую среду для этого примера, используйте exampleHelperROSStartTfPublisher
, чтобы широковещательно передать несколько преобразований. Преобразования представляют камеру, которая смонтирована на роботе.
Существует три координатных кадра, которые заданы в этом дереве преобразования:
опорная рама робота (robot_base
)
точка монтирования камеры (mounting_point
)
оптический центр камеры (camera_center
)
Два преобразовывает, публикуются:
преобразование от робота базируется к точке монтирования камеры
преобразование от точки монтирования до центра камеры
exampleHelperROSStartTfPublisher
Визуальное представление трех координат структурирует взгляды можно следующим образом.
Здесь, x, y, и оси z каждого кадра представлены красными, зелеными, и синими строками соответственно. Связи между родительскими объектами и их потомками между координатными кадрами показывают через коричневую стрелку, указывающую от дочернего элемента к ее родительскому кадру.
Создайте новый объект дерева преобразования с функцией
rostf
. Можно использовать этот объект получить доступ ко всем доступным преобразованиям и применить их к различным сущностям.
tftree = rostf
tftree = TransformationTree with properties: AvailableFrames: {0x1 cell} LastUpdateTime: [0x1 Time] BufferTime: 10
Если объект создается, он начинает получать tf преобразования и буферизует их внутренне. Необходимо сохранить переменную tftree
в рабочей области, так, чтобы это продолжило получать данные.
Сделайте паузу для немного, чтобы убедиться, что все преобразования получены.
pause(1);
Вы видите имена всех доступных координатных кадров путем доступа к свойству AvailableFrames
.
tftree.AvailableFrames
ans = 3x1 cell array
{'camera_center' }
{'mounting_point'}
{'robot_base' }
Это должно показать три координатных кадра, которые описывают отношение между камерой, ее точкой монтирования и роботом.
Теперь, когда преобразования доступны, можно осмотреть их. Любое преобразование описано сообщением geometry_msgs/TransformStamped
ROS и имеет переводный и вращательный компонент.
Получите преобразование, которое описывает отношение между точкой монтирования и центром камеры. Используйте функцию
getTransform
, чтобы сделать это.
mountToCamera = getTransform(tftree, 'mounting_point', 'camera_center'); mountToCameraTranslation = mountToCamera.Transform.Translation
mountToCameraTranslation = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 0 Y: 0 Z: 0.5000 Use showdetails to show the contents of the message
quat = mountToCamera.Transform.Rotation
quat = ROS Quaternion message with properties: MessageType: 'geometry_msgs/Quaternion' X: 0 Y: 0.7071 Z: 0 W: 0.7071 Use showdetails to show the contents of the message
mountToCameraRotationAngles = rad2deg(quat2eul([quat.W quat.X quat.Y quat.Z]))
mountToCameraRotationAngles = 1×3
0 90 0
Относительно точки монтирования центр камеры расположен 0,5 метра вдоль оси z и вращается 90 градусами вокруг оси Y.
Чтобы осмотреть отношение между основой робота и точкой монтирования камеры, вызовите getTransform
снова.
baseToMount = getTransform(tftree, 'robot_base', 'mounting_point'); baseToMountTranslation = baseToMount.Transform.Translation
baseToMountTranslation = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 1 Y: 0 Z: 0 Use showdetails to show the contents of the message
baseToMountRotation = baseToMount.Transform.Rotation
baseToMountRotation = ROS Quaternion message with properties: MessageType: 'geometry_msgs/Quaternion' X: 0 Y: 0 Z: 0 W: 1 Use showdetails to show the contents of the message
Точка монтирования расположена на уровне 1 метра вдоль оси X основы робота.
Примите теперь, когда у вас есть 3D точка, которая задана в кадре координаты camera_center
, и вы хотите вычислить, каковы координаты точки в кадре robot_base
.
Используйте функцию
waitForTransform
, чтобы ожидать, пока преобразование между camera_center
и кадрами координаты robot_base
не станет доступным. Этот вызов блоки до преобразования, которое берет данные от camera_center
до robot_base
, допустим и доступен в дереве преобразования.
waitForTransform(tftree, 'robot_base', 'camera_center');
Теперь задайте точку в положении [3 1.5 0.2]
в кадре координаты центра камеры. Вы впоследствии преобразуете эту точку в координаты robot_base
.
pt = rosmessage('geometry_msgs/PointStamped'); pt.Header.FrameId = 'camera_center'; pt.Point.X = 3; pt.Point.Y = 1.5; pt.Point.Z = 0.2;
Можно преобразовать координаты точки путем вызывания transform
функции на объекте дерева преобразования. Задайте, каков целевой координатный кадр этого преобразования. В этом примере используйте robot_base
.
tfpt = transform(tftree, 'robot_base', pt)
tfpt = ROS PointStamped message with properties: MessageType: 'geometry_msgs/PointStamped' Header: [1x1 Header] Point: [1x1 Point] Use showdetails to show the contents of the message
Преобразованная точка tfpt
имеет следующие 3D координаты.
tfpt.Point
ans = ROS Point message with properties: MessageType: 'geometry_msgs/Point' X: 1.2000 Y: 1.5000 Z: -2.5000 Use showdetails to show the contents of the message
Помимо сообщений PointStamped
, функция
transform
позволяет вам преобразовывать другие сущности как положения (geometry_msgs/PoseStamped)
, кватернионы (geometry_msgs/QuaternionStamped)
, и облака точек (sensor_msgs/PointCloud2)
.
Если вы хотите сохранить преобразование, можно получить его с функцией
getTransform
.
robotToCamera = getTransform(tftree, 'robot_base', 'camera_center')
robotToCamera = ROS TransformStamped message with properties: MessageType: 'geometry_msgs/TransformStamped' Header: [1x1 Header] ChildFrameId: 'camera_center' Transform: [1x1 Transform] Use showdetails to show the contents of the message
Это преобразование может использоваться, чтобы преобразовать координаты в кадр camera_center
в координаты в кадре robot_base
.
robotToCamera.Transform.Translation
ans = ROS Vector3 message with properties: MessageType: 'geometry_msgs/Vector3' X: 1 Y: 0 Z: 0.5000 Use showdetails to show the contents of the message
robotToCamera.Transform.Rotation
ans = ROS Quaternion message with properties: MessageType: 'geometry_msgs/Quaternion' X: 0 Y: 0.7071 Z: 0 W: 0.7071 Use showdetails to show the contents of the message
Можно также широковещательно передать новое преобразование к сети ROS.
Примите, что у вас есть простое преобразование, которое описывает смещение кадра координаты wheel
относительно кадра координаты robot_base
. Колесо смонтировано-0.2 метра вдоль оси Y и-0.3 вдоль оси z. Колесо имеет относительное вращение 30 градусов вокруг оси Y.
Создайте соответствующее сообщение geometry_msgs/TransformStamped
, которое описывает это преобразование. Исходный кадр координаты, wheel
, помещается в свойство ChildFrameId
. Целевой координатный кадр, robot_base
, добавляется к свойству Header.FrameId
.
tfStampedMsg = rosmessage('geometry_msgs/TransformStamped'); tfStampedMsg.ChildFrameId = 'wheel'; tfStampedMsg.Header.FrameId = 'robot_base';
Само преобразование описано в свойстве Transform
. Это содержит Translation
и Rotation
. Заполните значения, которые упоминаются выше.
Rotation
описан как кватернион. Чтобы преобразовать 30 вращений степени вокруг оси Y к кватерниону, можно использовать функцию
axang2quat
. Ось Y описана [0 1 0]
вектором, и 30 градусов могут быть преобразованы в радианы с функцией deg2rad
.
tfStampedMsg.Transform.Translation.X = 0; tfStampedMsg.Transform.Translation.Y = -0.2; tfStampedMsg.Transform.Translation.Z = -0.3; quatrot = axang2quat([0 1 0 deg2rad(30)])
quatrot = 1×4
0.9659 0 0.2588 0
tfStampedMsg.Transform.Rotation.W = quatrot(1); tfStampedMsg.Transform.Rotation.X = quatrot(2); tfStampedMsg.Transform.Rotation.Y = quatrot(3); tfStampedMsg.Transform.Rotation.Z = quatrot(4);
Используйте rostime
, чтобы получить текущее системное время и использование что добавить метку времени к преобразованию. Это сообщает получателям, в котором моменте времени это преобразование было допустимо.
tfStampedMsg.Header.Stamp = rostime('now');
Используйте функцию
sendTransform
, чтобы широковещательно передать это преобразование.
sendTransform(tftree, tfStampedMsg)
Новый кадр координаты wheel
находится теперь также в списке доступных координатных кадров.
tftree.AvailableFrames
ans = 4x1 cell array
{'camera_center' }
{'mounting_point'}
{'robot_base' }
{'wheel' }
Итоговое визуальное представление всех четырех координат структурирует взгляды можно следующим образом.
Вы видите, что кадр координаты wheel
имеет перевод и вращение, которое вы задали в отправке преобразования.
Остановите издателя преобразования в качестве примера.
exampleHelperROSStopTfPublisher
Закройте ведущее устройство ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_11012 with NodeURI http://bat6230glnxa64:40657/ Shutting down ROS master on http://bat6230glnxa64:46805/.