ロボットオペレーティングシステムの紹介:究極のロボットアプリケーションフレームワーク

公開: 2022-03-11

Robot Operating System (ROS)は実際のオペレーティングシステムではなく、異種コンピュータークラスター上のオペレーティングシステムの機能を提供するフレームワークとツールのセットです。 その有用性はロボットに限定されませんが、提供されるツールの大部分は周辺ハードウェアの操作に焦点を合わせています。

ROSは2000以上のパッケージに分割されており、各パッケージは特殊な機能を提供します。 フレームワークに接続されているツールの数は、おそらくその最大の力です。

なぜロボットOSを使用する必要があるのですか?

ROSは、ハードウェアアブストラクション、デバイスドライバー、複数のマシンを介したプロセス間の通信、テストと視覚化のためのツールなどの機能を提供します。

ROSの主な機能は、ソフトウェアの実行方法と通信方法です。これにより、特定のハードウェアがどのように機能するかを知らなくても、複雑なソフトウェアを設計できます。 ROSは、プロセス(ノード)のネットワークを中央ハブに接続する方法を提供します。 ノードは複数のデバイスで実行でき、さまざまな方法でそのハブに接続します。

ネットワークを作成する主な方法は、要求可能なサービスを提供すること、または他のノードとのパブリッシャー/サブスクライバー接続を定義することです。 どちらの方法も、指定されたメッセージタイプを介して通信します。 一部のタイプはコアパッケージによって提供されますが、メッセージタイプは個々のパッケージによって定義できます。

開発者は、小さな問題の既存のソリューションを接続することにより、複雑なシステムを組み立てることができます。 システムの実装方法により、次のことが可能になります。

  • コンポーネントをその場で同様のインターフェースに交換し、さまざまな変更のためにシステムを停止する必要をなくします

  • 複数のコンポーネントの出力を別のコンポーネントの1つの入力に多重化し、さまざまな問題の並列解決を可能にします

  • メッセージングシステムに適切なコネクタを実装するだけで、さまざまなプログラミング言語で作成されたコンポーネントを接続し、さまざまな開発者の既存のモジュールを接続してソフトウェアを簡単に開発できます。

  • コードが実行される場所を気にせず、プロセス間通信(IPC)およびリモートプロシージャコール(RPC)システムを実装することなく、デバイスのネットワーク上にノードを作成します

  • 前の2つの箇条書きを使用することにより、余分なコードを記述せずに、リモートハードウェアからオンデマンドでフィードに直接接続します

単純なソリューションを繰り返し開発することで、それがどれほど役立つかを示すことを計画しています。 他のアプローチと比較して、いくつかの重要な利点があります。 ROSはマルチプラットフォームをサポートしており、バックグラウンドで処理されるピアツーピア接続を介して複数のデバイスを介してプロセス間の接続を可能にします。 この設計では、C ++通信クラスをラップするか、言語インターフェイスのクラスを手動で開発することにより、任意の言語をサポートできます。

ROSは、そのコミュニティのために作られた独自のコミュニティによって作られています。 数年後、システムのアーキテクチャのおかげで、統合が簡単な再利用可能なパッケージが大量に作成されました。

MRPT、CARMEN、LCM、Player、Microsoft RDSなどの代替アプローチは、これらの機能の一部を提供しますが、すべてではありません。 ほとんどの場合、設計上の欠点は、言語サポートの制限、プロセス間の最適化されていない通信、またはさまざまなデバイスのサポートの欠如であり、これはおそらく修正が最も難しい問題です。

何を構築するのですか?

私たちの焦点はフレームワークであり、特定の問題の実際のアルゴリズムではないため、与えられた問題はかなり単純になります。 私たちの目標は、コンピューターのゲームパッドとロボットに取り付けられたカメラからのフィードを使用して、Wi-Fi経由で接続されたロボットをリモートで制御および監視できるオンボードコンピューター用のソフトウェアを構築することです。

まず、ROSの基本原理を示すために、単純なプログラムを単純なシミュレーションに接続します。 ゲームパッドをコンピューターに接続し、ゲームパッド入力をロボットの制御信号に変換するための優れた制御スキームの設計を試みます。

ROSコードを作成するための主な言語は、C ++とPythonですが、パフォーマンスが向上するため、C++が推奨されます。 コードの定型文が少なく、明示的に構築する必要がないため、Pythonでの例を説明します。

インストールと構成

ROSバージョンは名前で参照されます。 この日付の時点で、最新リリースはJade Turtleであり、最新のLTSバージョンはIndigoIglooです。 LTSバージョンを選択することをお勧めします。また、ROSでは下位互換性が保証されていないため、すべての例はIndigo用に作成されます。

ROSは、さまざまな*NIXプラットフォームで利用できます。 公式にサポートされているバージョンはUbuntuにあります。 OS X、Arch Linux、Debian、Raspbian、Androidの各バージョンはコミュニティでサポートされています。

デスクトップへのUbuntu14.04のインストールプロセスを実行します。 サポートされているすべてのバージョンとプラットフォームのプロセスは、公式Webサイトで入手できます。 ROSがインストールされた仮想マシンも利用できます。

インストールはプラットフォームに依存します(ほとんどのプラットフォームにはパッケージが提供されています)が、ワークスペースの構成はすべてのプラットフォームで同じです。

Ubuntuへのインストール

ROSは独自のリポジトリを提供します。 最初のステップはそれらを追加することです。

 sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt-key adv --keyserver hkp://pool.sks-keyservers.net --recv-key 0xB01FA116 sudo apt-get update

その後、Ubuntuバージョンで利用可能なすべてのROSバージョンのすべてのホストされたパッケージができます。 たとえば、Ubuntu14.04はindigojadeをサポートしています。

デスクトップへの基本パッケージのインストールには、次の3つのオプションのいずれかがあります。

  • 最小限のインストールのためのsudo apt-get install ros-indigo-ros-base

  • sudo apt-get install ros-indigo-desktop基本的な追加のGUIツールを使用する

  • sudo apt-get install ros-indigo-desktop-full

最高の作業体験を得るには、完全なオプションをお勧めします。 ノードの実行にのみ使用されるデバイスにインストールする場合は、基本バージョンで十分です。 どのオプションを選択しても、次のコマンドを実行して、 package_nameという名前の必要なパッケージをインストールできます。

 sudo apt-get install ros-indigo-<package-name>

アンダースコアは最終的な名前のハイフンに置き換えられるため、 stage_rosはパッケージros-indigo-stage-rosれます。

次のステップは、 rosdepを初期化することです。 ROSのパッケージは、依存するコンポーネントを宣言できます。 rosdepを使用すると、手動で依存関係をあまり処理せずに、これらのパッケージをコンパイルできます。 初期化するには、次を呼び出します。

 sudo rosdep init rosdep update

ROSには、そのツールで使用されるいくつかの環境変数があります。 デフォルトのインストールでは、それらを初期化するためのbashスクリプトは/opt/ros/indigo/setup.bashにあります。 変数はすべてのbashセッション内で初期化する必要があるため、最善の解決策はそれらを~/.bashrcに追加することです。

 echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc source ~/.bashrc

一部のパッケージは、 rosinstallを介して外部依存関係をインストールします。これは、パッケージとして利用可能であり、 sudo apt-get install python-rosinstallを介してインストールされます。

これでUbuntuへのインストールは終了です。 以下は、ワークスペースのインストールの簡単な紹介です。

構成

Groovy Galapagos以来、ROSワークスペースはcatkinを介して管理されています。 ホストするすべてのパッケージのディレクトリを定義する必要があります。 ディレクトリ内にsrcフォルダーを作成し、その中にcatkin_init_workspaceフォームを呼び出します。 これにより、現在提供されているROSバージョンへのさまざまなシンボリックリンクが作成されます。 次のステップは、このワークスペースを環境変数にも追加することです。

このワークスペース全体の構成を実行するには、空のディレクトリを選択して、次のコマンドを実行します。

 mkdir src cd src catkin_init_workspace cd .. catkin_make echo "source $(pwd)/devel/setup.bash" >> ~/.bashrc source ~/.bashrc

これで、独自のROSパッケージを作成できるワークスペースが作成されました。

ツールに慣れる

コードを作成することは大きなジャンプです。 まず、舞台裏で実行されているシステムのいくつかに慣れましょう。 最初のステップは、基本的なGUIを実行し、それが生成するメッセージを確認することです。

ROSで何かを実行するには、コアプロセスを起動する必要があります。 新しいターミナルウィンドウを開いて入力するのと同じくらい簡単です。

 roscore

接続されたデバイスのネットワーク全体で、通信ディスパッチ用の中央ハブをホストするデバイスで、 roscoreを1回だけ起動する必要があります。

roscoreの主な役割は、ノードが他のどのノードに接続する必要があるか、およびどの方法で(ネットワークポートまたは共有メモリを介して)接続するかをノードに通知することです。 目標は、すべての通信を実行するために必要な時間と帯域幅を最小限に抑えながら、ノードが接続したいノードではなく、知りたいデータのみを気にすることを可能にすることです。

rqt

roscoreを実行した後、ROSのメインGUIツールであるrqtを起動できます。 私たちが見るものは非常に圧倒的です-空のウィンドウ。 rqtは、任意のビジュアル構成および任意の数の事前定義されたビューに構成できるさまざまなプラグインをホストします。

「Default--rqt」というタイトルの空のGUIウィンドウのスクリーンショット。メニューには、[ファイル]、[プラグイン]、[実行中]、[パースペクティブ]、および[ヘルプ]があります。

まず、 Plugins > Robot Tools > Robot Steeringで選択して、ロボットステアリングプラグインを実行しましょう。 取得するのは2つのスライダーで、ロボットに必要な線形運動と回転運動を表します。 プラグインの上部に、 /cmd_velが含まれるテキストボックスが表示されます。 名前を変更できます。 これは、ステアリングが公開しているトピックの名前を表します。 ターミナルツールは、バックグラウンドで何が起こっているかを確認するのに最適な場所です。

以前と同じウィンドウを示すスクリーンショットですが、ロボットステアリングインターフェイスがあります--- D、リロード、ヘルプ、最小化、円、およびXアイコンがあります---その中にあります。最初の行には、「/cmd_vel」が含まれるテキストボックスと[停止]ボタンがあります。その下には、垂直方向に中央に配置された垂直方向のスライダーが0.0 m / sで中央に設定されており、左側に+、0、-のボタンがあり、上下に1,00と-1,00の数字コントロールがあります。その下には、水平でラジアン/秒で測定された同様のスライダーがあり、中央で0に設定され、左側が3,00、右側が-3,00の数値コントロールがあります。

ターミナルツール

ROSには、システムで何が起こっているかを検査するための強力なツールがいくつかあります。 最初に紹介するツールはrostopicです。 これにより、ノードがサブスクライブおよびパブリッシュできるトピックを検査できます。 rostopic listを実行すると、次のようになります。

 /cmd_vel /rosout /rosout_agg

後者の2つのトピックは常に実行されており、中央のROSシステムに関連しています。 /cmd_velトピックは、ステアリングによって公開されています。 ステアリングでトピックの名前を変更すると、ここでも名前が変更されます。 今、私たちはトピック内で何が起こっているかに興味を持っています。 rostopic echo /cmd_velを実行しても、何も表示されません(スライダーをいじくり回していない限り)。 プロセスは、キャンセルするまで実行されます。 次に、垂直スライダーを20 m/sに移動します。 エコーを見ると、次のことが何度も繰り返されていることがわかります。

 linear: x: 0.2 y: 0.0 z: 0.0 angular: x: 0.0 y: 0.0 z: 0.0

このメッセージをスパムする頻度はどれくらいですか。 rostopic hz /cmd_velは平均10Hzのレートで言います。 さて、このようなトピックを低速Wi-Fi接続でいくつ実行できますか? rostopic bw /cmd_velは、平均480 B/sを検出します。

これですべてうまくいきましたが、メッセージの種類について話しました。 このデータは人間にとっては良いものですが、アプリケーションには生データが必要であり、データを解釈できるようにメッセージタイプを知る必要があります。 タイプはrostopic type /cmd_velで判別でき、 geometry_msgs/Twistであることを示します。 引数なしで呼び出されたすべてのROSターミナルツールは、標準のヘルプメッセージを返します。

ROS Wikiは、この文字列をWeb検索して、その文字列の内容と構造をWikiで説明するのに十分です。 しかし、私たちはそれに依存する必要はありません。 rosmsgは、メッセージタイプの一般的なツールです。 rosmsg show geometry_msgs/Twistを実行すると、次のようになります。

 geometry_msgs/Vector3 linear float64 x float64 y float64 z geometry_msgs/Vector3 angular float64 x float64 y float64 z

メッセージは、3D空間の線形速度と角速度を表す2つの3Dベクトルで構成されます。

ノードが接続されているトピックが必要な場合は、 rosnode info <node-name>がノードに関する詳細データを提供します。 ツールrostopicrosmsg 、およびrosnodeは、生のROS機能を検査するための主要なツールです。 ROSにはさらに多くのGUIおよびターミナルツールがありますが、これらはこの紹介の範囲外です。

ROSノードを実行するための主なツールはrusrunroslaunchです。 rosrunrosrun <package_name> <node_name>を介してノードを実行でき、 roslaunchは起動ファイルに基づいてノードを実行します。これらはROS自動化の最も複雑な要素であるため、少しだけ慣れます。

実行したすべてをシャットダウンして、最初のコードの作業を開始できます。 将来の参考のために、ROSに関連するものを実行するには、 roscoreのアクティブなインスタンスが必要であることは言うまでもありません。 発生した多くの問題は、 roscoreが実行されているターミナルウィンドウを閉じ、新しいウィンドウを開いて再起動することで解決できます。 これにより、 bashroscoreの両方で再ロードする必要のあるすべての依存関係が更新されます。

ゲームパッドテレオペレーションの作成

最初の目標は、ゲームパッドの入力に基づいてgeometry_msgs/Twistデータを/cmd_velに公開するノードを作成することにより、 Robot Steeringの機能を模倣することです。 最初に立ち寄るのはjoyパッケージです。

joyパッケージ

joyパッケージは、ジョイスティックとゲームパッド用の汎用ROSドライバーを提供します。 デフォルトのインストールには含まれていないため、次の方法でインストールする必要があります。

 sudo apt-get install ros-indigo-joy

インストール後、 rosrun joy joy_nodeを実行できます。 これにより、デフォルトのジョイスティックまたはゲームパッドに接続されます。 rostopic listを実行すると、 /joyというトピックがあることがわかります。 rostopic echoで聞くと、次の形式のメッセージが表示されます(メッセージを公開するには、ゲームパッドまたはジョイスティックを操作する必要があることに注意してください)。

 header: seq: 4156 stamp: secs: 1450707466 nsecs: 204517084 frame_id: '' axes: [0.0, 0.0, 0.0, -0.0, 0.0, 0.0, 0.0, 0.0] buttons: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

今のところ、ヘッダーは無視できます。 それ以外に、 axesbuttonsがあり、それらが何を表しているかをうまく説明しています。 コントローラの軸を動かしてボタンを押すと、これらの数値が変化します。 ツールを使用して、メッセージタイプがsensor_msgs/Joyであり、形式が次のとおりであると判断できます。

 std_msgs/Header header uint32 seq time stamp string frame_id float32[] axes int32[] buttons

テレオペレーションの作成

コードを書くための最初のステップは、パッケージを作成することです。 ワークスペースのsrcフォルダー内で、次のコマンドを実行します。

 catkin_create_pkg toptal_tutorial rospy joy geometry_msgs sensor_msgs

ここでは、作成するパッケージの名前を示し、その後に依存する予定のパッケージを示します。 心配はいりません。依存関係は後で手動で更新できます。

これで、 toptal_tutorialフォルダーができました。 このフォルダー内に、すべてのPythonスクリプトを格納するscriptsフォルダーを作成します。

teleop.pyというファイルを作成し、その中に次のように設定します。

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy def joy_callback(data): print data def main(): rospy.init_node('teleop') rospy.Subscriber('joy', Joy, joy_callback) while not rospy.is_shutdown(): pass if __name__ == '__main__': main()

また、スクリプトが実行可能になるように、 chmod +x teleop.pyを設定する必要があります。 ある端末でrosrunjoyjoy_nodeを実行し、別の端末でrosrun toptal_tutorial teleop.py rosrun joy joy_node実行すると、 teleop.pyの端末出力がJoyメッセージでいっぱいになります。

コードが何をするのか調べてみましょう。

まず、ROSフレームワークと対話するためのライブラリをホストするrospyをインポートします。 メッセージを定義する各パッケージには、メッセージ定義を含むmsgサブパッケージがあります。 入力を処理するためにJoyをインポートしています。 明示的に言及したい場合を除いて、埋め込まれたメッセージタイプ( Joyメッセージにあるstd_msgs.msgからのHeaderなど)をインポートする必要はありません。

最初のステップは、特定の名前でノードを初期化することです(この場合、それを「teleop」と呼びます)。 その後、タイプsensor_msgs.msg.Joyの「joy」トピックにサブスクライブし、 joy_callback関数を呼び出すことによって各メッセージを処理するサブスクライバーを作成します。 コールバックは、メッセージからのデータという1つのパラメーターを受け取ります。 データのメンバーへのアクセスは簡単です。 最初の軸の状態を出力したい場合、メッセージタイプを思い出すと、 print data.axes[0]を呼び出すことになり、floatになります。 最後のループは、ROSがシャットダウンされるまでループします。

次のステップは、データを何らかの方法で処理することです。 入力に応じて変化するツイストメッセージを作成し、それをcmd_velトピックに公開する必要があります。

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist # new from functools import partial # new def joy_callback(pub, data): # modified cmd_vel = Twist() # new cmd_vel.linear.x = data.axes[1] # new cmd_vel.angular.z = data.axes[0] # new pub.publish(cmd_vel) # new def main(): rospy.init_node('teleop') pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) # new rospy.Subscriber('joy', Joy, partial(joy_callback, pub)) # modified while not rospy.is_shutdown(): pass if __name__ == '__main__': main()

まず、 Twistメッセージを追加し、 functools.partialを介して関数の引数をバインドするためのサポートを追加します。 タイプTwistのメッセージをcmd_velに公開するパブリッシャーpubを作成します。 そのパブリッシャーをコールバックにバインドし、最初の2つの軸で表される速度で、すべての入力でツイストメッセージを発行するようにします。 このコードは期待どおりの動作をし、 rostopic echo /cmd_velを介して結果の出力を確認できます。

まだ1つの問題があります。 /joyトピックは、お得なレートで公開できます。 rostopic hz /cmd_velを監視し、アナログスティックを円で動かすと、多数のメッセージが表示されます。 その結果、大量の通信が発生するだけでなく、これらのメッセージを受信するプロセスは、それぞれのメッセージを処理する必要があります。 そのデータをそれほど頻繁に公開する必要はありません。10Hzの安定したレートで公開する方がよいでしょう。 次のコードでそれを達成できます。

 #!/usr/bin/env python import rospy from sensor_msgs.msg import Joy from geometry_msgs.msg import Twist from functools import partial def joy_callback(cmd_vel, data): # modified cmd_vel.linear.x = data.axes[1] cmd_vel.angular.z = data.axes[0] # moved pub.publish(cmd_vel) to main loop def main(): rospy.init_node('teleop') cmd_vel = Twist() # new pub = rospy.Publisher('cmd_vel', Twist, queue_size=1000) rospy.Subscriber('joy', Joy, partial(joy_callback, cmd_vel)) # modified rate = rospy.Rate(10) # new while not rospy.is_shutdown(): pub.publish(cmd_vel) # new rate.sleep() # new if __name__ == '__main__': main()

可変Twistオブジェクトを受け取り、ループ内で変更するようにコールバックを変更しました。 rospy.Ratesleep機能は安定した出力周波数を維持します。

最終的なコードは、 /cmd_velトピックが10Hzで速度コマンドを取得し、 RobotSteeringrqtプラグインの出力を模倣する結果にrqtます。

シミュレートされたシステムの実行

世界をシミュレートする

私たちの最初の目標は、達成したいシナリオをシミュレートできる環境を作成することです。 stage_rosパッケージ内のノードstagerosを使用すると、画像を介して定義された2Dステージ内で1台のロボットを実行できます。 ワールドファイルのstage_rosパッケージ内に記述されている構文全体と、それらを生成する方法があります。 それはかなり単純ですが、私たちの範囲外です。 幸いなことに、パッケージにはいくつかのデモワールドが付属しています。 まず、次のコマンドを実行してファイルのディレクトリに移動しましょう。

 roscd stage_ros cd world

フォルダ内にはいくつかのファイルがあります。 実行してみましょう。

 rosrun stage_ros stageros willow-erratic.world

これにより、いくつかのトピックが作成されました。 それぞれの意味もパッケージに記載されています。 重要なのは、 cmd_velがあることです。

Stage:willow-erratic.worldというタイトルのウィンドウのスクリーンショット。ステータスラベルには、「0m 20s 300msec(1.0)」と表示されます。右側には、下部の18から上部の30まで、1ずつ増加する目盛りがあります。メインの画像は、メインの黒い点と線が全体に散らばっているチェッカーボードに加えて、中央近くに青い正方形があり、そこから数個のチェッカーボードの正方形が少し大きい赤い正方形です。

表示されたステージ内には、制御するロボットを表す青い四角があります。 コードまたはロボットステアリングのいずれかを使用することで、このロボットを制御できます。 やってみよう。

起動ファイルを介したシステムのセットアップ

パッケージ内にlaunchフォルダーを作成し、その中にteleop.launchというファイルを作成しましょう。 最終的なフォルダ構造は次のようになります。

 toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src

teleop.launchファイル内で、ノードのセットとそれらの相互接続を定義します。

 <launch> <arg name="world_file" default="$(find stage_ros)/world/willow-four-erratics-multisensor.world" /> <node pkg="stage_ros" type="stageros" name="simulated_world" args="$(arg world_file)"></node> <group ns="robot_0"> <node pkg="joy" type="joy_node" name="joy_input"></node> <node pkg="toptal_tutorial" type="teleop.py" name="joy_convert"></node> </group> </launch>

新しい世界は4台のロボットで構成されており、各トピックにはrobot_<n>という接頭辞が付いています。 したがって、ロボット番号0には、 robot_0/cmd_velという速度コマンドトピックがあります。 そのため、 robot_0という名前空間内にコントロールを配置して、名前を新しい形式に調整します。 その意味で、トピック名はファイルシステム内のフォルダーと考えることができます。

2つのセクション、simulated-worldと/robot_0の図。後者には、すべて/robot_0/で始まるボックスとバブルがあります。前者には/simulated-worldというラベルの付いたバブルがあり、後者のcmd_velバブルに接続されています。これはjoy_convertボックスに参加し、joyボックスに参加し、joy_inputバブルに参加します。 /simulated-worldは/robot-0の4つのボックス、つまりimage_1、depth_0、depth_1、およびimage_0にも接続します。

起動ファイルを実行するために、 roscoreは必要ありません。 ある意味で、 roscoreは何もしないlaunchfileの特殊なケースにすぎません。 roscoreが欠落している場合、最初に起動されたlaunchfileのみがコアを実行し、残りはそれに接続します。 次に、次のコマンドで起動を実行します。

 roslaunch toptal_tutorial teleop.launch

すべてが正しければ、4台のロボットを備えたシミュレーターになり、そのうちの1台はゲームパッドまたはジョイスティックで制御されます。 この世界には、前の世界よりもはるかに多くの内部があります。 4台のロボットにはそれぞれ次のものがあります。

 /robot_<n>/base_pose_ground_truth /robot_<n>/base_scan_0 /robot_<n>/base_scan_1 /robot_<n>/camera_info_0 /robot_<n>/camera_info_1 /robot_<n>/cmd_vel /robot_<n>/depth_0 /robot_<n>/depth_1 /robot_<n>/image_0 /robot_<n>/image_1 /robot_<n>/odom

<n>を0、1、2、または3に置き換えます。これで最後のトピックに進みます。

rqtを使用したデータの表示

rqtについてはあまり深く掘り下げませんでしたが、より複雑なデータを表示するのに最適なツールです。 すべてのトピックを試すことができますが、ここではimage_0image_1depth_0 、およびdepth_1のトピックに焦点を当てます。

rqtを起動して、開いているプラ​​グインをすべて削除しましょう。 次に、4つの画像ビジュアライザー( Plugins > Visualization > Image View )を開き、2x2グリッド形式で配置します。 最後に、各ビューの左上隅で、 robot_0の4つのトピックから1つを選択しましょう。

ロボットのステアリングインターフェイスを示すスクリーンショット。前述のテキストボックスとスライダーがありますが、テキストボックスには「/ robot_0/cmd_vel」と表示されています。右側には4つの画像ビューがあります。上の2つ(image_0とimage_1)は、3Dで2つの青いボックスと1つの赤いボックスを示しています。下の2つ(depth_0とdepth_1)は上と同様の画像を示していますが、グレースケールで表示されます。特に、ここの前景色のボックスは、背景のオブジェクトよりも暗い灰色で表示されます。

私たちが得ているのは、低解像度カメラを使用した、奥行き知覚を備えたステレオビジョンです。 入力システムがなくても、この結果を得ることができた可能性があることを覚えておいてください。 これを( stage_ros/worldフォルダー内から)実行した場合:

 rosrun stage_ros stageros willow-four-erratics-multisensor.world

/robot_0/cmd_velというトピックを含むRobotSteeringプラグインを追加すると、画面上のスライダーでコントロールを使用しても同じ結果が得られます。

結果を実際のシステムに適用する

多くのハードウェアはROSを完全にサポートしており、多くの場合、サードパーティのボランティアによって提供されます。 多くのロボットプラットフォームには、これらのタイプのメッセージを生成するドライバーがあり、ROSには、Webカメラを取得して画像フィードを公開するノードがあります。

最後の結果は私たちが達成したいことのシミュレーションでしたが、同じことは次の変更で達成できます。

  • ロボットのオンボードコンピュータにROSをインストールします
  • ROSを基盤となるプラットフォーム、およびカメラ、レーザー距離計などのすべての高レベルセンサーに接続するオンボードコンピューターの起動ファイルを作成します。 必要なノードはすでに存在するか、一方の側でROSのパブリッシャー/サブスクライバーを作成し、もう一方の側でシリアル通信用のドライバーを作成することで実装できます。
  • 起動時にlaunchfileを実行します
  • リモートコンピューターで、 export ROS_MASTER_URI=http://<robot_hostname>:11311/をbashスタートアップに追加し、リモートコンピューターがその指定されたホスト名とポートでroscoreを検索するようにします。
  • ロボットを監視および制御するためのrqtおよび/または任意のスクリプトを起動します

これが実際に起こるのは、リモートデバイスに適切な環境変数をエクスポートすることであり、残りはそれ自体を処理します。 コンピュータークラスターでROSを実行するには、すべてのマシンに対して1つの手順を実行するだけで済みます。

結論

コーディングをほとんど行わずに、気まぐれで操作できる複雑な変数システムを作成する方法を示しました。 シンプルなパブリッシャー/サブスクライバーシステムを使用すると、特定の要素の基本的な実装について心配することなく、コンピューターのクラスター内のデータを処理するソフトウェアパイプラインをすばやく開発できます。

単純なシミュレーターを使用しましたが、 gazebo (フルデスクトップバージョンにも含まれています)などのより複雑なシミュレーターを使用すると、物理学と複雑なセンサーを使用して3Dワールドを作成でき、開発されるずっと前に最終結果と製品を体験できます。

この紹介は非常に基本的なものでしたが、この用途の広いフレームワークでの作業にもっと興味を持っていただければ幸いです。