地球の自転のすべての段階に良い!
今日は、ROSシステムの知識を継続します。これにより、ロボット制御システムを簡単かつ簡単に作成できます。 前のレッスンを逃した人のために-おおよその作業計画。
- インストール、基本概念
- 私たちは独自のパッケージを作成し、簡単なプログラムであるメッセージに精通します
- サービスとオプション
前回、ROSの基本要素はパッケージであることがわかりました。 教育プロセスはこの面白い事実を通り抜けることができないので、虫眼鏡や顕微鏡を強くしてください-私たちは勉強します!
この場合、最も便利なのは独自のパッケージを作成することです。 何も損なわず、ROS微生物叢を良好な状態に維持するために、すべての実験用に個別のディレクトリを作成します。 私の場合は〜/ rosになります。
. /opt/ros/electric/setup.sh cd mkdir ros cd ./ros export ROS_PACKAGE_PATH="~/ros:/opt/ros/electric/stacks"
最後の行は、標準パッケージリポジトリへのパス(番号2)とユーザーパス(この場合、パス番号1)を格納する環境変数を設定します。 特に好奇心reader盛な読者は、カスタムスタックを作成することをお勧めします。 残念ながら、これは誤った仮定になります-stack.xmlマニフェストファイルがありません。 ただし、これは修正可能ですが、今では絶対に必要ではありません。 そして今が聖saの時です。
まとめてください
パッケージはroscreate-pkgコマンドで作成され、次のように呼び出されます。
$ roscreate-pkg tutorial std_msgs rospy roscpp
最初の引数はパッケージの名前で、その後に依存関係のリストが続きます(それらについては後ほど説明します)。 ここで、前回のレッスンですでに知られているrospackチームを使用してパッケージを登録する必要があります。
rospack profile rospack find tutorial /home/crady/ros/tutorial
すべてが順調に進んでいるようです。 しかし、パッケージを別のマシンで実行するとどうなりますか? また、ROSの別のバージョンがある場合は? そして、もしそうなら、そしてすぐに、ああ、ああ、ああ? 依存関係の追跡は、これらすべてに役立つはずです。 ROSは、パッケージ間の2種類の接続を区別します-最初の段階と他のすべての段階です。 モジュールのマニフェストを見ると、すぐに区分が明確になります。
cat ./ros/tutorial/manifest.xml
<package> <description brief="tutorial"> tutorial </description> <author>crady</author> <license>BSD</license> <review status="unreviewed" notes=""/> <url>http://ros.org/wiki/tutorial</url> <depend package="std_msgs"/> <depend package="rospy"/> <depend package="roscpp"/> </package> </source>
ここで、<depend>属性には、最初のステージの依存関係がリストされています。 彼らが必要とするのは「間接的な」要件だけです。 毎回マニフェストを登らないようにするために、rospackコマンドを再び使用できます。
$ rospack depends1 tutorial std_msgs rospy roscpp $ rospack depends tutorial rospack roslib std_msgs rosgraph_msgs rosbuild roslang rospy cpp_common roscpp_traits rostime roscpp_serialization xmlrpcpp rosconsole roscpp
理論はほとんど残っていないので、最もおいしいコードの記述に移ります。
それから彼は私に言います...
パッケージの準備ができており、MRFを使用して写真のエネルギーを計算できる、できる、ということができるとします。 たぶんいつか私はそれがどのように、そしてなぜ、あなたに言うでしょう、それはポイントではありません。 これを使用するためには、明らかに、実行可能ファイル(前回のレッスンで覚えているように、ROSで[ノード]ノードと呼ばれます)、入力で何か(たとえば、画像)を受け取らなければなりません。 (たとえば、数字または一連の数字)を配る。 多種多様なライブラリがあるため、入力データと出力データの形式を標準化することは理にかなっています。 これは、
メッセージメカニズム(msg)を使用して行われ
ます 。 実際、特定の
トピック (トピック)でサブ
スクライバー (サブスクライバー)とチャットするパブリッシャー(パブリッシャー)のシステムを取得します。
したがって、将来のアプリケーションのフレームワークといくつかの理論的知識があります。 これらのとんでもない骨の上に肉を作り、ROSのプログラムがどのように見えるかを見てみましょう。
そして、あなたはコーディングします...
メッセージの発行者をすばらしいPython言語で作成します。 むしろ、それはハローワールドであるべきでしたが、私たちは独自の方法でメッセージのテキストを変更します! パッケージのあるフォルダーに行きましょう:
$ cd $(rospack find tutorial)
スクリプト用のフォルダーを作成します。
$ mkdir scripts
そして、その中に単純なテキストファイルを作成します。
$ vi ./scripts/talker.py
これはトーカーモジュールであるため、公開するメッセージの形式を指定する必要があります。
$ echo "string str" > ./msg/Str.msg
次のデータ型がサポートされています。
- int8、int16、int32、int64(およびuint *)
- float32、float64
- ひも
- 時間、期間
- 他のmsgファイル
- 可変長および固定長の配列(それぞれ配列[]および配列[C])
必要なのは、1つのパラメーターに対応する1行で、テキストフィールドに必要なフィールドをリストするだけです。 「それだけですか?」読者は尋ねます。 まあ、一般的には、はい。 msgコードはローカルメイクによって生成されます。 ところで、私たちがやる時です。
$ vi ./CMakeLists.txt
必要なのは、次の行のコメントを外すことだけです。
rosbuild_genmsg()
これにより、ノードが情報を誰かと共有したいことをシステムが理解し、適切なコードをコンパイルする必要があります。
すべて、コンソールに入力します
$ make $ chmod +x ./scripts/listener.py
楽しんでください。 はい、ここのPythonでは、実際にはメッセージ用にmakeも必要です。 chmodはファイルを実行可能としてマークします(これは重要です!)。
それまでの間、私たちは同様に素晴らしいC ++言語で対話者に対処します。 はい、msgsメカニズムにより、まったく異なるノードが問題や不要なジェスチャーなしで通信できます。
新しいパッケージを作成します。
$ roscreate-pkg tutorialSubscriber roscpp std_msgs $ cd tutorialSubscriber/ $ vi ./src/listener.cpp
#include "ros/ros.h" #include "std_msgs/String.h" void chatterCallback(const std_msgs::String::ConstPtr& msg) {
少し変更する必要があります。
vi ./CMakeLists.txt
最後から2番目の行を次の形式にする必要があります。
rosbuild_add_executable(listener src/listener.cpp)
ここでもmakeを実行しますが、実行可能ファイルをコンパイルします。
すべて、作業を評価するために残り、最大4つのターミナルを開きます。
- roscoreはマスタープロセスを起動します
- rosrunチュートリアルtalker.pyはPublisherを起動します
- rosrun tutorialSubcriberリスナーはサブスクライバーを起動します
- rxgraphはノード接続図を表示します
この図は、メッセージテキストが2回印刷されることを示しています-リスナーノード上と標準出力の類似であるrosout上。
その間...
一方、党は勢いを増しています。 人々は条件に達し、ビリヤードの小さなゲームをプレイすることにしました。 しかし、何かがうまくいかなかった...