getTransform

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

Поведение getTransform изменяется в R2018a. При использовании входного параметра tftree функция больше не возвращает пустое преобразование, когда преобразование недоступно, и никакой sourcetime не задан. Если getTransform ожидает заданного периода тайм-аута, и преобразование все еще не доступно, функция возвращает ошибку. Период тайм-аута 0 по умолчанию.

Синтаксис

tf = getTransform(tftree,targetframe,sourceframe)
tf = getTransform(tftree,targetframe,sourceframe,sourcetime)
tf = getTransform(___,"Timeout",timeout)
tf = getTransform(bagSel,targetframe,sourceframe)
tf = getTransform(bagSel,targetframe,sourceframe,sourcetime)

Описание

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.203.129';
rosinit(ipaddress)
tftree = rostf;
pause(1)
Initializing global node /matlab_global_node_60416 with NodeURI http://192.168.203.1:53781/

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

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'        }
    {'pole_top_0_link'           }
    {'pole_top_1_link'           }
    {'pole_top_2_link'           }
    {'pole_top_3_link'           }
    {'wheel_left_link'           }
    {'wheel_right_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_60416 with NodeURI http://192.168.203.1:53781/

Этот пример показывает как преобразованиям с буфером времени доступа в сети ROS. Доступ к преобразованиям в течение определенных времен и изменяет свойство BufferTime на основе ваших желаемых времен.

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

ipaddress = '192.168.203.129';
rosinit(ipaddress)
tftree = rostf;
pause(2);
Initializing global node /matlab_global_node_29163 with NodeURI http://192.168.203.1:53691/

Получите преобразование от 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_29163 with NodeURI http://192.168.203.1:53691/

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

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

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

свернуть все

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

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

| | | |

Представленный в R2015a