Robotic Operating System 2の基本:世界に「こんにちは、世界!」

地球の自転のすべての段階に良い!
今日は、ROSシステムの知識を継続します。これにより、ロボット制御システムを簡単かつ簡単に作成できます。 前のレッスンを逃した人のために-おおよその作業計画。
  1. インストール、基本概念
  2. 私たちは独自のパッケージを作成し、簡単なプログラムであるメッセージに精通します
  3. サービスとオプション

前回、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 

 #!/usr/bin/env python #    #      import roslib roslib.load_manifest('tutorial') #   . rospy  ROS  Python, #String -         import rospy from std_msgs.msg import String def talker(): #    chatter     String pub = rospy.Publisher('chatter', String) # ROS,     rospy.init_node('talker') # ROS ,   while not rospy.is_shutdown(): str = "Zooo! %s"%rospy.get_time() rospy.loginfo(str) pub.publish(String(str)) rospy.sleep(1.0) if __name__ == '__main__': try: talker() except rospy.ROSInterruptException: pass 


これはトーカーモジュールであるため、公開するメッセージの形式を指定する必要があります。
 $ echo "string str" > ./msg/Str.msg 

次のデータ型がサポートされています。

必要なのは、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) { //  ROS_INFO("There something on the line! [%s]", msg->data.c_str()); } int main(int argc, char **argv) { //  listener ros::init(argc, argv, "listener"); ros::NodeHandle n; //,     chatter,        1000, //   -   chatterCallback ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); //spin     callback   ,  ROS    ros::spin(); return 0; } 

少し変更する必要があります。
 vi ./CMakeLists.txt 

最後から2番目の行を次の形式にする必要があります。
 rosbuild_add_executable(listener src/listener.cpp) 

ここでもmakeを実行しますが、実行可能ファイルをコンパイルします。
すべて、作業を評価するために残り、最大4つのターミナルを開きます。
  1. roscoreはマスタープロセスを起動します
  2. rosrunチュートリアルtalker.pyはPublisherを起動します
  3. rosrun tutorialSubcriberリスナーはサブスクライバーを起動します
  4. rxgraphはノード接続図を表示します

この図は、メッセージテキストが2回印刷されることを示しています-リスナーノード上と標準出力の類似であるrosout上。

その間...


一方、党は勢いを増しています。 人々は条件に達し、ビリヤードの小さなゲームをプレイすることにしました。 しかし、何かがうまくいかなかった...

Source: https://habr.com/ru/post/J128046/


All Articles