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

Simulink® から ROS 対応ロボットへの接続

この例では、Gazebo® のような別の ROS ベースのシミュレーターから情報を送受信するように Simulink モデルを構成する方法を説明します。

はじめに

Simulink を使用して、ROS 対応の物理ロボットや、Gazebo のような ROS 対応ロボット シミュレーターに接続できます。この例では、次の方法について説明します。

  • ROS を使用して別のロボット シミュレーターに接続するよう Simulink を構成する

  • シミュレートされたロボットに速度コマンドを送信する

  • シミュレートされたロボットから位置情報を受信する

この例では、以下のモデルを作成します。

open_system('robotROSConnectToRobotExample');

タスク 1 - ロボット シミュレーターの起動

このタスクでは、差動駆動型ロボットを表す ROS ベースのシミュレーターを起動します。このシミュレーターは以下のトピック上でメッセージを送受信します。

  • 速度コマンドを "/mobile_base/commands/velocity" トピック上で "geometry_msgs/Twist" タイプのメッセージとして受信

  • オドメトリ情報を "nav_msgs/Odometry" タイプのメッセージとして "/odom" トピックに送信

ROS ベースのシミュレーターを設定する 2 つのオプションのいずれかを選択できます。

オプション A: MATLAB® 内のシミュレーター

このオプションでは、別の Figure ウィンドウにロボットの現在位置をプロットする、シンプルな MATLAB ベースのシミュレーターが使用されます。

  • MATLAB コマンド ラインで rosinit と入力します。これにより、ネットワーク アドレス (URI) http://localhost:11311 をもつローカルの ROS マスターが作成されます。

  • ExampleHelperSimulinkRobotROS と入力してロボット シミュレーターを起動します。これにより Figure ウィンドウが開きます。

オプション B: Gazebo シミュレーター

このオプションでは、Gazebo 内でシミュレートされた TurtleBot® を使用します。

  • Gazebo 環境を設定する手順については、Gazebo およびシミュレートされた TurtleBot の入門を参照してください。仮想マシンの Ubuntu® デスクトップで [Gazebo Empty] アイコンをクリックします。

  • ROS マスターのネットワーク アドレス (URI) を確認します。http://192.168.84.128:11311 のようになります。

  • Ubuntu のターミナル ウィンドウに rostopic list と入力して、Gazebo 環境が適切に設定されていることを確認します。"/mobile_base/commands/velocity" と "/odom" を含むトピックのリストが表示されるはずです。

タスク 2 - ROS ネットワークに接続する Simulink の構成

1.モデル メニューで [ツール]、[Robot Operating System]、[Configure Network Addresses] を選択します。

2.[ROS Master] セクションの [Network Address] ドロップダウンから [Custom] を選択します。

  • オプション A (MATLAB シミュレーター) を選択した場合は、必ず [Hostname/IP Address] を [localhost] に設定し、[Port] を "11311" に設定します。

  • オプション B (Gazebo シミュレーター) を選択した場合は、Gazebo の ROS マスターの IP アドレスとポート番号を指定します。たとえば、http://192.168.60.165:11311 の場合は、[Hostname/IP address] フィールドに 192.168.60.165、[Port Number] フィールドに 11311 と入力します。

タスク 3 - ロボットへの速度コマンドの送信

このタスクでは、制御コマンド (線形速度と角速度) をシミュレーターに送信するパブリッシャーを作成します。Slider Gain ブロックを使用して、これらの速度を調整可能にします。

ROS では右手座標系を使用するため、X は "前"、Y は "左" 、Z は "上" です。制御コマンドは "geometry_msgs/Twist" メッセージを使用して送信されます。ここで Linear.X は前方向の線形速度 (m/s 単位) を示し、Angular.Z は Z 軸を中心とした角速度 (rad/s 単位) を示します。

  • 新しい Simulink モデルを開きます。

  • ライブラリ ブラウザーの [Robotics System Toolbox] タブから、Publish ブロックをモデルにドラッグ アンド ドロップします。ブロックをダブルクリックします。

  • [Topic source] フィールドを [Select From ROS network] に設定します。[Topic] フィールドの横にある [Select] をクリックし、"/mobile_base/commands/velocity" を選択して [OK] をクリックします。メッセージ タイプ ("geometry_msgs/Twist") が自動設定されることに注意してください。

  • ライブラリ ブラウザーの [Robotics System Toolbox] タブから、Blank Message ブロックをモデルにドラッグ アンド ドロップします。ブロックをダブルクリックします。

  • [Message type] フィールドの横にある [Select] をクリックし、"geometry_msgs/Twist" を選択します。

  • [Sample time]0.01 に設定して [OK] をクリックします。

  • ライブラリ ブラウザーの [Simulink]、[Signal Routing] タブから、Bus Assignment ブロックをモデルにドラッグ アンド ドロップします。

  • Blank MessageBus Assignment、および Publish の各ブロックを以下のように接続します。[シミュレーション]、[ブロック線図の更新] をクリックして、バス情報が正しく伝播されていることを確認します。"Bus Assignment ブロック 'untitled/Bus Assignment' で選択された信号 'signal1' が入力のバス信号で見つかりません" というエラーが表示される場合があります。このエラーは予期されるものであり、次の手順で解決されます。

  • Bus Assignment ブロックをダブルクリックします。右側のリストボックスで "??? signal1" を選択して [削除] をクリックします。左のリストボックスで Linear プロパティと Angular プロパティの両方を展開します。[Linear]、[X] と [Angular]、[Z] を選択し、[選択] をクリックします。[OK] をクリックしてブロック マスクを閉じます。

\

  • Constant ブロックを 1 つ、Gain ブロックを 1 つ、そして Slider Gain ブロックを 2 つ追加します。それらを以下の図のように接続し、[ゲイン] 値を -1 に設定します。

  • それぞれの Slider Gain ブロックの範囲と現在値を以下の図のように設定します。

タスク 4 - ロボットからの位置情報の受信

このタスクでは、"/odom" トピックに送信されたメッセージを受信するサブスクライバーを作成します。また、ロボットの (x,y) 位置を抽出して、パスを XY 平面にプロットします。

  • ライブラリ ブラウザーの [Robotics System Toolbox] タブから、Subscribe ブロックをモデルにドラッグ アンド ドロップします。ブロックをダブルクリックします。

  • [Topic source] フィールドを [Select From ROS network] に設定し、[Topic] フィールドの横の [Select] をクリックします。トピック "/odom" を選択して [OK] をクリックします。メッセージ タイプ ("nav_msgs/Odometry") は自動設定されることに注意してください。

  • ライブラリ ブラウザーの [Simulink]、[Signal Routing] タブから、Bus Selector ブロックをモデルにドラッグ アンド ドロップします。

  • Subscribe ブロックの出力端子を Bus Selector ブロックの入力端子に接続します。[シミュレーション]、[ブロック線図の更新] をクリックして、バス情報が正しく伝播されていることを確認します。

  • Bus Selector ブロックをダブルクリックします。右側のリストボックスで "??? signal1" および "??? signal2" を選択して [削除] をクリックします。左のリストボックスで [Pose]、[Pose]、[Position] を順に展開し、[X] と [Y] を選択します。[選択>>] をクリックしてから [OK] をクリックします。

  • ライブラリ ブラウザーの [Simulink]、[Sinks] タブから、XY Graph ブロックをモデルにドラッグ アンド ドロップします。Bus Selector ブロックの出力端子を XY Graph ブロックの入力端子に接続します。

モデル全体は以下のようになります。付属の事前設定されたモデルを使用すると便利です。

タスク 5 - モデルの構成と実行

このタスクでは、モデルを構成して実行します。

  • [シミュレーション]、[モデル コンフィギュレーション パラメーター] をクリックします。[ソルバー] ペインで、[タイプ][固定ステップ][固定ステップ サイズ]0.01 に設定します。

  • シミュレーションの [終了時間] を inf に設定します。

  • [再生] ボタンをクリックしてシミュレーションを開始します。XY プロットが表示されます。シミュレーターと XY プロットの両方で、円を描いて動くロボットが表示されます。

  • シミュレーションの実行中に、Slider Gain ブロックの値を変更してロボットを制御します。ロボットが XY プロットの範囲を超えて動く場合は、XY Graph ブロックをダブルクリックし、X 軸と Y 軸の範囲を変更します (これはシミュレーションの実行中に可能)。

  • シミュレーションを停止するには、[停止] ボタンをクリックします。

まとめ

この例では、ROS ネットワーク内の既存のトピックにサブスクライブとパブリッシュを行うことにより、外部シミュレーターと通信する方法を説明しました。この例ではまた、サブスクライブしたトピックから情報を抽出する方法も説明しました。