このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

特化した ROS メッセージの操作

一般に使用される ROS メッセージの一部では、次の処理に使用する前に何らかの変換を必要とするような形式でデータが保存されます。MATLAB® は、こうした特化した ROS メッセージを使いやすい形式にする上で役立ちます。この例では、レーザー スキャン、非圧縮イメージと圧縮イメージ、および点群用のメッセージ タイプを処理する方法を調べることができます。

必要条件: 基本的な ROS メッセージの操作

サンプル メッセージの読み込み

まず、この例で使用するサンプル メッセージをいくつか読み込みます。これらのメッセージには、各種のロボット工学センサーから収集されたデータが入力されています。

exampleHelperROSLoadMessages を呼び出してメッセージを読み込みます。

exampleHelperROSLoadMessages

レーザー スキャン メッセージ

レーザー スキャナーは、ロボット工学センサーで広く使用されています。レーザー スキャン メッセージの標準 ROS 形式を確認するには、適切なタイプの空のメッセージを作成します。

rosmessage を使用してメッセージを作成します。

emptyscan = rosmessage('sensor_msgs/LaserScan')
emptyscan = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 Header]
          AngleMin: 0
          AngleMax: 0
    AngleIncrement: 0
     TimeIncrement: 0
          ScanTime: 0
          RangeMin: 0
          RangeMax: 0
            Ranges: [0x1 single]
       Intensities: [0x1 single]

  Use showdetails to show the contents of the message

空のメッセージを作成したため、emptyscan には意味のあるデータがまったく含まれていません。便宜上、関数 exampleHelperROSLoadMessages が、完全に入力されたレーザー スキャン メッセージを読み込み、変数 scan に格納しています。

変数 scan を検査します。メッセージのプライマリ データは Ranges フィールドにあります。Ranges のデータは、小さい角度増分で記録された障害物の距離からなる [640x1] の配列です。

scan
scan = 
  ROS LaserScan message with properties:

       MessageType: 'sensor_msgs/LaserScan'
            Header: [1x1 Header]
          AngleMin: -0.5467
          AngleMax: 0.5467
    AngleIncrement: 0.0017
     TimeIncrement: 0
          ScanTime: 0.0330
          RangeMin: 0.4500
          RangeMax: 10
            Ranges: [640x1 single]
       Intensities: [0x1 single]

  Use showdetails to show the contents of the message

関数readCartesianを使用して、測定点の直交座標を取得できます。

xy = readCartesian(scan);

これは、すべての有効な範囲の読み取りに基づいて計算された [x,y] 座標のリストを返します。関数 plot を使用して、スキャン メッセージを可視化できます。

figure
plot(scan,'MaximumRange',5)

イメージ メッセージ

MATLAB はイメージ メッセージもサポートしています。このメッセージ タイプは常に sensor_msgs/Image です。

rosmessage を使用して空のイメージ メッセージを作成し、イメージ メッセージの標準 ROS 形式を確認します。

emptyimg = rosmessage('sensor_msgs/Image')
emptyimg = 
  ROS Image message with properties:

    MessageType: 'sensor_msgs/Image'
         Header: [1x1 Header]
         Height: 0
          Width: 0
       Encoding: ''
    IsBigendian: 0
           Step: 0
           Data: [0x1 uint8]

  Use showdetails to show the contents of the message

便宜上、関数 exampleHelperROSLoadMessages が、完全に入力されたイメージ メッセージを読み込み、変数 img に格納しています。

ワークスペース内のイメージ メッセージ変数 img を検査します。イメージのサイズは Width プロパティおよび Height プロパティに保存されています。ROS は Data フィールド内の 1 次元配列を使用して実際のイメージ データを送信します。

img
img = 
  ROS Image message with properties:

    MessageType: 'sensor_msgs/Image'
         Header: [1x1 Header]
         Height: 480
          Width: 640
       Encoding: 'rgb8'
    IsBigendian: 0
           Step: 1920
           Data: [921600x1 uint8]

  Use showdetails to show the contents of the message

Data フィールドに格納される生のイメージ データは、MATLAB での処理および可視化に直接使用できません。関数 readImage を使用することで、MATLAB と互換性のある形式でイメージを取得できます。

imageFormatted = readImage(img);

元のイメージのエンコードは 'rgb8' です。既定で、readImage はイメージを標準である 480 x 640 x 3 の uint8 形式で返します。関数 imshow を使用してこのイメージを表示できます。

figure
imshow(imageFormatted)

MATLAB® は ROS のイメージ エンコード形式をすべてサポートし、readImage はイメージ データの複雑な変換を処理します。カラー イメージだけでなく、MATLAB は単色イメージと深度イメージもサポートします。

圧縮メッセージ

多くの ROS システムは、イメージ データを圧縮形式で送信します。MATLAB は、それらの圧縮イメージ メッセージをサポートしています。

rosmessage を使用して、空の圧縮イメージ メッセージを作成します。ROS における圧縮イメージはメッセージ タイプが sensor_msgs/CompressedImage であり、標準構造をもちます。

emptyimgcomp = rosmessage('sensor_msgs/CompressedImage')
emptyimgcomp = 
  ROS CompressedImage message with properties:

    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 Header]
         Format: ''
           Data: [0x1 uint8]

  Use showdetails to show the contents of the message

便宜上、関数 exampleHelperROSLoadMessages が、既に入力された圧縮イメージ メッセージを読み込んでいます。

カメラでキャプチャされた変数 imgcomp を検査します。Format プロパティは、Data に保存されているイメージ データを MATLAB が圧縮解除するために必要な情報をすべてキャプチャします。

imgcomp
imgcomp = 
  ROS CompressedImage message with properties:

    MessageType: 'sensor_msgs/CompressedImage'
         Header: [1x1 Header]
         Format: 'bgr8; jpeg compressed bgr8'
           Data: [30376x1 uint8]

  Use showdetails to show the contents of the message

イメージ メッセージと同様に、readImage を使用して標準の RGB 形式でイメージを取得できます。この圧縮イメージの元のエンコードは bgr8 ですが、readImage が変換を実行します。

compressedFormatted = readImage(imgcomp);

関数 imshow を使用して、イメージを可視化できます。

figure
imshow(compressedFormatted)

ほとんどのイメージ形式は、圧縮イメージ メッセージ タイプでサポートされています。'16UC1' および '32FC1' のエンコードは、圧縮深度イメージではサポートされません。単色イメージとカラー イメージのエンコードはサポートされています。

点群

点群は、LIDAR、Kinect®、ステレオ カメラなど、ロボット工学で使用されるさまざまなセンサーでキャプチャできます。ROS で点群の送信に最もよく使用されるメッセージ タイプは sensor_msgs/PointCloud2 であり、MATLAB はこのデータの操作に特化した関数をいくつか提供しています。

適切なタイプの空のメッセージを作成して、点群メッセージの標準的な ROS 形式を確認できます。

emptyptcloud = rosmessage('sensor_msgs/PointCloud2')
emptyptcloud = 
  ROS PointCloud2 message with properties:

    PreserveStructureOnRead: 0
                MessageType: 'sensor_msgs/PointCloud2'
                     Header: [1x1 Header]
                     Height: 0
                      Width: 0
                IsBigendian: 0
                  PointStep: 0
                    RowStep: 0
                    IsDense: 0
                     Fields: [0x1 PointField]
                       Data: [0x1 uint8]

  Use showdetails to show the contents of the message

ワークスペースの変数 ptcloud に格納されている入力済みの点群メッセージを表示します。

ptcloud
ptcloud = 
  ROS PointCloud2 message with properties:

    PreserveStructureOnRead: 0
                MessageType: 'sensor_msgs/PointCloud2'
                     Header: [1x1 Header]
                     Height: 480
                      Width: 640
                IsBigendian: 0
                  PointStep: 32
                    RowStep: 20480
                    IsDense: 0
                     Fields: [4x1 PointField]
                       Data: [9830400x1 uint8]

  Use showdetails to show the contents of the message

この点群の情報は、メッセージの Data フィールドにエンコードされています。関数 readXYZ を呼び出すことで、[x,y,z] 座標を N 行 3 列の行列として抽出できます。

xyz = readXYZ(ptcloud)
xyz = 307200x3 single matrix

   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
   NaN   NaN   NaN
      ⋮

点群データの NaN は、[x,y,z] 値の一部が無効であることを示しています。この例で、これは Kinect® センサーのアーティファクトであり、すべての NaN 値を安全に削除できます。

xyzvalid = xyz(~isnan(xyz(:,1)),:)
xyzvalid = 193359x3 single matrix

    0.1378   -0.6705    1.6260
    0.1409   -0.6705    1.6260
    0.1433   -0.6672    1.6180
    0.1464   -0.6672    1.6180
    0.1502   -0.6705    1.6260
    0.1526   -0.6672    1.6180
    0.1556   -0.6672    1.6180
    0.1587   -0.6672    1.6180
    0.1618   -0.6672    1.6180
    0.1649   -0.6672    1.6180
      ⋮

一部の点群センサーは、RGB カラー値も点群の各点に割り当てます。このようなカラー値が存在する場合、readRGB を呼び出して取得することができます。

rgb = readRGB(ptcloud)
rgb = 307200×3

    0.8392    0.7059    0.5255
    0.8392    0.7059    0.5255
    0.8392    0.7137    0.5333
    0.8392    0.7216    0.5451
    0.8431    0.7137    0.5529
    0.8431    0.7098    0.5569
    0.8471    0.7137    0.5569
    0.8549    0.7098    0.5569
    0.8588    0.7137    0.5529
    0.8627    0.7137    0.5490
      ⋮

関数 scatter3 を使用して点群を可視化できます。scatter3 は自動的に [x,y,z] 座標と RGB カラー値 (存在する場合) を抽出し、3 次元散布図に表示します。関数 scatter3 は、点の RGB 値が存在する場合でも、NaN[x,y,z] 座標をすべて無視します。

figure
scatter3(ptcloud)