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
    {'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 секунды с этого момента. The 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);

Вы также можете получить преобразования за раз в будущем. The 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