Main Content

getTransform

두 좌표 프레임 간의 변환 가져오기

R2019b 이후

설명

TransformationTree 객체

tf = getTransform(tftree,targetframe,sourceframe)tftree에서 두 좌표 프레임 간의 가장 최신의 알려진 변환을 반환합니다. rostf를 사용하여, ROS 네트워크에 연결해야 하는 tftree 객체를 생성합니다.

변환은 3차원 평행 이동(요소를 3개 가진 벡터)과 3차원 회전(쿼터니언)으로 구성됩니다.

tf = getTransform(tftree,targetframe,sourceframe,sourcetime)은 주어진 소스 시간에서의 tftree로부터 변환을 반환합니다. 해당 시간에 변환이 사용 가능하지 않을 경우 함수는 오류를 반환합니다.

예제

tf = getTransform(___,"Timeout",timeout)은 변환이 사용 가능해질 때까지 기다릴 수 있는 제한 시간도 지정합니다(단위: 초). 제한 시간 내에 변환이 사용 가능하지 않으면 함수는 오류를 반환합니다. 이 구문을 위에 열거된 구문의 입력 인수와 함께 사용하십시오.

BagSelection 객체

예제

tf = getTransform(bagSel,targetframe,sourceframe)bagSel의 rosbag에서 두 프레임 간의 최신 변환을 반환합니다. bagSel 입력을 받으려면 rosbag을 사용하여 rosbag을 불러옵니다.

tf = getTransform(bagSel,targetframe,sourceframe,sourcetime)bagSel의 rosbag에 지정된 sourcetime에서의 변환을 반환합니다.

tf = getTransform(___,"DataFormat","struct")는 ROS geometry_msgs/TransformStamped 메시지를 지정된 형식으로 반환합니다.

rosbagreader 객체

예제

tf = getTransform(bagreader,targetframe,sourceframe)bagreader의 rosbag에서 두 프레임 간의 최신 변환을 반환합니다.

tf = getTransform(bagreader,targetframe,sourceframe,sourcetime)bagreader의 rosbag에 지정된 sourcetime에서의 변환을 반환합니다.

tf = getTransform(___,"DataFormat","struct")는 ROS geometry_msgs/TransformStamped 메시지를 지정된 형식으로 반환합니다.

예제

모두 축소

이 예제에서는 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);

선택 사항: 저장된 tformapply를 함께 사용하여 이 변환을 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 함수는 변환이 사용 가능할 때까지 기다립니다. 제한 시간을 지정하여 변환을 찾을 수 없으면 오류를 반환하도록 할 수도 있습니다. 아래 예시는 지금으로부터 3초 후의 변환이 사용 가능해질 때까지 5초간 기다립니다.

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을 불러온 다음 사용할 수 있는 프레임을 확인하여 rosbag (.bag) 파일에서 변환을 가져옵니다. 이 프레임에서 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

rosbag을 불러온 다음 사용할 수 있는 프레임을 확인하여 rosbag (.bag) 파일에서 변환을 가져옵니다. 이 프레임에서 getTransform 함수를 사용하여 두 좌표 프레임 간의 변환을 쿼리합니다.

rosbag을 불러옵니다.

bagMsgs = rosbagreader("ros_turtlesim.bag")
bagMsgs = 
  rosbagreader with properties:

           FilePath: '/tmp/Bdoc24a_2550221_3969607/tpf133032d/ros-ex81142742/ros_turtlesim.bag'
          StartTime: 1.5040e+09
            EndTime: 1.5040e+09
        NumMessages: 6089
    AvailableTopics: [6x3 table]
    AvailableFrames: {2x1 cell}
        MessageList: [6089x4 table]

사용할 수 있는 프레임의 목록을 가져옵니다.

frames = bagMsgs.AvailableFrames
frames = 2x1 cell
    {'turtle1'}
    {'world'  }

두 좌표 프레임 간의 최근 변환을 가져옵니다.

tf = getTransform(bagMsgs,'world',frames{1})
tf = 
  ROS TransformStamped message with properties:

     MessageType: 'geometry_msgs/TransformStamped'
          Header: [1x1 Header]
       Transform: [1x1 Transform]
    ChildFrameId: 'turtle1'

  Use showdetails to show the contents of the message

특정 시간에 사용할 수 있는 변환을 확인하고 해당 변환을 가져옵니다. 사용할 수 있는 변환을 검사하기 위해 canTransform을 사용합니다. rostime 함수를 사용하여 시간을 지정합니다.

tfTime = rostime(bagMsgs.StartTime + 1);
if (canTransform(bagMsgs,'world',frames{1},tfTime))
    tf2 = getTransform(bagMsgs,'world',frames{1},tfTime);
end

입력 인수

모두 축소

ROS 변환 트리로, TransformationTree 객체로 지정됩니다. rostf 함수를 호출하여 변환 트리를 생성할 수 있습니다.

rosbag 메시지 선택으로, BagSelection 객체로 지정됩니다. rosbag 메시지 선택을 생성하려면 rosbag을 사용합니다.

rosbag의 메시지 인덱스로, rosbagreader 객체로 지정됩니다.

타깃 좌표 프레임으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. tftree.AvailableFrames를 호출하여 변환에 사용 가능한 프레임을 볼 수 있습니다.

초기 좌표 프레임으로, string형 스칼라 또는 문자형 벡터로 지정됩니다. tftree.AvailableFrames를 호출하여 변환에 사용 가능한 프레임을 볼 수 있습니다.

현재 ROS 시간 또는 시스템 시간으로, Time 객체 핸들로 지정됩니다. 기본적으로 sourcetimeclock 토픽에 퍼블리시된 ROS 시뮬레이션 시간입니다. use_sim_time ROS 파라미터를 true로 설정하면 sourcetime은 시스템 시간을 반환합니다. Time 객체는 rostime을 사용하여 만들 수 있습니다.

변환 정보를 받기까지의 제한 시간으로, 스칼라로 지정됩니다(단위: 초). 제한 시간에 도달할 때까지 변환이 사용 가능하지 않으면 함수는 오류를 반환합니다.

변환된 ROS 메시지 형식으로, 특정 유형의 메시지 "object" 또는 호환 가능한 필드를 갖는 메시지 "struct"로 반환됩니다. "struct"를 사용하는 것이 메시지 "object"를 사용하는 것보다 더 빠를 수 있습니다.

출력 인수

모두 축소

좌표 프레임 간의 변환으로, TransformStamped 객체 핸들로 반환됩니다. 변환은 3차원 평행 이동(요소를 3개 가진 벡터)과 3차원 회전(쿼터니언)으로 구성됩니다.

확장 기능

버전 내역

R2019b에 개발됨

모두 확장