ザ・ ロボットオペレーティングシステム (ROS)は、実際にはオペレーティングシステムではなく、フレームワークとツールのセットであり、異種のコンピューターグループでオペレーティングシステムの機能を提供します。その有用性はロボットに限定されませんが、提供されるツールのほとんどは周辺ハードウェアの操作に焦点を合わせています。
ROS 2000以上のパッケージに分割されており、各パッケージには特殊な機能があります。フレームワークに接続されているツールの数は、おそらくその最大の力です。
ROSは、ハードウェアアブストラクション、デバイスドライバー、複数のマシンでのプロセス間通信、テストと視覚化のためのツールなどの機能を提供します。
ROSの重要な機能は、ソフトウェアの実行方法と通信方法です。これにより、特定のハードウェアがどのように機能するかを知らなくても、複雑なソフトウェアを設計できます。 ROSは、プロセス(ノード)のバックボーンネットワークに接続する方法を提供します。ノードは複数のデバイスで実行でき、さまざまな方法でそのハブに接続できます。
ネットワークを作成する主な方法は、必要なサービスを提供するか、他のノードとの広告主またはサブスクライバーの接続を定義することです。どちらの方法も、特定の種類のメッセージを介して通信します。一部のタイプはコアパケットによって提供されますが、メッセージタイプは個々のパケットによって定義できます。
開発者は、既存のソリューションを小さな問題に接続することにより、複雑なシステムをまとめることができます。システムの実装方法により、次のことが可能になります。
コンポーネントをその場で同様のインターフェースに交換し、さまざまな変更のためにシステムを停止する必要をなくします。
複数のコンポーネントの出力を別のコンポーネントの入力に多重化して、さまざまな問題の並列ソリューションを可能にします。
適切なコネクタをメッセージングシステムに実装するだけで、さまざまなプログラミング言語で作成されたコンポーネントを接続し、さまざまな開発者の既存のモジュールを接続することでソフトウェア開発を容易にします。
コードが実行される場所を気にせずにデバイスのネットワーク上にノードを作成し、プロセス(IPC)とリモートプロシージャコール(RPC)間の通信システムを実装します。
前の2つのポイントを使用して、追加のコードを記述せずに、リモートハードウェアオンデマンドストリームに直接接続します。
簡単なソリューションを繰り返し開発することで、それがどれほど役立つかを示す予定です。他のアプローチと比較して、いくつかの重要な利点があります。 ROSはクロスプラットフォームをサポートしており、バックグラウンドで処理されるピア接続を介して、複数のデバイスのプロセス間の接続を可能にします。この設計により、C ++通信クラスを決定するとき、または言語インターフェース用に手動でクラスを開発するときに、任意の言語をサポートできます。
ROSは独自のコミュニティによって作られています。数年後、システムアーキテクチャのおかげで、統合が容易な再利用可能なパッケージが多数生まれました。
次のような代替アプローチ MRPT 、 カルメン 、 LCM 、 プレーヤー 、 Microsoft RDS その他は、これらの機能のすべてではなく一部を提供します。ほとんどの場合、設計上の欠陥は、言語サポートの制限、プロセス間の不十分な通信、またはさまざまなデバイスのサポートの欠如であり、これはおそらく解決が最も難しい問題です。
私たちの焦点はフレームワークであり、アルゴリズム自体ではないため、特定の問題については、与えられた問題は非常に単純になります。私たちの目標は、プロセスの一部であり、コンピューターのゲームパッドとロボットに取り付けられたカメラからの送信を使用して、Wi-Fi経由で接続されたロボットをリモートで制御および監視できるコンピューター用のソフトウェアを構築することです。 。
最高のパフォーマンスのクオンツヘッジファンド
まず、ROSの基本原理を示すために、単純なプログラムを単純なシミュレーションに接続します。ゲームパッドをコンピューターにリンクし、ゲームパッドの入力をロボットの制御信号に渡すための優れた制御スキームの設計を試みます。
ROSコードを書くための主な言語はC ++とPythonですが、パフォーマンスを下げるにはC ++が推奨されます。例を説明します Python コード内の修飾子が少なく、特定の構文を実行する必要がないためです。
ROSバージョンは名前で参照されます。現在までのところ、最新のリリースは 翡翠亀 、およびLTSバージョンは インディゴイグルー 。バージョンからの移行が望ましく、ROSでの下位互換性は保証されていないため、すべての例は次のように記述されます。 インジゴ 。
ROSは、さまざまな* NIXプラットフォームで利用できます。公式にサポートされているバージョンはUbuntuにあります。 OS X、Arch Linux、Debian、Raspbian、およびAndroidバージョンはコミュニティによってサポートされています。
デスクトップにUbuntu14.04のインストールプロセスが表示されます。サポートされているすべてのバージョンとプラットフォームのプロセスは、 公式サイト 。 ROSがすでにインストールされている仮想マシンも利用できます。
インストールはプラットフォームに依存します(ほとんどのプラットフォームにはパッケージがバンドルされています)が、ワークスペースの設定はすべてのプラットフォームで同じです。 。
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
ナビゲーションと知覚のためのさまざまなシミュレーターとライブラリーを含む、すべての公式機能を備えています。
より良い仕事の経験のために、完全なオプションが推奨されます。ノードの実行のみに使用されるデバイスへのインストールには、aseバージョンで十分です。ただし、どのオプションを選択しても、package_name
と呼ばれる必要なパッケージをインストールできます。実行時:
sudo apt-get install ros-indigo-
最終的な名前では、アンダースコアがハイフンに置き換えられているため、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
の主な役割つまり、他のノードが接続する必要があるノードとその方法(ネットワークポートまたは共有メモリのいずれかを介して)をノードに通知します。目標は、すべての通信を実行するために必要な時間または帯域幅を最小限に抑えながら、ノードが接続するノードではなく、知りたいデータのみを心配できるようにすることです。
roscore
を実行した後、ROSのメインGUIツールを起動できます:rqt
。私たちが見ているのは非常に残念です-空のウィンドウ。 rqt
これは、任意の視覚的構成および任意の数の事前定義されたビューで構成できる多種多様なプラグインをホストします。
まず、プラグインを実行します ロボットステアリング 、Plugins > Robot Tools > Robot Steering
で選択します。取得するのは2つのスライダーです。これらは、ロボットに持たせたい直線運動と回転運動を表します。プラグインの上部に、/cmd_vel
のテキストボックスが表示されます。彼女の中。別の名前を付けることができます。パブリケーションの対象となるトピックの名前を表します。ターミナルツールは、バックグラウンドで何が起こっているかを確認するのに最適な場所です。
nodejsは何をしますか
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
平均480B / 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
ノードに関する詳細なデータが表示されます。ツールrostopic
、rosmsg
およびrosnode
これらは、未研磨のROS機能を検査するための主要なツールです。 ROSにはさらに多くのGUIおよびターミナルツールがありますが、これらはこの紹介では範囲外です。
ROSノードを実行するための主なツールはrusrun
およびroslaunch
。 rosrun
rosrun
、およびroslaunch
を介してノードを実行できます。起動ファイルに基づいてノードを実行します。これらはROS自動化の最も複雑な要素であるため、あまり馴染みがありません。
実行するすべてのものをシャットダウンして、最初のコードの作業を開始できます。将来の参考のために、ROSに関連するものを実行するには、roscore
のアクティブなインスタンスが必要であることは明らかです。発生した問題の多くは、実行中のターミナルウィンドウを閉じることで解決できますroscore
新しいものを開いて再起動します。これにより、bash
の両方で再ロードする必要のあるすべての依存関係が更新されます。およびroscore
。
ボットをプログラムする方法
私たちの最初の目標は、Robot Steering
の機能を模倣することです。 geometry_msgs/Twist
からデータを公開するノードを作成するa /cmd_vel
ゲームパッドの入力に基づいています。最初に立ち寄るのは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
ができました。フォルダ内に、scripts
というフォルダを作成します。これには、すべてのPythonスクリプトが含まれます。
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
も設定する必要がありますしたがって、スクリプトは実行可能です。実行rosrun joy joy_node
ターミナルでrosrun toptal_tutorial teleop.py
別の方法では、ターミナル出力teleop.py
がメッセージでいっぱいになります 喜び 。
コードが何をするのか調べてみましょう。
まず、インポートします rospy 、ROSフレームワークと対話するためのライブラリをホストします。各メッセージ定義パッケージには、サブパッケージがありますmsg
メッセージ定義付き。インポートしていますJoy
入力を処理します。特に言及しない限り、埋め込まれたメッセージタイプ(Header
from std_msgs.msg
メッセージ内にあるJoy
など)をインポートする必要はありません。
最初のステップは、特定の名前でノードを初期化することです(この場合、それを「teleop」と呼びます)。その後、トピックタイプ「joy」sensor_msgs.msg.Joy
をサブスクライブし、joy_callback
関数を呼び出すことによって各メッセージを処理するサブスクライバーを作成します。コールバックはパラメータ、メッセージデータを受け取ります。データメンバーへのアクセスは簡単です。最初の状態を印刷したい場合 軸 、メッセージタイプを覚えている場合は、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
を介してバインディングを使用した関数引数のサポートを追加します。 pub
に公開する広告主cmd_vel
を作成します。メッセージタイプTwist
。その広告主をコールバックに結び付け、メッセージを投稿させます ねじれ 各エントリで、速度は最初の2つで表されます 軸 。このコードは期待どおりの動作をし、rostopic echo /cmd_vel
を介して結果の出力を確認できます。
まだ問題があります。トピック/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
ループ内で変更します。関数sleep
のrospy.Rate
安定した出力周波数を維持します。
最終的なコードは、トピック/cmd_vel
になります。 10 Hzのコマンド速度を取得し、プラグイン出力を模倣します ロボットステアリング rqt
私たちの最初の目標は、達成したいシナリオをシミュレートできる環境を作成することです。ノードstageros
パッケージ内stage_ros
これにより、画像で定義された2Dステージでロボットを実行できるようになります。で説明されている全体の合成があります パッケージstage_ros
世界のアーカイブとそれらを生成する方法について。これはかなり簡単ですが、手の届かないところにあります。幸いなことに、パッケージにはいくつかのワールドデモが付属しています。まず、実行してファイルディレクトリに移動しましょう。
roscd stage_ros cd world
フォルダ内にはいくつかのファイルがあります。実行してみましょう。
rosrun stage_ros stageros willow-erratic.world
さまざまなテーマが作成されました。それぞれの意味もパッケージに記載されています。重要なのは、cmd_vel
があるということです。
示されているステージ内には青いボックスがあり、これはあなたが制御するロボットを表しています。私たちのコードを使用するか、 ロボットステアリング このロボットを制御できます。それを試してみてください!
まず、フォルダを作成しますlaunch
またはlanzamiento
パッケージ内とパッケージ内にteleop.launch
というファイルを作成します。フォルダの最終的な構造は次のようになります。
toptal_tutorial/ ├── CMakeLists.txt ├── launch │ └── teleop.launch ├── package.xml ├── scripts │ └── teleop.py └── src
ファイル内teleop.launch
いくつかのノードとそれらの相互接続を定義します。
robot_
新しい世界は4台のロボットで構成されており、各テーマにはrobot_0/cmd_vel
という接頭辞が付いています。したがって、ロボット番号0には、robot_0
というコマンド速度のテーマがあります。これが、roscore
という名前の名前空間内にコントロールを配置する理由です。そのため、名前を新しい形式に調整します。このようにして、トピック名をファイルシステム内のフォルダーと考えることができます。
安全なパスワードを設計するときにWebサイトによって発行される最も一般的なガイドラインのいくつかは次のとおりです。
起動ファイルを実行するのにroscore
は必要ありません。ある意味で、roscore
これは、何もしない起動ファイルの特殊なケースです。 roslaunch toptal_tutorial teleop.launch
の場合最初に起動された起動ファイルのみがカーネルを実行し、残りはカーネルに接続します。次に、次のコマンドで起動を実行します。
/robot_/base_pose_ground_truth /robot_/base_scan_0 /robot_/base_scan_1 /robot_/camera_info_0 /robot_/camera_info_1 /robot_/cmd_vel /robot_/depth_0 /robot_/depth_1 /robot_/image_0 /robot_/image_1 /robot_/odom
すべてが正常であれば、4つのロボットを備えたシミュレーターが作成され、それぞれがゲームパッドまたはジョイスティックで制御されます。この世界には、前回よりもはるかに多くのコンテンツがあります。 4台のロボットにはそれぞれ次のものがあります。
rqt
0、1、2、または3に置き換えます。これで最後のトピックになります。
rqt
でデータを表示する以前は、image_0
について詳しく説明していませんでした。しかし、これはより複雑なデータを視覚化するのに最適なツールです。すべてのテーマを試すことができますが、ここではテーマimage_1
、depth_0
、depth_1
、およびrqt
に焦点を当てます。
実行中Plugins > Visualización > Vista Imagen
開いているプラグインをすべて削除します。次に、4つの画像ビューア(robot_0
)を開き、2x2グリッドに配置します。最後に、各ビューの左上隅で、stage_ros/world
用に設定された4つのテーマの1つを選択します。
私たちが得ているのは、低解像度カメラによる深い知覚の立体視です。入力システムがなくてもこの結果が得られた可能性があることに注意してください。これを実行した場合(フォルダー内からrosrun stage_ros stageros willow-four-erratics-multisensor.world
):
/robot_0/cmd_vel
そして、プラグインを追加します ロボットステアリング export ROS_MASTER_URI=http://:11311/
というトピックでコントロールが画面に表示されていれば、同じ結果が得られた可能性があります。
多くのハードウェアは、多くの場合サードパーティのおかげで、ROSを完全にサポートしています。多くのロボットプラットフォームには、これらのタイプのメッセージを生成するドライバーがあり、ROSには、Webカメラをアクティブにして画像のフィードを公開するノードがあります。
最後の結果は、私たちが達成したいことのシミュレーションでしたが、以下の変更で同じことが達成できます。
rqt
を追加します。 Bashで起動すると、リモートコンピューターがそのホストとポートを確認しますgazebo
および/またはロボットを監視および制御するためのスクリプト最終的には、適切な変数環境のみをリモートデバイスにエクスポートする必要があり、その他はすべてそれ自体で実行されます。コンピュータークラスターでROSを実行すると、各マシンで準備をするのに1つのステップしかかかりません。
各コードで、どんなに小さくても、好きなように操作できる複雑な変数システムを作成する方法を示しました。シンプルなパブリッシャー/サブスクライバーシステムにより、コンピューターのクラスター上でデータを処理する迅速なソフトウェア開発が可能になり、特定の要素の基本的な実装について心配する必要がないため、安心できます。
単純なシミュレーターを使用しますが、
|_+_|のような他のより複雑なシミュレーター(フルデスクトップバージョンに含まれています)作成することができます 複雑な物理センサーを備えた3Dの世界 そしてそれはあなたにそれが開発される前にあなたに最終結果と製品の経験を与えます。
この紹介はやや基本的なものでしたが、この用途の広いフレームワークでの作業にもっと興味を持っていただければ幸いです。