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

Simulink® での ROS メッセージの操作

この例では、入れ子にされたサブメッセージや可変長配列をもつメッセージなど、複雑な ROS メッセージを Simulink で操作する方法を説明します。

はじめに

ROS メッセージは Simulink 内でバス信号として表されます。ROS メッセージの各フィールドは、Simulink バスの対応するフィールドにマッピングされますが、以下の制限があります。

  • 定数はサポートされず、Simulink バスから除外されます。

  • 64 ビット整数 (ROS の int64 型および uint64 型) は Simulink バスで double に変換されます。これは、Simulink が 64 ビット整数データ型をネイティブにサポートしないためです。

  • 可変長配列 (ROS の ...[] 型) は、カスタマイズ可能な最大長をもつ固定長配列に変換されます。既定で、プリミティブ型 (uint8[]float32[] など) の固定長は 128 で、入れ子にされたメッセージの配列 (geometry_msgs/Point[] など) の固定長は 16 です。

  • string (ROS の string 型) は、カスタマイズ可能な最大長をもつ固定長の uint8 配列に変換され、その既定の最大長は 128 文字です。

  • string 配列 (ROS の string[] 型) は、カスタマイズ可能な最大長をもつ固定長配列 std_msgs/String に変換されます。既定の最大長は 16 個の string です。

Simulink バスが ROS メッセージに変換されるときに、メッセージ フィールドはネイティブの ROS の型に復元されます。たとえば、ROS メッセージ タイプ std_msgs/Header には FrameId フィールドがあり、これは string です。対応する Simulink バスの FrameId フィールドは、uint8 配列です。バスを ROS メッセージに変換すると、FrameId は string に戻ります。

モデル

以下のモデルには、複雑な ROS メッセージを Simulink で操作する例がいくつか含まれています。この例における以降のタスクでは、特定のシナリオに焦点を絞ります。

open_system('robotROSMessageUsageExample');

タスク 1 - 可変長配列内のデータへのアクセス

ROS メッセージは、長さ (要素数) が未決定の配列を含むことができます。たとえば、sensor_msgs/JointState メッセージの Position フィールドは、64 ビットの浮動小数点数からなる可変長配列です。任意の sensor_msgs/JointState メッセージ内で、Position 配列は要素をまったくもたないことも、任意の多数の要素をもつこともできます。Simulink では、そうした配列には最大長を設ける必要があります。

このタスクでは、ROS メッセージ内の可変長配列が Simulink でどのように処理されるかを調べます。

1.モデル例を開き、Work with Variable-length Arrays サブシステムをダブルクリックします。Subscribe ブロックは、トピック "my_joint_topic" に送信された "sensor_msgs/JointState" タイプのメッセージを受信するように構成されている点に注意してください。

open_system('robotROSMessageUsageExample/Work with Variable-length Arrays');

2.[シミュレーション]、[ブロック線図の更新] をクリックしてから、Bus Selector ブロックをダブルクリックします。メッセージには 3 つの可変長配列 (PositionVelocity、および Effort) があります。バスに Position_SL_Info フィールドがあることを確認します。

  • Position_SL_Info.ReceivedLength は、受信した元の ROS メッセージ内にある配列 Position の長さを保持します。この値は任意の大きさをとることができます。

  • Position_SL_Info.CurrentLength は、Simulink バス信号内の配列 Position の長さを保持します。これは、0 から配列の最大長 (この場合は 128) までの値をとることができます。

3.[ツール]、[ROS]、[Configure Network Addresses] をクリックし、ROS マスターとノード ホストのネットワークアドレスを [Default] に設定します。

4.MATLAB® コマンド ラインで rosinit と入力します。

5.シミュレーション終了時間を inf に設定し、[再生] ボタンをクリックしてシミュレーションを開始します。

6.MATLAB コマンド ラインで、以下を実行します。

[pub, msg] = rospublisher('/my_joint_state', 'sensor_msgs/JointState');
msg.Position = [11:2:25]; % array of length 8
send(pub, msg);
  • Simulink モデルで、Work with Variable-length Arrays サブシステムの Display 出力を確認します。Current Length と Received Length は等しくなっていることに注意してください。

7.MATLAB コマンド ラインで、以下を実行します。

msg.Position = 1:130; % array of length 130
send(pub, msg);
  • 切り捨てが行われたことを示す警告が出力されることを確認します。Simulink モデルで、Received Length が現在 130 で、Current Length が 128 であることを確認します。

  • メッセージが対話的に送信されているため、コマンド ラインに切り捨ての警告が表示されます。通常、これらの警告は Simulink 診断ビューアーに送られます (診断の表示 (Simulink)を参照)。

タスク 2 - 可変長配列の最大サイズの変更

このタスクでは、Simulink で可変長配列の最大サイズを変更します。タスク 1 で説明したように、sensor_msgs/JointState メッセージ タイプ内の配列 Position の既定の最大サイズは 128 です。この制限を 256 に変更します。

1.モデル例を開き、Work with Variable-length Arrays サブシステムをダブルクリックします。

2.[ツール]、[Robot Operating System]、[Manage Array Sizes] をクリックします。

3.左のリストボックスで sensor_msgs/JointState をクリックします。次に、[Use default limits for this message type] のチェック ボックスをオフにします。最後に、配列プロパティ Position の行に新しい値 (256) を入力し、[OK] をクリックしてダイアログを閉じます。

4.Simulink の [再生] ボタンをクリックしてシミュレーションを開始します。

5.以下をコピーして MATLAB コマンド ラインに貼り付けます。警告が出力されないことを確認します。

msg.Position = 1:200; % array of length 200
send(pub, msg);

6.以下をコピーして MATLAB コマンド ラインに貼り付けます。警告が出力されることを確認します。

msg.Position = 1:300; % array of length 300
send(pub, msg);

7.保存せずにモデルを閉じます。

メモ:

  • 最大サイズの情報は、sensor_msgs/JointState メッセージ タイプのすべてのインスタンスに適用されます。たとえば、モデル内で使用されている他のメッセージに sensor_msgs/JointState メッセージが含まれている場合、更新された制限値 256 はそのようなすべての入れ子にされたインスタンスにも適用されます。

  • 最大サイズの情報はモデル固有であり、モデルと共に保存されます。2 つのモデルを開いて、sensor_msgs/JointState を一方のモデルでは既定の制限値 128 で使用し、もう一方のモデルではカスタム制限値 256 で使用することができます。

タスク 3 - MATLAB Function ブロックによるメッセージの操作

Simulink の Bus Assignment ブロックは、バス配列内の要素への代入をサポートしていません。

たとえば、geometry_msgs/PoseArray メッセージの Poses プロパティは、geometry_msgs/Pose メッセージの配列でなければなりません。配列 Poses の特定要素への代入を行う場合、Bus Assignment ブロックでは実行できません。

このタスクでは、入れ子にされたメッセージの代入など、高度なメッセージ操作に MATLAB Function ブロックを使用する方法を調べます。

1.モデル例を開きます。Work with Nested Arrays of Messages サブシステムを選択し、[編集]、[コピー] を選択します。

2.新しい Simulink モデルを開きます。[編集]、[貼り付け] を選択します。一時的な場所に新しいモデルを FunctionTest.slx という名前で保存します。

3.すべてのモデルを閉じ、clear と入力してベース ワークスペースをクリアします。

4.FunctionTest.slx モデルを開き、Work with Nested Arrays of Messages サブシステムをダブルクリックしてから、MATLAB Function - Assign ブロックを開きます。入れ子にされた配列内で値を代入するために MATLAB の表記法が使用されていることを確認します。

5.Function ブロックでは、バス出力のデータ型 (この場合は msg) が明示的に指定されなければなりません。まず、MATLAB コマンド ラインに以下を入力して、このモデルに必要なすべてのバスを作成します。バス オブジェクトは MATLAB ワークスペース内で名前 SL_Bus_<modelname>_<messageType> (モデル名が長すぎる場合は短縮可能) を使用して作成されることに注意してください。

robotics.ros.createSimulinkBus(gcs)

6.MATLAB Function - Assign ブロックをダブルクリックします。MATLAB エディターで [データの編集] をクリックします。[端子とデータの管理]msg を選択し、そのタイプを SL_Bus_FunctionTest_geometry_msgs_PoseArray に設定します。[適用] をクリックして [端子とデータの管理] を閉じます。

  • データ型のドロップダウンにオプションとして SL_Bus_FunctionTest_geometry_msgs_PoseArray がリストされていない場合は、[-- データ型の更新 --] を選択します。

7.[ツール]、[ROS]、[Configure Network Addresses] をクリックし、ROS マスターとノード ホストのネットワークアドレスを [Default] に設定します。

8.MATLAB コマンド ラインで rosinit と入力します。

9.シミュレーション終了時間を 1.0 に設定し、[再生] ボタンをクリックしてシミュレーションを実行します。Display ブロックの値が pi/2 および pi/2 + 1 に等しいことを確認します。

robotics.ros.createSimulinkBus(gcs) ステートメントは、モデルを読み込むたびに、またはワークスペースがクリアされた場合に実行しなければなりません。これらの問題を回避するには、モデルの InitFcn コールバックにこのステートメントを含めます (モデルのコールバック パラメーター (Simulink)を参照)。

タスク 4 - string 配列の操作

ROS メッセージ内の string 配列は、Simulink 内で std_msgs/String メッセージの配列として表されます。各 std_msgs/String メッセージには、string 内に実際の文字をもつ Data プロパティがあります。各 string は、uint8 値の配列として表されます。

既定では、string 配列内の std_msgs/String メッセージの最大数は 16 で、各 string の最大長は 128 文字です。以下の手順では、これらの既定値を変更する方法を説明します。

1.モデル例を開き、Work with Strings and String Arrays サブシステムをダブルクリックします。

2.[ツール]、[Robot Operating System]、[Manage Array Sizes] をクリックします。

3.[Message types in model] 列で sensor_msgs/JointState エントリをクリックします。右側のペインに表示される Name プロパティが std_msgs/String の配列であり、その最大長が 16 であることを確認します。Name における string の最大数を変更するには、[Use default limits for this message type] チェック ボックスをオフにして、目的の値を入力します。

4.[Message types in model] 列で std_msgs/String エントリをクリックします。右側のペインに表示される Data プロパティが uint8 の配列であり、その最大長が 128 であることを確認します。string の最大長を変更するには、[Use default limits for this message type] チェック ボックスをオフにして、目的の値を入力します。

5.既定値を変更したら、Work with Strings and String Arrays サブシステムを開いてモデルをシミュレートします。これで、更新された最大値が Display ブロックに反映されるようになります。

メモ: Data の最大長は、モデル内の std_msgs/String のすべてのインスタンスに適用されます。たとえば、Work with Strings and String Arrays サブシステム内の Blank String ブロックは std_msgs/String メッセージを使用するため、これらのメッセージは更新された最大長を継承します。同様に、string 配列プロパティをもつ別の ROS メッセージ タイプがモデルにある場合、その配列内の個々の string も更新された最大長を継承します。

まとめ

この例では、複雑な ROS メッセージから信号を抽出する方法と、信号を ROS メッセージに割り当てる方法を説明しました。また、可変長配列からデータを抽出して、配列の最大サイズを更新する方法も説明しました。