Main Content

canTransform

変換が使用可能かどうかを確認

R2019b 以降

説明

TransformationTree オブジェクト

isAvailable = canTransform(tftree,targetframe,sourceframe) は、tftree の現在時間でソース座標系とターゲット座標系間の変換が使用可能かどうかを確認します。rostf を使用して tftree オブジェクトを作成します。これには、ROS ネットワークに接続する必要があります。

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

オプション: 格納された 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/

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/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'  }

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 または bagSel.AvailableFrames を呼び出すと、変換に使用可能な座標系を表示できます。

初期座標系。string スカラーまたは文字ベクトルとして指定します。tftree.AvailableFrames または bagSel.AvailableFrames を呼び出すと、変換に使用可能な座標系を表示できます。

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

出力引数

すべて折りたたむ

変換が存在するかどうかを示すインジケーター。boolean として返されます。この関数は、以下の場合に false を返します。

  • sourcetimetftree オブジェクトのバッファー ウィンドウの外にある。

  • sourcetimebagSel オブジェクトまたは bagreader オブジェクトの時間外である。

  • sourcetime が未来の時間である。

  • 変換がまだパブリッシュされていない。

拡張機能

バージョン履歴

R2019b で導入