exponenta event banner

getTransform

Извлечение преобразования между двумя координатными кадрами

Описание

tf = getTransform(tftree,targetframe,sourceframe) возвращает последнее известное преобразование между двумя координатными кадрами в tftree. Создать tftree объект с использованием rostf, что требует подключения к сети ROS.

Преобразования структурированы как 3-D перемещение (трёхэлементный вектор) и 3-D вращение (кватернион).

tf = getTransform(tftree,targetframe,sourceframe,sourcetime) возвращает преобразование из tftree в заданное время источника. Если преобразование в то время недоступно, отображается ошибка.

пример

tf = getTransform(___,"Timeout",timeout) также указывает период ожидания преобразования (в секундах). Если преобразование не становится доступным в период тайм-аута, функция возвращает ошибку. Эта опция может быть объединена с предыдущими синтаксисами.

пример

tf = getTransform(bagSel,targetframe,sourceframe) возвращает последнее преобразование между двумя кадрами в rosbag в bagSel. Чтобы получить bagSel ввод, загрузка rosbag с помощью rosbag.

tf = getTransform(bagSel,targetframe,sourceframe,sourcetime) возвращает преобразование в указанном sourcetime в розбаге в bagSel.

Примеры

свернуть все

В этом примере показано, как настроить дерево преобразования ROS и преобразовать кадры на основе информации дерева преобразования. Для доступа к преобразованиям в разное время используются преобразования с буферизацией по времени.

Создайте дерево преобразования ROS. Использовать rosinit для подключения к сети ROS. Заменить ipaddress с сетевым адресом ROS.

ipaddress = '192.168.17.129';
rosinit(ipaddress,11311)
Initializing global node /matlab_global_node_14346 with NodeURI http://192.168.17.1:56312/
tftree = rostf;
pause(1)

Просмотрите доступные кадры в дереве преобразования.

tftree.AvailableFrames
ans = 36×1 cell
    {'base_footprint'            }
    {'base_link'                 }
    {'camera_depth_frame'        }
    {'camera_depth_optical_frame'}
    {'camera_link'               }
    {'camera_rgb_frame'          }
    {'camera_rgb_optical_frame'  }
    {'caster_back_link'          }
    {'caster_front_link'         }
    {'cliff_sensor_front_link'   }
    {'cliff_sensor_left_link'    }
    {'cliff_sensor_right_link'   }
    {'gyro_link'                 }
    {'mount_asus_xtion_pro_link' }
    {'odom'                      }
    {'plate_bottom_link'         }
    {'plate_middle_link'         }
    {'plate_top_link'            }
    {'pole_bottom_0_link'        }
    {'pole_bottom_1_link'        }
    {'pole_bottom_2_link'        }
    {'pole_bottom_3_link'        }
    {'pole_bottom_4_link'        }
    {'pole_bottom_5_link'        }
    {'pole_kinect_0_link'        }
    {'pole_kinect_1_link'        }
    {'pole_middle_0_link'        }
    {'pole_middle_1_link'        }
    {'pole_middle_2_link'        }
    {'pole_middle_3_link'        }
      ⋮

Проверьте, доступно ли требуемое преобразование. Для этого примера проверьте преобразование из 'camera_link' кому 'base_link'.

canTransform(tftree,'base_link','camera_link')
ans = logical
   1

Получите преобразование в течение 3 секунд. getTransform функция будет ждать, пока преобразование не станет доступным с указанным тайм-аутом.

desiredTime = rostime('now') + 3;
tform = getTransform(tftree,'base_link','camera_link',...
                     desiredTime,'Timeout',5);

Создайте сообщение ROS для преобразования. Сообщения также могут быть извлечены из сети ROS.

pt = rosmessage('geometry_msgs/PointStamped');
pt.Header.FrameId = 'camera_link';
pt.Point.X = 3;
pt.Point.Y = 1.5;
pt.Point.Z = 0.2;

Преобразование сообщения ROS в 'base_link' кадр с использованием требуемого времени, сохраненного ранее.

tfpt = transform(tftree,'base_link',pt,desiredTime);

(Необязательно) Также можно использовать apply с сохраненными tform для применения этого преобразования к pt сообщение.

tfpt2 = apply(tform,pt);

Завершите работу сети ROS.

rosshutdown
Shutting down global node /matlab_global_node_14346 with NodeURI http://192.168.17.1:56312/

В этом примере показано, как получить доступ к преобразованиям с буферизацией по времени в сети ROS. Доступ к преобразованиям для определенного времени и изменение BufferTime в зависимости от желаемого времени.

Создайте дерево преобразования ROS. Использовать rosinit для подключения к сети ROS. Заменить ipaddress с сетевым адресом ROS.

ipaddress = '192.168.17.129';
rosinit(ipaddress,11311)
Initializing global node /matlab_global_node_78006 with NodeURI http://192.168.17.1:56344/
tftree = rostf;
pause(2);

Получите преобразование с 1 секунды назад.

desiredTime = rostime('now') - 1;
tform = getTransform(tftree,'base_link','camera_link',desiredTime);

Время буфера преобразования по умолчанию составляет 10 секунд. Изменение BufferTime свойство дерева преобразования для увеличения времени буфера и ожидания заполнения этого буфера.

tftree.BufferTime = 15;
pause(15);

Получить преобразование от 12 секунд назад.

desiredTime = rostime('now') - 12;
tform = getTransform(tftree,'base_link','camera_link',desiredTime);

Вы также можете получить преобразования за один раз в будущем. getTransform функция будет ждать, пока преобразование не станет доступным. Можно также указать время ожидания для ошибки, если преобразование не найдено. Этот пример ожидает 5 секунд, пока преобразование не станет доступным через 3 секунды.

desiredTime = rostime('now') + 3;
tform = getTransform(tftree,'base_link','camera_link',desiredTime,'Timeout',5);

Завершите работу сети ROS.

rosshutdown
Shutting down global node /matlab_global_node_78006 with NodeURI http://192.168.17.1:56344/

Получить преобразования из rosbag (.bag) файлов путем загрузки rosbag и проверки доступных кадров. Из этих кадров, использовать getTransform запрос преобразования между двумя координатными кадрами.

Загрузите розбаг.

bag = rosbag('ros_turtlesim.bag');

Получение списка доступных кадров.

frames = bag.AvailableFrames;

Получить последнее преобразование между двумя координатными кадрами.

tf = getTransform(bag,'world',frames{1});

Проверьте, доступно ли преобразование в определенное время, и извлеките преобразование. Использовать canTransform для проверки доступности преобразования. Укажите время с помощью rostime.

tfTime = rostime(bag.StartTime + 1);
if (canTransform(bag,'world',frames{1},tfTime))
    tf2 = getTransform(bag,'world',frames{1},tfTime);
end

Входные аргументы

свернуть все

Дерево преобразования ROS, указанное как TransformationTree дескриптор объекта. Можно создать дерево преобразования, вызвав rostf функция.

Выбор сообщений rosbag, указанных как BagSelection дескриптор объекта. Для создания выбора сообщений rosbag используйте rosbag.

Целевой кадр координат, заданный как строковый скалярный или символьный вектор. Доступные кадры для преобразования можно просмотреть путем вызова tftree.AvailableFrames.

Начальный кадр координат, заданный как строковый скалярный или символьный вектор. Доступные кадры для преобразования можно просмотреть путем вызова tftree.AvailableFrames.

ROS или системное время, указанное как Time дескриптор объекта. По умолчанию sourcetime - время моделирования АФК, опубликованное на clock тема. Если use_sim_time Параметр ROS имеет значение true, sourcetime возвращает системное время. Можно создать Time объект с использованием rostime.

Тайм-аут для получения преобразования, заданного как скаляр в секундах. Функция возвращает ошибку, если достигнуто время ожидания, и преобразование не становится доступным.

Выходные аргументы

свернуть все

Преобразование между координатными кадрами, возвращаемое как TransformStamped дескриптор объекта. Преобразования структурированы как 3-D перемещение (трёхэлементный вектор) и 3-D вращение (кватернион).

Вопросы совместимости

развернуть все

Изменение поведения в будущем выпуске

Представлен в R2019b