Main Content

canTransform

사용 가능한 변환 확인

R2019b 이후

설명

TransformationTree 객체

예제

isAvailable = canTransform(tftree,targetframe,sourceframe)은 소스 프레임과 타깃 프레임 사이의 변환이 tftree에서 현재 시간에 사용 가능한지 확인합니다. rostf를 사용하여, ROS 네트워크에 연결해야 하는 tftree 객체를 생성합니다.

isAvailable = canTransform(tftree,targetframe,sourceframe,sourcetime)은 소스 시간에 변환이 사용 가능한지 확인합니다. sourcetime이 버퍼 윈도우를 벗어난 경우 함수는 false를 반환합니다.

BagSelection 객체

예제

isAvailable = canTransform(bagSel,targetframe,sourceframe)bagSel의 rosbag에서 변환이 사용 가능한지 확인합니다. bagSel 입력을 받으려면 rosbag을 사용하여 rosbag을 불러옵니다.

isAvailable = canTransform(bagSel,targetframe,sourceframe,sourcetime)은 소스 시간에 rosbag에서 변환이 사용 가능한지 확인합니다. sourcetime이 버퍼 윈도우를 벗어난 경우 함수는 false를 반환합니다.

rosbagreader 객체

isAvailable = canTransform(bagreader,targetframe,sourceframe)bagreader의 rosbag에서 변환이 사용 가능한지 확인합니다.

예제

isAvailable = canTransform(bagreader,targetframe,sourceframe,sourcetime)은 소스 시간에 rosbag에서 변환이 사용 가능한지 확인합니다. sourcetime이 버퍼 윈도우를 벗어난 경우 함수는 false를 반환합니다.

예제

모두 축소

이 예제에서는 변환을 생성하고 ROS 네트워크를 통해 변환을 보내는 방법을 보여줍니다.

ROS 변환 트리를 생성합니다. rosinit를 사용하여 ROS 네트워크에 연결합니다. ipaddress를 ROS 네트워크 주소로 바꿉니다.

rosinit;
Launching ROS Core...
....Done in 4.1192 seconds.
Initializing ROS master on http://192.168.125.1:56090.
Initializing global node /matlab_global_node_16894 with NodeURI http://HYD-KVENNAPU:63122/
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.X = 0.5;
tform.Transform.Rotation.Y = 0.5;
tform.Transform.Rotation.Z = 0.5;
tform.Transform.Rotation.W = 0.5;

ROS 네트워크를 통해 변환을 보냅니다.

sendTransform(tftree,tform)

이제 변환이 ROS 네트워크에 있는지 확인합니다.

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

ROS 네트워크를 종료합니다.

rosshutdown
Shutting down global node /matlab_global_node_16894 with NodeURI http://HYD-KVENNAPU:63122/
Shutting down ROS master on http://192.168.125.1:56090.

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

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_2511836_3360848/tpe1f56baf/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 또는 bagSel.AvailableFrames를 호출하여 변환에 사용 가능한 프레임을 볼 수 있습니다.

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

ROS 시간 또는 시스템 시간으로, 스칼라 또는 Time 객체 핸들로 지정됩니다. 스칼라 입력은 rostime을 사용하여 Time 객체로 변환됩니다.

출력 인수

모두 축소

변환이 존재하는지를 나타내는 표시자로, 부울로 반환됩니다. 다음과 같은 경우 함수는 false를 반환합니다.

  • sourcetimetftree 객체의 버퍼 윈도우를 벗어납니다.

  • sourcetimebagSel 객체 또는 bagreader 객체의 시간을 벗어납니다.

  • sourcetime이 미래의 시간입니다.

  • 변환이 아직 퍼블리시되지 않았습니다.

확장 기능

버전 내역

R2019b에 개발됨