Система tf в ROS отслеживает множество кадров координат и поддерживает взаимосвязь между ними в древовидной структуре. tf распределяется таким образом, что вся информация о координатных кадрах доступна для каждого узла в сети АФК. MATLAB ® позволяет получить доступ к этому дереву преобразования. В этом примере описывается доступ к доступным координатным кадрам, извлечение преобразований между ними и точки преобразования, векторы и другие объекты между любыми двумя координатными кадрами .
Предпосылки: начало работы с ROS, подключение к сети ROS
Инициализируйте систему ROS.
rosinit
Launching ROS Core... Done in 0.68156 seconds. Initializing ROS master on http://192.168.0.10:59363. Initializing global node /matlab_global_node_63470 with NodeURI http://bat6315glnxa64:38681/
Чтобы создать реалистичную среду для этого примера, используйте 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
DataFormat: 'object'
После создания объекта он начинает получать преобразования tf и буферизирует их внутри. Сохранить tftree в рабочей области, чтобы она продолжала получать данные.
Подождите немного, чтобы убедиться, что все преобразования получены.
pause(2);
Можно просмотреть имена всех доступных рамок координат, воспользовавшись AvailableFrames собственность.
tftree.AvailableFrames
ans = 3x1 cell
{'camera_center' }
{'mounting_point'}
{'robot_base' }
Здесь должны быть показаны три рамки координат, описывающие взаимосвязь между камерой, ее точкой установки и роботом.
Теперь, когда преобразования доступны, их можно проверить. Любое преобразование описывается АФК geometry_msgs/TransformStamped и имеет поступательный и вращательный компонент.
Извлеките преобразование, описывающее взаимосвязь между точкой монтажа и центром камеры. Используйте 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]
Transform: [1x1 Transform]
ChildFrameId: 'camera_center'
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
{'camera_center' }
{'mounting_point'}
{'robot_base' }
{'wheel' }
Окончательное визуальное представление всех четырех рамок координат выглядит следующим образом.

Вы можете видеть, что wheel координатная рамка имеет перемещение и поворот, указанные при отправке преобразования.
Остановите издатель преобразования примера.
exampleHelperROSStopTfPublisher
Завершите работу хозяина ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_63470 with NodeURI http://bat6315glnxa64:38681/ Shutting down ROS master on http://192.168.0.10:59363.