Main Content

readMessages

rosbag からのメッセージの読み取り

説明

msgs = readMessages(bag) は、BagSelection または rosbagreader オブジェクト bag 内のすべてのメッセージからデータを返します。メッセージは、メッセージの cell 配列で返されます。BagSelection オブジェクトを取得するには、rosbag を使用します。

msgs = readMessages(bag,rows) は、rows で指定されている行内のメッセージからデータを返します。行の範囲は [1, bag.NumMessages] です。

msgs = readMessages(___,"DataFormat",Format) は、前述のいずれかの入力引数セットを使用して、構造体の cell 配列、またはメッセージ オブジェクトの cell 配列としてデータを返します。Format"struct" または "object" として指定します。

構造体を使用したほうが、メッセージ オブジェクトを使用する場合より大幅に時間を短縮できます。また、カスタム メッセージ データは、rosgenmsg を使用してメッセージの定義を読み込むことなく、直接読み取ることができます。

メモ

将来のリリースでは、ROS Toolbox は ROS メッセージ用のオブジェクトではなくメッセージ構造体を使用します。

現時点でメッセージ構造体を使用する場合、名前と値の引数 "DataFormat""struct" に設定します。詳細については、ROS メッセージ構造体を参照してください。

すべて折りたたむ

rosbag を読み込んで、トピックと時間でフィルター処理します。

bagselect = rosbag('ex_multiple_topics.bag');
bagselect2 = select(bagselect,'Time',...
[bagselect.StartTime bagselect.StartTime + 1],'Topic','/odom');

すべてのメッセージを cell 配列として返します。

allMsgs = readMessages(bagselect2);

最初の 10 個のメッセージを cell 配列として返します。

firstMsgs = readMessages(bagselect2,1:10);

rosbag を読み込みます。

bag = rosbag('ros_turtlesim.bag');

特定のトピックを選択します。

bSel = select(bag,'Topic','/turtle1/pose');

メッセージを構造体として読み取ります。メッセージを読み取るときに、名前と値のペア DataFormat を指定します。返された構造体の cell 配列で、最初の構造体を検査します。

msgStructs = readMessages(bSel,'DataFormat','struct');
msgStructs{1}
ans = struct with fields:
        MessageType: 'turtlesim/Pose'
                  X: 5.5016
                  Y: 6.3965
              Theta: 4.5377
     LinearVelocity: 1
    AngularVelocity: 0

メッセージから xy 点を抽出し、ロボットの軌跡をプロットします。

cellfun を使用して、構造体から X フィールドおよび Y フィールドをすべて抽出します。これらのフィールドは、rosbag 記録時にロボットの xy 位置を表します。

xPoints = cellfun(@(m) double(m.X),msgStructs);
yPoints = cellfun(@(m) double(m.Y),msgStructs);
plot(xPoints,yPoints)

Figure contains an axes object. The axes object contains an object of type line.

rosbag ログ ファイルを読み込み、選択した条件に基づいて特定のメッセージを解析します。

rosbag ログ ファイルにあるすべてのメッセージの rosbagreader オブジェクトを作成します。

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

           FilePath: '/mathworks/devel/bat/Bdoc22a/build/matlab/toolbox/robotics/robotexamples/ros/data/bags/ros_multi_topics.bag'
          StartTime: 201.3400
            EndTime: 321.3400
        NumMessages: 36963
    AvailableTopics: [4x3 table]
    AvailableFrames: {0x1 cell}
        MessageList: [36963x4 table]

メッセージのサブセットを、タイムスタンプとトピックに基づいて選択します。

bagMsgs2 = select(bagMsgs,...
    Time=[bagMsgs.StartTime bagMsgs.StartTime + 1],...
    Topic='/odom')
bagMsgs2 = 
  rosbagreader with properties:

           FilePath: '/mathworks/devel/bat/Bdoc22a/build/matlab/toolbox/robotics/robotexamples/ros/data/bags/ros_multi_topics.bag'
          StartTime: 201.3400
            EndTime: 202.3200
        NumMessages: 99
    AvailableTopics: [1x3 table]
    AvailableFrames: {0x1 cell}
        MessageList: [99x4 table]

選択内容にあるメッセージを cell 配列として取得します。

msgs = readMessages(bagMsgs2)
msgs=99×1 cell array
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
    {1x1 Odometry}
      ⋮

特定のメッセージ プロパティを時系列として返します。

ts = timeseries(bagMsgs2,...
    'Pose.Pose.Position.X', ...
    'Twist.Twist.Angular.Y')
  timeseries

  Timeseries contains duplicate times.

  Common Properties:
            Name: '/odom Properties'
            Time: [99x1 double]
        TimeInfo: tsdata.timemetadata
            Data: [99x2 double]
        DataInfo: tsdata.datametadata

入力引数

すべて折りたたむ

rosbag のメッセージのインデックス。BagSelection または rosbagreader オブジェクトとして指定します。

BagSelection または rosbagreader オブジェクトの行。n 要素ベクトルとして指定します。ここで n は、メッセージの取得元の行数です。ベクトルの各エントリは、bag 内の番号付きメッセージにそれぞれ対応します。行の範囲は [1, bag.NumMessage] です。

出力引数

すべて折りたたむ

ROS メッセージ データ。オブジェクト、メッセージ オブジェクトの cell 配列、または構造体の cell 配列として返されます。データは、rosbag を使用して作成された BagSelection オブジェクト、または rosbagreader オブジェクトから取得されます。

構造体の cell 配列としてメッセージを取得するには、関数内で "DataFormat","struct" を指定しなければなりません。構造体を使用したほうが、メッセージ オブジェクトを使用する場合より大幅に時間を短縮できます。また、カスタム メッセージ データは、rosgenmsg を使用してメッセージの定義を読み込むことなく、直接読み取ることができます。

バージョン履歴

R2019b で導入

すべて展開する

将来のリリースで動作変更