ROS ROSの研究では、メッセージとサービスを作成し、9-ノート

2つのサブセクションセクションは公式文書から来る:
1. 使用して編集するrosed
2. ROSメッセージサービスを作成します。

まず外観はrosed:

  1. rosed
    rosedコマンドはrosbash直接次のように、位置使用されるファイルのフルパスを入力することなく、パッケージを編集することができrosed使用して、ファイルの一部:
    $ rosed [パッケージ名] [ファイル名]
    

    例えば、我々はroscppパッケージはLogger.msgを追加し編集するには、次のコマンドを入力します。

    $ roscpp Logger.msg rosed
    

     Logger.msgが編集モードの使用のvimを入力して開きます。
    一方、次のようにキーの自動補完機能が使用されているタブの使用をサポートしrosed:

    $ rosed [パッケージ名] <タブ> <タブ>
    

    例えば:

    $ rosed roscpp <タブ> <タブ>
    

    注意:タブとパッケージ名の間に2つのスペースがあります。
    これは、すべてのファイルのroscppパッケージを示しています。

    Empty.srv roscpp.cmake 
    genmsg_cpp.py roscppConfig.cmake 
    gensrv_cpp.py roscppConfig-version.cmake 
    GetLoggers.srv roscpp-MSG-extras.cmake 
    Logger.msg roscpp-MSG-paths.cmake 
    msg_gen.py SetLoggerLevel.srv 
    のpackage.xml                 
    

     そして、また、デフォルトのvimエディタを使用して、エディタを指定することができrosed、エディタは〜/ .bashrcファイルを設定することで指定することができ、環境変数は:
    例えば、エディタnanoのエディタを設定するためのコマンドを入力します。

    輸出EDITOR = 'ナノ-w'
    

     また、次のコマンドセットのgeditを使用することがあります。

    輸出EDITOR = 'geditの-w'
    
  2. msgとSRV文書プレゼント
    • MSG:MSGファイルは、テキストファイルのMSGニュースメンバーROS記載されているが、彼は別の言語でメッセージコードを生成することができます。
    • SRV:SRVサービス記述ファイル、テキストファイルの種類ROSのメンバーである、彼は二つの部分では、要求と応答が含まれています。
    MSGは、各行は、ファイルタイプと変数名が含まれています。
    変数タイプは次のタイプのものであってもよい式中:
    • INT8、INT16、INT32、int64型(およびUINT)
    • float32、float64型
    • 時間、期間
    • 他のメッセージタイプ
    • 可変長の配列と所定の長さ[]
    特殊なタイプ、タイプ・ヘッダ(ヘッダ)も存在し、ヘッダタイプは、タイムスタンプとしばしばROSに使用される軸情報を含みます。次のように定義される一般的なメッセージROS:
    ヘッダーヘッダー
      文字列child_frame_id 
      geometry_msgs / PoseWithCovarianceポーズを
      geometry_msgs / TwistWithCovarianceツイストを
    

    SRVファイルはMSG同様の定義だけでなく、異なる列、変数名と変数の型を含む各列、SRVが、1つの行を有する2つの部品三のダッシュ二つの部分の要求(リクエスト)および応答(Response)を含み、 - - 分離しました。例えば:

    int64型
    Int64のB 
    --- 
    Int64の合計
    

    上記の例では、AとBの要求、合計応答です。

  3. MSGを使用してください
    1. 作成MSG
      、このような袋前の例では、新たなMSGを作成するには、次のコマンドを使用してのように:
      $ roscd beginner_tutorials 
      $ます。mkdir MSG 
      $エコー"のint64 NUM"> MSG / Num.msg
      

      MSGだけ一行は、当然のことながら、より複雑なMSGを作成することができます

      文字列first_nameの
      文字列のlast_name 
      UINT8年齢
      UINT32スコア
      

       その後、MSGファイルは、他の言語のコードに変換できることを確認するために、あなたは確認する必要があるのpackage.xmlを次の2行に存在し、ビューの発見がコメントアウトされた後):(コメントアウトされていません

      <build_depend> message_generation </ build_depend> 
        <exec_depend> message_runtime </ exec_depend>
      

      コンパイル中に、我々は動作時に、我々はmessage_runtimeを有効にする必要があり、message_generationを有効にする必要があります。
      次に開くために、お気に入りのエディタを使用しCMakeLists.txtを(あなたがrosed使用することができます)
      、その後にfind_packageのエントリのmessage_generationを追加します。

      ##尾状花マクロやライブラリを探す
      find_package(尾状花必要なコンポーネントのXYZ)などのコンポーネントのリストがあれば## 
      】使用され、また、他の尾状花パッケージの見つけ
      find_package(尾状花必要なコンポーネント
        roscpp 
        rospy 
        std_msgsのmessage_generationを
        
      

       また、確認して実行時の依存関係は、メッセージに依存して、コメントを追加しました:

      catkin_package(
      #1 INCLUDE_DIRSは、
      begginner_tutorials#ライブラリを
      #CATKIN_DEPENDS roscpp rospy std_msgs 
      位system_libは異なり
      message_runtime CATKIN_DEPENS 
      

      コードスニペットのメッセージファイルを検索します。

      #1 add_message_files(
      #FILES 
      #Message1.msg 
      #Message2.msg 
      #)
      

       コメントを解除し、メッセージ・ファイル名を追加します。

      add_message_files(
        FILES 
        Num.msg 
      

      generate_messageが呼び出されたことを確認します

      generate_messages(
        依存関係
        std_msgs 
      
    2. 情報のMSGを確認してください
      情報を定義した後、あなたは情報メッセージを表示しrosmsgコマンドを使用することができます。
      $のrosmsgショー[メッセージタイプ]
      

      例えば、以下のコマンドを使用して、上記で定義された情報に:

      $ rosmsgショーbeginner_tutorials /テンキー
      

      これは、リターンとして見ることができます。

      int64モード
      

       あなたは次のパッケージ内のメッセージが、あなたが書くことができるか覚えていない場合、私は、完全なパスを記述することはできません。

      $ rosmsgショーのNum
      

       戻り値:

      [beginner_tutorials /数字]:
      NUMのInt64
      
  4. SRVを使用してください
    1.  SRVの作成
      と同様のMSGを、我々は最初のフォルダのSRVを作成します。
      $ roscd beginner_tutorials 
      $ます。mkdir SRV
      

      次のようにこれであなたは手動で以下に再現ROS、roscpのコマンド・ファイルに、ここで提示SRVの残りの部分の上にファイルをコピーすることができ、ファイルを書き込むことができSRV、コマンドが使用されます。

      $ roscp [パッケージ名] [file_to_copy_path] [copy_path]
      

      その後、我々はなりrospy_tutorialsは上のSRVファイルのパッケージをコピーします。

      $ roscp rospy_tutorials AddTwoInts.srv SRV / AddTwoInts.srv
      

       そしてまた、package.xmlの中で(同じMSGでステップ)message_generationのmessage_runtimeを有効にします。

      その後、コールfind_packageの中message_generation(MSGと同じ)を追加します。
      違いは、対応するサービスエントリに追加するコールadd_service_filesです。

      add_service_files(
        FILES 
        AddTwoInts.srv 
      
    2. 表示SRV情報
      rosmsgと同様に、ROSはまた、SRVサービス関連情報を参照するにはrossrvを提供しています。
      例えば:
      $ rossrvショーbeginner_tutorials / AddTwoInts
      

      戻り値:

      int64型
      Int64のB 
      --- 
      Int64の合計
      

      あなたは、パスを追加することはできません。

      $ rossrvショーAddTwoInts 
      [beginner_tutorials / AddTwoInts]:
      int64モード
      のInt64 B 
      --- 
      Int64の合計
      
      [rospy_tutorials / AddTwoInts]:
      int64モード
      のInt64 B 
      --- 
      int64型の和
  5. 一般的手順(祭りはコンパイルステップと改名されるべきであると個人的な感情)
    上記の手順が完了した場合、あなたはこれらのmsgとSRVをコンパイルすることができ、CMakeLists.txtは、次の行のコメントを解除しました:
    generate_messages(
      依存関係
      std_msgs 
    

    そして、catkin_makeのコンパイルを実行します。

    あなたの尾状花ワークスペースで#
    $ roscd beginner_tutorials 
    $ CD ../ .. 
    $ catkin_makeインストール
    $のCDを-
    

     msgとSRVファイルは、他の言語のコードにコンパイルされます。例えば、MSGは、C ++ヘッダファイルに含ま〜/ catkin_ws / develの/含む/ beginner_tutorials / で、
    Pythonソースファイルはに含まれます〜/ catkin_ws / develの/ LIB / python2.7 / DIST-パッケージ/ beginner_tutorials / MSG で、
    〜/ catkin_ws / develの/共有/ -COMMONのLisp / ROS / beginner_tutorials / MSG /インチ
    C ++意志とMSGファイルのSRVファイルが統一されたフォルダ内のソースファイルを生成し、SRVファイルのPythonとLispは、同じディレクトリ内のmsgフォルダを、別のSRVフォルダ内のフォルダをファイルを生成しました。
    C ++のヘッダファイルでのMSGの外観:

    //ファイルbegginner_tutorialsからgencppによって生成/ Num.msg 
    //は、編集しないでください!
    
    
    #ifndefのBEGGINNER_TUTORIALS_MESSAGE_NUM_H 
    の#define BEGGINNER_TUTORIALS_MESSAGE_NUM_H 
    
    
    の#include <ストリング> 
    の#include <ベクトル> 
    の#include <地図> 
    
    の#include <ROS / types.h>に
    する#include <ROS / serialization.h> 
    の#include <ROS / builtin_message_traits.h> 
    の#include <ROS / message_operations.h> 
    
    
    名前空間begginner_tutorials 
    { 
    テンプレート<クラスContainerAllocator> 
    構造体Num_ 
    { 
      Num_のtypedef <ContainerAllocator>タイプ。
    
      Num_()
        :NUM(0){ 
        } 
      Num_(CONST ContainerAllocator&_alloc) ボイド)_alloc。
    
    
    
       int64_tの_num_typeのtypedef。
      _num_type num個。
    
    
    
    
    
      :: shared_ptrの<:: begginner_tutorials :: Num_ <ContainerAllocator>> Ptrを高めるのtypedef。
      :: shared_ptrの<:: begginner_tutorials :: Num_ <ContainerAllocator>のconst> ConstPtrを高めるのtypedef。
    
    }。//構造体Num_ 
    
    のtypedef :: begginner_tutorials :: Num_ <はstd ::アロケータ<空>>のNum。
    
    :: shared_ptrの<:: begginner_tutorials :: num>はNumPtr後押しのtypedef。
    typedefのブースト:: shared_ptrの<:: begginner_tutorials ::ヌムのconst> NumConstPtr。
    
    行定義のうち必要//定数
    
    
    
    テンプレート<型名ContainerAllocator> 
    のstd ::のostream&演算子<<(STD ::のostream&S、CONST :: begginner_tutorials :: Num_ <ContainerAllocator>&
    ROS :: message_operations ::プリンタ<:: begginner_tutorials :: Num_ <ContainerAllocator>> ::ストリーム(S、 ""、v)は、
    返却値; 
    } 
    
    } //名前空間begginner_tutorials 
    
    名前空間ROS 
    { 
    名前空間message_traits 
    { 
    
    
    
    // BOOLTRAITS { 'IsFixedSizeの': 'IsMessage' TRUE:真、 'HasHeader':偽} 
    // { 'std_msgs':[ 'は/ opt / ROS /運動/シェア/ std_msgs / cmakeの/../ MSG '] 'begginner_tutorials':[' /ホーム/少/ catkin_ws / SRC / begginner_tutorials / MSG ']}
    
    // !!!!!!!!!!! [ '__class__'、 '__delattr__'、 '__dict__'、 '__doc__'、 '__eq__'、 '__format__'、 '__getattribute__'、 '__hash__'、 '__init__'、 '__module__'、 '__ne__'、 '__new__'、 ' __reduce__」、 '__reduce_ex__'、 '__repr__'、 '__setattr__'、 '__sizeof__'、 '__str__'、 '__subclasshook__'、 '__weakref__'、 '_parsed_fields'、 '定数'、 'フィールド'、 'FULL_NAME'、 'has_header' 'header_present'、 '名前'、 'パッケージ'、 'parsed_fields'、 'SHORT_NAME'、 'テキスト'、 'タイプ'] 
    
    
    
    
    テンプレート<クラスContainerAllocator> 
    構造体IsFixedSizeの<:: begginner_tutorials :: Num_ <ContainerAllocator>> 
      :TrueTypeフォント
      {}。
    
    テンプレート<クラスContainerAllocator> 
    構造体IsFixedSizeのトピック<:: begginner_tutorials :: Num_ <ContainerAllocator> CONST> 
      :TrueTypeフォント
      {}。
    
    テンプレート<クラスContainerAllocator> 
    構造体IsMessage <:: begginner_tutorials :: Num_ <ContainerAllocator>> 
      :TrueType フォント
      {}。
    
    テンプレート<クラスContainerAllocator> 
    構造体IsMessage <:: begginner_tutorials :: Num_ <ContainerAllocator> CONST> 
      :TrueTypeフォント
      {}。
    
    テンプレート<クラスContainerAllocator> 
    構造体HasHeader <:: begginner_tutorials :: Num_ <ContainerAllocator>> 
      :FalseType 
      {}。
    
    テンプレート<クラスContainerAllocator> 
    構造体HasHeader <:: begginner_tutorials :: Num_ <ContainerAllocator> CONST> 
      :FalseType 
      {}。
    
    
    テンプレート<クラスContainerAllocator> 
    構造体のmd5sum <::
      静的定数のchar *値()
      { 
        リターン"57d3c40ec3ac3754af76a83e6e73127a"。
      } 
    
      静的定数のchar *値(CONST :: begginner_tutorials :: Num_ <ContainerAllocator>&){戻り値(); } 
      静的定数uint64_tをstatic_value1 = 0x57d3c40ec3ac3754ULL。
      静的定数uint64_tをstatic_value2 = 0xaf76a83e6e73127aULL。
    }。
    
    テンプレート<クラスContainerAllocator> 
    構造体データ型<:: begginner_tutorials :: Num_ <ContainerAllocator>> 
    { 
      静的定数チャー*値()
      { 
        リターン"begginner_tutorials /民"。
      } 
    
      静的定数のchar *値(CONST :: begginner_tutorials :: Num_ <ContainerAllocator>&){戻り値(); } 
    }。
    
    テンプレート<クラスContainerAllocator> 
    構造体定義<:: begginner_tutorials :: Num_ <ContainerAllocator>> 
    { 
      静的定数チャー*値()
      { 
        戻り"NUMする\ n \のInt64 
    "; 
      } 
    
      静的定数のchar *値(CONST :: begginner_tutorials :: Num_ <ContainerAllocator>&){戻り値(); } 
    }。
    
    } //名前空間message_traits 
    } //名前空間ROS 
    
    名前空間ROS 
    { 
    名前空間シリアライゼーション
    { 
    
      テンプレート<クラスContainerAllocator>構造体シリアライザ<:: begginner_tutorials :: Num_ <ContainerAllocator>> 
      { 
        テンプレート<型名ストリーム、型名T>インライン静的ボイドallInOne(ストリーム・ストリーム、
        } 
    
        ROS_DECLARE_ALLINONE_SERIALIZER 
      }。//構造体Num_ 
    
    } //名前空間の直列化
    } //名前空間ROS 
    
    名前空間ROS 
    { 
    名前空間message_operations 
    { 
    
    テンプレート<クラスContainerAllocator> 
    構造体のプリンタ<:: begginner_tutorials :: Num_ <ContainerAllocator>> 
    { 
      テンプレート<typenameにストリーム>静的ボイドストリーム(ストリーム&S 、CONSTのstd ::文字列&インデント、CONST :: begginner_tutorials :: Num_ <ContainerAllocator>&V)
      { 
        S <<インデント<< "NUM:"。
        プリンタ<int64_tの> ::ストリーム(S、インデント+ ""、v.num)。
      } 
    }。
    
    } //名前空間のmessage_operations 
    } //名前空間のROS
    
    #endifの// BEGGINNER_TUTORIALS_MESSAGE_NUM_H
    

    それは非常に複雑でした。

おすすめ

転載: www.cnblogs.com/spyplus/p/11544359.html
おすすめ