ロボットオペレーティングシステムの紹介:究極のロボットアプリケーションフレームワーク
公開: 2022-03-11Robot 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はindigo
とjade
をサポートしています。
デスクトップへの基本パッケージのインストールには、次の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
は、任意のビジュアル構成および任意の数の事前定義されたビューに構成できるさまざまなプラグインをホストします。
まず、 Plugins > Robot Tools > Robot Steering
で選択して、ロボットステアリングプラグインを実行しましょう。 取得するのは2つのスライダーで、ロボットに必要な線形運動と回転運動を表します。 プラグインの上部に、 /cmd_vel
が含まれるテキストボックスが表示されます。 名前を変更できます。 これは、ステアリングが公開しているトピックの名前を表します。 ターミナルツールは、バックグラウンドで何が起こっているかを確認するのに最適な場所です。
ターミナルツール
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>
がノードに関する詳細データを提供します。 ツールrostopic
、 rosmsg
、およびrosnode
は、生のROS機能を検査するための主要なツールです。 ROSにはさらに多くのGUIおよびターミナルツールがありますが、これらはこの紹介の範囲外です。
ROSノードを実行するための主なツールはrusrun
とroslaunch
です。 rosrun
はrosrun <package_name> <node_name>
を介してノードを実行でき、 roslaunch
は起動ファイルに基づいてノードを実行します。これらはROS自動化の最も複雑な要素であるため、少しだけ慣れます。
実行したすべてをシャットダウンして、最初のコードの作業を開始できます。 将来の参考のために、ROSに関連するものを実行するには、 roscore
のアクティブなインスタンスが必要であることは言うまでもありません。 発生した多くの問題は、 roscore
が実行されているターミナルウィンドウを閉じ、新しいウィンドウを開いて再起動することで解決できます。 これにより、 bash
とroscore
の両方で再ロードする必要のあるすべての依存関係が更新されます。
ゲームパッドテレオペレーションの作成
最初の目標は、ゲームパッドの入力に基づいて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]
今のところ、ヘッダーは無視できます。 それ以外に、 axes
とbuttons
があり、それらが何を表しているかをうまく説明しています。 コントローラの軸を動かしてボタンを押すと、これらの数値が変化します。 ツールを使用して、メッセージタイプが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.Rate
のsleep
機能は安定した出力周波数を維持します。
最終的なコードは、 /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
があることです。
表示されたステージ内には、制御するロボットを表す青い四角があります。 コードまたはロボットステアリングのいずれかを使用することで、このロボットを制御できます。 やってみよう。
起動ファイルを介したシステムのセットアップ
パッケージ内に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
という名前空間内にコントロールを配置して、名前を新しい形式に調整します。 その意味で、トピック名はファイルシステム内のフォルダーと考えることができます。
起動ファイルを実行するために、 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_0
、 image_1
、 depth_0
、およびdepth_1
のトピックに焦点を当てます。
rqt
を起動して、開いているプラグインをすべて削除しましょう。 次に、4つの画像ビジュアライザー( Plugins > Visualization > Image View
)を開き、2x2グリッド形式で配置します。 最後に、各ビューの左上隅で、 robot_0
の4つのトピックから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ワールドを作成でき、開発されるずっと前に最終結果と製品を体験できます。
この紹介は非常に基本的なものでしたが、この用途の広いフレームワークでの作業にもっと興味を持っていただければ幸いです。