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 в rosbag в 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 array
    {'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 запрашивать преобразование между двумя координатными системами координат.

Загрузите rosbag.

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 время симуляции ROS, опубликованное на clock тема. Если use_sim_time Параметр ROS устанавливается на true, sourcetime возвращает системное время. Можно создать Time объект с помощью rostime.

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

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

свернуть все

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

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

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

Изменение поведения в будущем релизе

Смотрите также

| | | |

Введенный в R2019b