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上。



その間...



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




All Articles