canTransform

Проверьте, доступно ли преобразование

Синтаксис

isAvailable = canTransform(tftree,targetframe,sourceframe)
isAvailable = canTransform(tftree,targetframe,sourceframe,sourcetime)
isAvailable = canTransform(bagSel,targetframe,sourceframe)
isAvailable = canTransform(bagSel,targetframe,sourceframe,sourcetime)

Описание

пример

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

Проверьте преобразование, которое вы хотите отправить по сети, уже не существует. 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_69912 with NodeURI http://192.168.203.1:55220/

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

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

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

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

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

свернуть все

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

  • sourcetime за буферным окном для объекта tftree.

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

  • sourcetime находится в будущем.

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

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

| | | |

Введенный в R2017b