Main Content

transform

メッセージ エンティティからターゲット座標系への変換

R2019b 以降

説明

tfentity = transform(tftree,targetframe,entity) は、targetframeentity の座標系間の最新の変換を取得し、特定のタイプの ROS メッセージ entity に適用します。tftree は、エンティティ間の既知の変換を含む変換ツリー全体です。entity から targetframe への変換が存在しない場合、MATLAB® ではエラーが発生します。

tfentity = transform(tftree,targetframe,entity,"msgtime") は、メッセージ entity のヘッダーのタイムスタンプをソース時間として使用し、変換を取得して適用します。

tfentity = transform(tftree,targetframe,entity,sourcetime) は、指定されたソース時間を使用し、変換を取得してメッセージ entity に適用します。

すべて折りたたむ

この例では、変換ツリー情報に基づいて 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/

入力引数

すべて折りたたむ

ROS 変換ツリー。TransformationTree オブジェクト ハンドルとして指定します。変換ツリーは、関数 rostf を呼び出すことによって作成できます。

エンティティの変換先のターゲット座標系。string スカラーまたは文字ベクトルとして指定します。tftree.AvailableFrames を呼び出すと、変換に使用可能な座標系を表示できます。

初期メッセージ エンティティ。Message オブジェクト ハンドルとして指定します。

サポートされているメッセージは次のとおりです。

  • geometry_msgs/PointStamped

  • geometry_msgs/PoseStamped

  • geometry_msgs/QuaternionStamped

  • geometry_msgs/Vector3Stamped

  • sensor_msgs/PointCloud2

ROS 時間またはシステム時間。スカラーまたは Time オブジェクト ハンドルとして指定します。スカラーは、rostime を使用して Time オブジェクトに変換されます。

出力引数

すべて折りたたむ

変換後のエンティティ。Message オブジェクト ハンドルとして返されます。

拡張機能

バージョン履歴

R2019b で導入