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

Simulink® からのスタンドアロン ROS ノードの生成

この例では、Simulink モデルからスタンドアロン ROS ノードを生成してビルドする方法を説明します。

はじめに

この例では、モデルを構成してスタンドアロン ROS ノードの C++ コードを生成します。次に、Ubuntu® Linux® システムで ROS ノードをビルドして実行します。

必要条件

タスク 1 - コード生成用モデルの構成

このタスクでは、モデルを構成して、スタンドアロン ROS ノードの C++ コードを生成します。このモデルは、ROS 対応ロボットのフィードバック制御の例で紹介した比例コントローラーです。

  • ロボットのフィードバック制御モデルを開きます。リンクをクリックするか、コマンド ウィンドウで robotROSFeedbackControlExample を実行します。

  • [編集]、[すべて選択] を選択してから [編集]、[コピー] を選択します。

  • 新しい Simulink モデルを開きます。[編集]、[貼り付け] を選択します。

  • Simulation Rate Control ブロックを削除します。

  • [シミュレーション]、[モデル コンフィギュレーション パラメーター] をクリックします。

  • [コンフィギュレーション パラメーター] ダイアログの [ハードウェア実行] ペインで、[ハードウェア ボード][Robot Operating System (ROS)] に設定して [適用] をクリックします。[ハードウェア ボード設定] セクションには、package.xml ファイルにインクルードされる情報など、生成した ROS パッケージ固有の設定が含まれます。[Maintainer name]ROS Example User に変更します。

  • モデルには可変サイズの配列が必要です。このオプションを有効にするには、[ハードウェア実行]、[詳細設定パラメーター] に移動し、[Embedded Coder 機能を有効化] をオンにします。

  • 次に、[コード生成]、[インターフェイス]、[ソフトウェア環境]、[サポート] に移動し、[可変サイズの信号] をオンにします。

  • [コンフィギュレーション パラメーター] ダイアログの [ソルバー] ペインで、必ずソルバーの [タイプ][固定ステップ] に設定し、[固定ステップ サイズ]0.05 に設定します。[固定ステップ サイズ] は、生成されたコードでモデルの更新ループに使用される実際のタイム ステップを秒単位で定義します (モデルから生成されたコードの実行 (Simulink Coder)を参照)。より小さい値 (0.001 や 0.0001 など) にすることもできますが、現在の目的には 0.05 で十分です。

  • [OK] をクリックして、[コンフィギュレーション パラメーター] ダイアログを閉じます。モデルを RobotController.slx という名前で保存します。

タスク 2 - ROS デバイスとの接続の構成

ROS デバイスとは、ROS がインストールされている任意の Linux システムであり、ROS ノードのビルドおよび実行ができます。Simulink Coder がある場合は、スタンドアロン ROS ノードのコードを生成できます。使用しているシステムが ROS デバイスに接続している場合、Simulink は生成したコードを ROS デバイスに転送し、実行可能ファイルをビルドして、得られた ROS ノードを実行することもできます (これは、ROS ノードの "展開" とも呼ばれます)。

このタスクでは、ROS ノードのコードを生成するか、あるいは ROS デバイスで ROS ノードをビルドして実行するかを決定します。ROS デバイスに接続している場合は、ROS ノードの展開ターゲットとして使用するように Simulink を構成できます。

  • [シミュレーション]、[モデル コンフィギュレーション パラメーター] をクリックします。

  • [コンフィギュレーション パラメーター] ダイアログの [ハードウェア実行] ペインで、[ビルド オプション] をクリックします。[ビルド アクション] での選択内容は、モデルをビルドするときの Simulink の動作に影響します。[None] (既定の設定) は、ROS ノードのコードを生成するのみで、外部 ROS デバイスでのビルドは行いません。[Build and load] はコードを生成し、外部デバイスに転送して ROS ノードの実行可能ファイルをビルドします。[Build and run] を選択した場合、結果のノードの実行可能ファイルはビルドの終了時に自動的に開始されます。

  • [ビルド アクション][Build and run] に設定します。

  • 外部 ROS デバイスへの接続を構成します。[編集] をクリックして、デバイスのコンフィギュレーション ダイアログを開きます。このダイアログで、ROS ノードを展開するために Simulink が必要とするすべての情報を入力できます。これには、ROS デバイスの IP アドレスまたはホスト名、ログイン資格情報、Catkin ワークスペースなどが含まれます。[Catkin workspace]~/catkin_ws_test に変更します。

[ROS Folder] は、ROS デバイス上の ROS のインストール場所です。このフォルダーを指定しない場合、設定テスト (次の手順を参照) は正しいフォルダーを特定しようとします。

  • ROS デバイスがオンであり、使用しているコンピューターからアクセスできる場合、[テスト] をクリックして接続設定を確認できます。テストにより各デバイス設定が確認され、問題が検出された場合は Simulink 診断ビューアーに警告とエラーが表示されます。可能な場合、このテストでは問題の修正方法も提案されます。ここで [テスト] をクリックします。

  • 多くの場合、Catkin ワークスペース ~/catkin_ws_test はターゲット デバイスに存在していません。テストによりこの問題が検出され、フォルダーを作成してワークスペースを初期化するよう提案されます。[修正] をクリックして、このアクションを自動適用します。数秒後、フォルダーが正常に作成されたという緑の通知が表示されます。Catkin ワークスペースが使用可能になったことを確認するために、接続設定ダイアログの [テスト] を再度クリックします。警告が消え、Catkin ワークスペースは ROS ノードのビルドに使用できるようになっています。

  • 他の警告やエラーが表示されなくなるまで、デバイスの接続設定を変更してテストします。設定の自動修正が可能な場合、Simulink は [修正] ボタンを表示してそれを提案します。良好な設定の組み合わせが得られたら、接続設定ダイアログの [OK] をクリックして設定を保存します。

接続設定は単一のモデルに特定的なものではなく、Simulink のすべての ROS モデルに適用されます。

タスク 3 - C++ の ROS ノードの生成

このタスクでは、スタンドアロン ROS ノードのコードを生成し、自動的に ROS デバイスに転送してビルドと実行を行います。ROS デバイスで実行中の ROS マスターを使用して、生成した ROS ノードを実行します。

1.MATLAB® で、書き込み権限をもつ一時的な場所に現在のフォルダーを変更します。

2.コード生成プロセスでは、まずシミュレーション用にモデルを準備し、すべてのブロックが適切に初期化されていることを確認します。この準備を行うには、ROS マスターへの有効な接続が必要です。

MATLAB で rosdevice オブジェクトを使用して、ROS デバイス上の ROS マスターを起動することができます。引数を指定しない場合、rosdevice は Simulink ダイアログに入力されたデバイス接続設定を使用して ROS デバイスに接続します。

d = rosdevice
runCore(d);

3.rosinit を使用して、ROS デバイス上で実行されている ROS マスターに MATLAB を接続します。

rosinit(d.DeviceAddress)

4.MATLAB と同じ ROS 接続設定を使用するように Simulink に指示します。これを行うには、[ツール]、[Robot Operating System]、[Configure Network Addresses] を選択し、ROS マスターとノード ホストのネットワーク アドレスを [Default] に設定します。

MATLAB セッションごとに手順 2 ~ 4 を 1 回実行するだけですみます。ROS ノードを生成するたびに実行する必要はありません。

5.[コード]、[C/C++ コード]、[ハードウェアに展開] をクリックします。バス型の不一致に関するエラーが表示された場合は、モデルを閉じ、ベース MATLAB ワークスペースからすべての変数をクリアしてから、モデルを再度開きます。

モデルのツール バー下部にある [診断の表示] リンクをクリックして、ビルド処理の出力を表示します。

6.コード生成が完了した後、ROS ノードは ROS デバイスの Catkin ワークスペースに転送されます。そこでノードがビルドされ、自動的に実行が開始されます。

生成されたノードは、ROS デバイス上で実行されている ROS マスターに接続します。

7.rosnode を使用して、ROS ネットワークで実行中のすべてのノードをリストします。表示されたノードのリストに "robotcontroller" がなければなりません。

rosnode list

rostopic を使用して、展開されたノードがロボットの動きを制御するために ROS トピック上のデータをパブリッシュすることを確認できます。

rostopic info /mobile_base/commands/velocity

タスク 4 - ROS ノードの実行および確認

このタスクでは、MATLAB ベースのロボット シミュレーターを使用し、新規にビルドした ROS ノードを実行してその動作を確認します。

1.MATLAB で ExampleHelperSimulinkRobotROS と入力して、ロボット シミュレーターを起動します。このシミュレーターは、ROS デバイス上で実行中の ROS マスターに自動接続します。Gazebo ベースのロボット シミュレーションに接続する場合は、Simulink® から ROS 対応ロボットへの接続を参照してください。

sim = ExampleHelperSimulinkRobotROS

2.シミュレートされたロボットが目標 (モデル内に指定された [Desired Position] の定数) に向かって移動することを確認します。ロボットは目標 [-10, 10] に到達すると停止します。

3.[Reset Simulation] をクリックしてロボットの位置を [0, 0] にリセットします。ロボットはただちに目標位置に向かって移動を開始します。

4.Simulink で生成された ROS ノードを、MATLAB で rosdevice を使用して管理できます。Simulink モデルの展開後、rosdevice を使用していつでもノードの実行と停止ができます。Simulink でノードをリビルドする必要はありません。

AvailableNodes プロパティは、展開された robotcontroller ノードを示します。関数 isNodeRunning を呼び出して、ノードが実行中であることを確認できます。

d = rosdevice

isNodeRunning(d, 'robotcontroller')

5.ROS ノードの実行を停止します。

stopNode(d, 'robotcontroller')
isNodeRunning(d, 'robotcontroller')

6.シミュレーション ウィンドウの [Reset Simulation] ボタンをクリックします。ロボットは位置 [0,0] に留まり、動きません。

  • ここで、ノードを再開します。

runNode(d, 'robotcontroller')
  • ロボットは再度、目標位置に向かって移動を開始します。

7.確認が終了したら、次のようにシステムの状態をクリーンアップできます。

  • ターゲット デバイスで実行中のノードを停止します。

stopNode(d, 'robotcontroller')
  •  ホスト コンピューター上で、"ロボット シミュレーター" の Figure ウィンドウを閉じ、MATLAB コマンド ラインに rosshutdown と入力します。

rosshutdown

高度なトピックとトラブルシューティング

Simulink での ROS ネットワーク設定の指定: Simulink は既定で、MATLAB の rosinit からの ROS 接続設定を使用します。これらの設定をオーバーライドして Simulink で ROS 接続設定を指定するには、[ツール]、[Robot Operating System]、[Configure Network Addresses] を選択し、ROS マスターとノード ホストのネットワーク アドレスを設定します。

生成された C++ コードのアーカイブ: [ビルド アクション] として [None]、[Build and load]、[Build and run] のいずれを選択しても、Simulink は常に現在のフォルダーに 2 つのファイル、すなわち C++ ソース コードを含むアーカイブ (例では RobotController.tgz) と、C++ コードを手動で抽出してビルドするためのシェル スクリプト (build_ros_model.sh) を生成します。MATLAB コンピューターが ROS デバイスに接続していない場合は、手動でファイルを転送し、転送先でビルドできます。

プロセッサ固有の生成コード: 他の製品 (Computer Vision System Toolbox™ など) のブロックを使用している場合、生成されるコードにはプロセッサ固有の最適化が含まれることがあり、Linux 上で ROS ノードをビルドするときにコンパイル上の問題になる可能性があります。このような場合、生成されたコードをコンパイルするプラットフォームを Simulink に伝える必要があります。これは、モデルの [コンフィギュレーション パラメーター] ダイアログの [ハードウェア実行] ペインから行うことができます。

追加の ROS パッケージのインストール: Robotics System Toolbox には、標準の ROS 配布に含まれない多数の ROS メッセージ タイプ (Baxter® や PR2® 用など) があります。Simulink モデルに非標準またはカスタムのメッセージ タイプが含まれる場合でも、シミュレーションとコード生成を正常に行うことができます。ただし、生成された ROS ノードをビルドするには、まず必要なパッケージをすべてダウンロードし、インストールしなければなりません。ここでその方法の 1 つを示します (必要なパッケージが baxter_core_msgs であると仮定)。

MATLAB プロンプトで以下を入力します。

d = rosdevice; 
openShell(d);

Linux シェルで以下を入力します。

# Refresh the list of available packages
sudo apt-get update
# Search the list for ROS Baxter packages (e.g., ros-indigo-baxter-core-msgs)
apt-cache search baxter 
# Download and install the required package
sudo apt-get install ros-indigo-baxter-core-msgs

このコマンドが完了するまで数分かかる場合があることに注意してください。

MATLAB での ROS マスターの実行: 前述の例では、ROS デバイスで実行中の ROS マスターに接続しました。別の方法として、ROS マスターを MATLAB で作成することができます。MATLAB コマンド ラインで rosinit を使用します。

rosinit('NodeHost', <IP address of your computer>)

たとえば、ホスト コンピューターの IP アドレスが 172.28.194.92 である場合は、次のコマンドを使用します。

rosinit('NodeHost', '172.28.194.92')

NodeHost 設定は、生成された ROS ノードを MATLAB 上のマスターと確実に通信可能にする上で重要です。メモ: 生成された ROS ノードは NodeHost の IP アドレスを使用して MATLAB 内のグローバル ROS ノードと通信するため、指定された IP アドレスが ROS デバイスからアクセス可能であることを確認してください (たとえば ping を使用する)。NodeHost 設定の重要性の詳細については、ROS ネットワークへの接続の例を参照してください。

タスク モード: Simulink は、マルチタスク モード用とシングルタスク モード用のいずれについてもコードを生成できます (時間ベースのスケジューリングとコード生成 (Simulink Coder)を参照)。生成された ROS コードは、既定で、リアルタイム スケジューリングなしのシングルタスク モード (すべてのレートで単一スレッド) を使用します。これにより、生成された ROS コードは sudo 権限なしで実行できるようになりますが、パフォーマンスが予測しにくくなることがあります。

より予測可能なパフォーマンスが必要な場合は、マルチタスクを使用するようにモデルを構成することができます。[コンフィギュレーション パラメーター] ダイアログの [ソルバー] ペインで、[各離散レートを個別のタスクとして扱う] をオンにしてマルチタスクを有効にします。これにより、生成されたコード内でモデルのレートごとに個別のスレッドが作成され、スレッドに優先順位付きスケジューリングが使用されます。

ROS ノードを実行するには、ROS デバイスでの管理権限が必要です。モデルがターゲット デバイスに展開されるときに、Simulink は権限が不十分かどうかを自動検出します。

まとめ

この例では、Simulink モデルを構成してスタンドアロン ROS ノード用の C++ コードを生成する方法を説明しました。また、ROS ノードの転送、ビルド、確認を行う方法も説明しました。