exponenta event banner

canTransform

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

Описание

пример

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

isAvailable = canTransform(tftree,targetframe,sourceframe,sourcetime) проверяет доступность преобразования для исходного времени. Если sourcetime находится вне окна буфера, функция возвращает false.

пример

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

isAvailable = canTransform(bagSel,targetframe,sourceframe,sourcetime) проверяет доступность преобразования в rosbag для исходного времени. Если sourcetime находится вне окна буфера, функция возвращает false.

Примеры

свернуть все

В этом примере показано, как создать преобразование и отправить его по сети ROS.

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

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

Убедитесь, что преобразование, которое требуется отправить по сети, еще не существует. canTransform возвращает false, если преобразование недоступно немедленно.

canTransform(tftree,'new_frame','base_link')
ans = logical
   0

Создать TransformStamped сообщение. Заполните поля сообщений информацией о преобразовании.

tform = rosmessage('geometry_msgs/TransformStamped');
tform.ChildFrameId = 'new_frame';
tform.Header.FrameId = 'base_link';
tform.Transform.Translation.X = 0.5;
tform.Transform.Rotation.Z = 0.75;

Передача преобразования по сети ROS.

sendTransform(tftree,tform)

Убедитесь, что преобразование теперь находится в сети ROS.

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

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

rosshutdown
Shutting down global node /matlab_global_node_33798 with NodeURI http://192.168.17.1:56771/

В этом примере показано, как настроить дерево преобразования 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/

Получить преобразования из 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 или bagSel.AvailableFrames.

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

ROS или системное время, указанное как скаляр или Time дескриптор объекта. Скалярный вход преобразуется в Time объект с использованием rostime.

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

свернуть все

Индикатор, если преобразование существует, возвращается как логическое значение. Функция возвращает значение false, если:

  • sourcetime находится вне окна буфера для tftree объект.

  • sourcetime находится вне времени bagSel объект.

  • sourcetime в будущем.

  • Преобразование еще не опубликовано.

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