Main Content

getTransform

2 つの座標系の間の変換を取得

R2019b 以降

説明

TransformationTree オブジェクト

tf = getTransform(tftree,targetframe,sourceframe) は、tftree の 2 つの座標系間の最新の既知の変換を返します。rostf を使用して tftree オブジェクトを作成します。これには、ROS ネットワークに接続する必要があります。

変換は、3 次元並進 (3 要素ベクトル) および 3 次元回転 (四元数) として構造化されます。

tf = getTransform(tftree,targetframe,sourceframe,sourcetime) は、所定のソース時間における tftree からの変換を返します。その時点において変換が使用可能でない場合、この関数はエラーを返します。

tf = getTransform(___,"Timeout",timeout) では、変換が使用可能になるのを待機するタイムアウト期間 (秒) も指定します。タイムアウト期間内に変換が使用可能にならなかった場合、この関数はエラーを返します。前述の構文にある任意の入力引数を指定して、この構文を使用します。

BagSelection オブジェクト

tf = getTransform(bagSel,targetframe,sourceframe) は、bagSel 内の rosbag の 2 つの座標系間の最新の変換を返します。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 の 2 つの座標系間の最新の変換を返します。

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);

オプション: 格納された tform とともに apply を使用して、この変換を 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 を使用して、2 つの座標系の間の変換をクエリします。

rosbag を読み込みます。

bag = rosbag('ros_turtlesim.bag');

使用可能な座標系のリストを取得します。

frames = bag.AvailableFrames;

2 つの座標系の間の最新の変換を取得します。

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 を使用して、2 つの座標系の間の変換をクエリします。

rosbag を読み込みます。

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

           FilePath: '/tmp/Bdoc23b_2355056_2487336/tp109708d3/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'  }

2 つの座標系の間の最新の変換を取得します。

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 オブジェクト ハンドルとして指定します。既定では、sourcetime は、clock トピックでパブリッシュされた ROS シミュレーション時間です。use_sim_time ROS パラメーターを true に設定すると、sourcetime はシステム時間を返します。Time オブジェクトは、rostime を使用して作成できます。

変換受信のタイムアウト。秒単位のスカラーとして指定します。タイムアウトに達したが、変換が使用可能にならなかった場合、この関数はエラーを返します。

変換後の ROS メッセージ形式。特定のタイプのメッセージ "object" または互換性のあるフィールドが含まれたメッセージ "struct" として返されます。"struct" を使用すると、メッセージ "object" を使用するよりも高速になることがあります。

出力引数

すべて折りたたむ

座標系の間の変換。TransformStamped オブジェクト ハンドルとして返されます。変換は、3 次元並進 (3 要素ベクトル) および 3 次元回転 (四元数) として構造化されます。

拡張機能

バージョン履歴

R2019b で導入

すべて展開する