readMessages
説明
は、前述のいずれかの入力引数セットを使用して、構造体の cell 配列、またはメッセージ オブジェクトの cell 配列としてデータを返します。msgs
= readMessages(___,"DataFormat",Format)Format
は "struct"
または "object"
として指定します。
構造体を使用したほうが、メッセージ オブジェクトを使用する場合より大幅に時間を短縮できます。また、カスタム メッセージ データは、rosgenmsg
を使用してメッセージの定義を読み込むことなく、直接読み取ることができます。
メモ
将来のリリースでは、ROS Toolbox は ROS メッセージ用のオブジェクトではなくメッセージ構造体を使用します。
現時点でメッセージ構造体を使用する場合、名前と値の引数 "DataFormat"
を "struct"
に設定します。詳細については、ROS メッセージ構造体を参照してください。
例
ROS メッセージを cell 配列として返す
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 からの構造体としてのメッセージの読み取り
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)
rosbagreader
オブジェクトを使用した rosbag の選択の作成
rosbag ログ ファイルを読み込み、選択した条件に基づいて特定のメッセージを解析します。
rosbag ログ ファイルにあるすべてのメッセージの rosbagreader
オブジェクトを作成します。
bagMsgs = rosbagreader("ros_multi_topics.bag")
bagMsgs = rosbagreader with properties: FilePath: '/mathworks/devel/bat/Bdoc23b/build/matlab/examples/ros/data/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/Bdoc23b/build/matlab/examples/ros/data/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
入力引数
bag
— rosbag のメッセージのインデックス
BagSelection
オブジェクト | rosbagreader
オブジェクト
rosbag のメッセージのインデックス。BagSelection
または rosbagreader
オブジェクトとして指定します。
rows
— BagSelection
または rosbagreader
オブジェクトの行
n 要素ベクトル
BagSelection
または rosbagreader
オブジェクトの行。n 要素ベクトルとして指定します。ここで n は、メッセージの取得元の行数です。ベクトルの各エントリは、bag 内の番号付きメッセージにそれぞれ対応します。行の範囲は [1, bag.NumMessage
] です。
出力引数
msgs
— ROS メッセージ データ
オブジェクト | メッセージ オブジェクトの cell 配列 | 構造体の cell 配列
ROS メッセージ データ。オブジェクト、メッセージ オブジェクトの cell 配列、または構造体の cell 配列として返されます。データは、rosbag
を使用して作成された BagSelection
オブジェクト、または rosbagreader
オブジェクトから取得されます。
構造体の cell 配列としてメッセージを取得するには、関数内で "DataFormat","struct"
を指定しなければなりません。構造体を使用したほうが、メッセージ オブジェクトを使用する場合より大幅に時間を短縮できます。また、カスタム メッセージ データは、rosgenmsg
を使用してメッセージの定義を読み込むことなく、直接読み取ることができます。
バージョン履歴
R2019b で導入R2021a: ROS メッセージ構造体
これで、メッセージ オブジェクトのプロパティと一致するフィールドをもつ構造体としてメッセージを作成できます。通常、構造体を利用すると ROS メッセージの作成、更新、使用のパフォーマンスが向上しますが、設定時にメッセージのフィールドが検証されなくなります。メッセージ タイプと、構造体から取得した対応するフィールド値は、ネットワーク経由で送信されたときに検証されます。
ROS メッセージを構造体として使用するには、パブリッシャー、サブスクライバー、またはその他の ROS オブジェクトの作成時に名前と値の引数 "DataFormat"
を使用します。これらのオブジェクトから生成されたすべてのメッセージで構造体が利用されます。
pub = rospublisher("/scan","sensor_msgs/LaserScan","DataFormat","struct") msg = rosmessage(pub)
また、メッセージを直接構造体として作成することもできますが、パブリッシャー、サブスクライバー、またはその他の ROS オブジェクトについても必ずデータ形式を "struct"
として指定してください。現時点では、ROS オブジェクトは既定でメッセージ オブジェクトを使用します。
msg = rosmessage("/scan","sensor_msgs/LaserScan","DataFormat","struct") ... pub = rospublisher("/scan","sensor_msgs/LaserScan","DataFormat","struct")
将来のリリースでは、ROS メッセージは既定で構造体を使用し、ROS メッセージ オブジェクトは削除されます。
詳細については、Improve Performance of ROS Using Message Structuresを参照してください。
参考
select
| rosbag
| timeseries
| rosbagreader
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)