個人ブログ:http://www.chenjianqu.com/
オリジナルリンク:http://www.chenjianqu.com/show-72.html
この記事では、私の学習ROSノートでゼロからのコマンドライン機能パックを作成する方法について説明します。サービス・ベースの通信roscppと通信の話題rospyベース。
通信roscppに基づくA.サービス
1.まず、ワークスペースを作成
ワークスペースを作成するには尾状花、コンパイルディレクトリ尾状花パッケージを変更します。
(ベース)が陳をchenjianqu @:〜$ CD ROS (ベース)が陳をchenjianqu @:〜/ ROS $ CDプロジェクト (ベース)chenjianqu陳@:〜/ ROS /プロジェクトWS2 $ます。mkdir -p / srcの 陳@(ベース)chenjianquを: 〜/ ROS /プロジェクトの$のCD WS2 (ベース)が陳をchenjianqu @:〜/ ROS /プロジェクト/ WS2 $ catkin_make#初期のワークスペース
尾状花ワークスペースは、SRC、ビルド、develの3つのフォルダが含まれています。
SRC /:パッケージのROSの尾状花(ソースパッケージ)
ビルド/:尾状花(CMakeの)と中間ファイルキャッシュ情報
develの/:得られたオブジェクトファイル、環境変数(ヘッダファイル、ダイナミックリンクライブラリ、静的にリンクされたライブラリ、実行可能ファイル、等を含みます)
パッケージの作成2.
(ベース)陳@ chenjianqu:〜/ ROS /プロジェクト/ WS2 $ CDのSRC (ベース)陳@ chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC $ catkin_create_pkg serve_test std_msgs rospy roscpp
catkin_ws / srcの中にパッケージを作成する必要があり、使用済みのcatkin_create_pkgコマンドの使用法は次のとおりです。catkin_create_pkgパッケージは、パッケージは、パッケージ名です依存し、依存依存パッケージ名で、あなたが複数のパッケージに依存することができます。上記のコマンドはroscpp rospy std_msgsに応じて、serve_testパッケージを作成します。
一般的なファイルパスの下のパッケージには、次のとおりです。
CMakeLists.txt:パッケージのパッケージ名の定義、依存性、ソースファイル、オブジェクトファイルがコンパイルされたルールは、必須成分パッケージです
package.xmlの:パッケージ名、バージョン番号など、著者、依存パッケージの説明は、パッケージが必須成分であります
SRC /:ソースコード、およびC ++(.CPP)Pythonとモジュール(の.py)を含む、ROSのソースコードを格納します
含める/:C ++ソースコードが格納されたヘッダに対応します
スクリプト/:そのようなシェルスクリプト(.SH)、Pythonスクリプトなどの実行可能スクリプト(の.py)用
MSG /:保存カスタムフォーマットのメッセージ(.MSG)
SRV /:セルフストレージサービス定義フォーマット(.srv)
モデル/:店舗ロボットの3次元モデルまたはシミュレーションシナリオ(.sda、.STL、.DAE等)
urdf /:ストレージモデルは、ロボット(.urdf又は.xacro)を記述する
打ち上げ/:ストア起動ファイル(.launchまたは.xml)
CMakeLists.txtとのpackage.xmlのパッケージを定義され、パッケージ内のこれら2つのファイルが不可欠です。ビルドシステムをコンパイルする前に尾状花、我々は最初の2つのファイルを解決する必要があります。パッケージの定義にこれら二つの文書。ROSは、通常、上記のファイルの命名規則の規則でフォームに従って編成され、ガイドラインが推奨されています。複数のパス、のみCMakeLists.txtとのpackage.xmlは、パスの残りの部分がパッケージに応じて決定する必要があり、必見です。
サービス・メッセージ・ファイルを作成します。3.
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC $ LS (ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / srcの$のCD serve_test 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ます。mkdir -p SRV (ベース)陳@ chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ CDのSRV 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test / SRV $ VIM Greeting.srv
書き込まれたメッセージの内容Greeting.srvで:
文字列名の INT32年齢 --- 文字列のフィードバック
SRVファイルは、サービス(サービスデータフォーマット定義のデータ型、* .srvに通信サービスを記述するために使用される。二部の要求(リクエスト)および応答(返信)を含む、サービスを宣言する。
4. [変更CMakeLists.txtとのpackage.xml、コンパイルニュースサービス
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test / srvの$ CD .. (ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ lsの 陳@(ベース)chenjianqu :〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ vimのCMakeLists.txt#修改CMakeLists文件
以下のように変更は以下のとおりです。
find_package(必要なコンポーネント尾状花 roscpp std_msgs 場所message_generation#が追加したい ) #catkinオーバーcmakeの新しいコマンドを、メッセージが生成されたファイルを指定 add_service_files(FILES Greeting.srv)#は、このいずれかを追加し 、新しいコマンド#catkin、生成するメッセージ#DEPENDENCIESはgps.msgは、標準的なROSは、それが必要std_msgs依存通りであり、このメッセージをflaot32使用するので、後世代は、他のメッセージmsgに依存して、指定さ generate_messagesは、(依存関係std_msgs)#がこの追加します
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ VIMのpackage.xml#修正ファイルpackage.xml
追加されたコンテンツを変更します。
<build_depend> message_generation </ build_depend> # これを追加 <exec_depend> message_runtime </ exec_depend> # これを追加
最後にコンパイルニュースサービス
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ CD .. (ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC $ CD .. 陳@(ベース)chenjianqu:〜 / ROS /プロジェクト/ WS2 $ catkin_make
変換の完了がdevelのヘッダファイルに対応Greeting.srv経路が生成された後、ヘッダファイルはserve_test ::挨拶::要求およびC ++の構文規則に従ってデータのserve_test ::挨拶::応答タイプを定義します。
サーバーとクライアントの二つのソースノードの5調製
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 $ CDのSRC 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / srcに$のCD serve_test 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ LS 陳@(ベース)chenjianqu:〜 / ROS /プロジェクト/ WS2 / SRC / serve_test $ CDのsrc #は、サーバーノードのためのソースコードを作成します 〜:(ベース)陳@ chenjianqu / ROS /プロジェクト/ WS2 / SRCを/ serve_test / srcに$ VIM server.cpp
次のようにコードを読み取ります。
#include <ROS / ros.h> の#include <serve_test / Greeting.h> BOOL handle_function(serve_test要求応答およびRES :: ::挨拶&REQ、グリーティング:: :: serve_test){ //表示要求情報 ROS_INFO(「からの要求年齢%D%を持つS "req.name.c_str()、req.age); //プロセス要求、書き込み結果応答 res.feedback ="こんにちは"+ + req.name"私はサーバーです「。! ; // trueを返し、正しく要求処理 真に戻る; } int型のmain(int型ARGC、チャー** ARGV){ ROS :: INIT(ARGC、ARGV、 "greetings_server"); //解像度パラメータ、名前ノード ROS :: NH NodeHandle; //ハンドルを作成し、ノードインスタンス ROS :: ServiceServerサービス= nh.advertiseService( "挨拶"、handle_function); //ハンドラ定められた事業の ROSを::スピン(); の戻り0; }
そして、クライアントノードのソースコードを作成し、
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test / srcに$ VIM client.cpp
コードは以下の通りであります:
#include <ROS / ros.h> の#include <serve_test / Greeting.h> int型のmain(int型ARGC、チャー** ARGV) { ROS :: INIT(ARGC、ARGV、 "greetings_client"); //初期化、ノードの命名それは"greetings_client"で 、ROS :: NodeHandle NH ROSクライアント:: = nh.serviceClient ServiceClient <serve_test挨拶::>( "挨拶"); //サービスクライアント、 "挨拶"という名前のサービス、サービスタイプserve_testを定義します /要求は2つの変数の名前と年齢を含むコンテンツ要求メッセージは、Greeting.srvを参照することを提供/ SRVインスタンス、 serve_testグリーティング:: SRV; srv.request.name =「HAN」; srv.request.age = 20 ; IF(Client.call(SRV)) { 他 { //我々が応答部分の内容をノートが唯一の変数の応答が含まれ、別のノートを文字列に変換しました。 ROS_INFO( "サーバーからの応答:%s"は、srv.response.feedback.c_str()); } ROS_ERROR( "サービスserve_testを呼び出すことができませんでした"); 1を返します。 } 0を返します。 }
5.設定CMakeLists.txt、コンパイラのワークスペース
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test / srcに$ CD .. 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ vimのCMakeLists.txt
追加するCMakeLists.txtファイルで:
#サーバーは、ソースファイルおよびSrc / server.cppをコンパイルするために必要な実行可能ファイルを生成し、後ろにスペース中間体によって分離された後のコード複数のファイルをリストすることができ、所望であれば add_executable(サーバSRC / server.cpp) #セット依存関係、これはadd_dependenciesを追加する必要があり、それ以外の場合は、カスタムヘッダが生成され、SRV見つけることができません add_dependencies(サーバーserve_test_generate_messages_cpp) デフォルトリンクライブラリ構成するには、多くのプロセスがサードパーティのライブラリを使用する必要があります#セットリンクライブラリ、 target_link_librariesを(サーバ$をcatkin_LIBRARIES {}) add_executable(クライアントSRC / client.cpp) add_dependencies(クライアントserve_test_generate_messages_cpp) target_link_libraries(クライアントcatkin_LIBRARIES $ {})
その後、ワークスペースをコンパイル
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC / serve_test $ CD .. (ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 / SRC $ CD .. 陳@(ベース)chenjianqu:〜 / ROS /プロジェクト/ WS2 $ catkin_make
6.テスト
A.オープン新ターミナルと実行roscore
B.は、新しいターミナルを開き、サーバーノードを実行します
(ベース)chenjianqu陳@:〜/ ROS /プロジェクト/ WS2 $ソースのdevel / setup.bash 陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 $ rosrun serve_testサーバー
C.その後、新しいターミナルを開いて、実行するクライアントノード
(ベース)陳@ chenjianqu:〜/ ROS /プロジェクト/ WS2 $ソースのdevel / setup.bash (ベース)陳@ chenjianqu:〜/ ROS /プロジェクト/ WS2 $ rosrun serve_testクライアント
[INFO] [1575818511.403724893]:年齢20とHANからの要求次に、サーバノードは、メッセージクライアントノードを受け取ります。
次に、クライアント・ノードがサーバー・ノードから返されたメッセージを受信:[INFO] [1575818511.403884222]:サーバーからの応答:.こんにちはHAN I ???メートルサーバー!。
コンパイル環境の後、ワークスペースを更新する必要があります、またはそれは、仕事のスペースを見つけられないことがあります。あなたは、端末、システムを開くたびになるように、我々は、端末を開く必要があり、多くの時間は、ワークスペースにコンパイルROSプログラムを実行することができます、我々は〜/ .bashrcファイルに追加し、「ソースワークスペースのパス/devel/setup.bash」コマンドを使用しましたそれは、ワークスペース環境をリフレッシュします。「エコー」のソースワークスペースのパス/devel/setup.bash「>>〜/ .bashrcの」コマンドで追加します。
通信rospyにII。トピック
空間上での基本的な仕事の上に作成され、別のパッケージを作成します。
(ベース)chenjianqu @陳:〜/ ROS /プロジェクト/ WS2 / SRC $ catkin_create_pkg topic_test std_msgs rospy
そして、話題通信フォーマットgps.msgを作成し、パッケージディレクトリにメッセージmsgトピックを格納するためのディレクトリを作成します
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / topic_test / MSG $ VIM gps.msg
以下のコードが書き込まれ、通信サービスの異なる形式は、トピックの通信は、一方向通信です。
列状態 のfloat32 X のfloat32 Y
そして、上記のサービスの例として、CMakeLists.txtとのpackage.xml、およびコンパイルサービスメッセージを変更します。
そして、あなたは簡単なPythonスクリプトコードを格納するためのパッケージディレクトリの下にフォルダのスクリプトを作成し、ここでrospyプログラムを書き始めることができ、
(ベース)chenjianqu @陳:〜/ ROS /プロジェクト/ WS2 / SRC / topic_test /スクリプト$ VIM pytalker.py
コードは以下の通りであります:
#!は/ usr / binに/ PythonのENV #= UTF-コーディング8。 インポートrospy topic_test.msgの#インポートGPSインポートからカスタムデータ型 DEFトーカ(): パブrospy.Publisher =( 'gps_info'を、GPS、のqueue_size = 10 ) rospy.init_node( 'pytalker'、匿名= TRUE) #更新頻度が1Hzのある レートrospy.Rate =(1)。 X = 1.0 Y = 2.0 の状態= '作業'を rospy.is_shutdownれていないが(): #は、距離計算 rospyは。 LOGINFO( 'トーカ:GPS:%X = F、Y = F%'、X、Y) pub.publish(GPS(州、X、Y)) X * X = 1.03 、Y = 1.01 * Yの rate.sleep() __name__ == IF「__main__」: トーカ() 最初のパラメータ#Publisher機能は、トピック名で、2番目のパラメータのデータ型、今我々は最後の1がバッファのサイズで定義msgがあります #queue_size:なし(推奨しません)#これは、同期モードをブロックするようにトランシーバを設定します! #queue_size:0(推奨されません)#このバッファは無限モードに設定されている、非常に危険! #queue_size:10以上#を一般的には、10に。データ待ち時間が同期されていない引き起こす可能性がありすぎQUEUE_SIZE。
実行可能ファイルなどのファイルを書き込んだ後:
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / topic_test /スクリプト$ chmodの+ X pytalker.py
次に、新しいノードのスクリプトファイルを作成します。
(ベース)chenjianqu @陳:〜/ ROS /プロジェクト/ WS2 / SRC / topic_test /スクリプト$ VIM pylistener.py
コード:
#!は/ usr /ビン/ PythonのENV 。#= UTF-8コーディング インポートrospy インポート数学 GPSインポートtopic_test.msgから #コールバックは、MSG入力する必要があり DEFコールバック(GPS): 距離= Math.sqrt(Math.pow(GPS .X、2)+ Math.pow(gps.y、2)) ('リスナー:GPS:距離=%F、%S =状態' rospy.loginfo、距離、gps.state) DEFリスナー(): rospy。 init_node(「pylistener」、匿名= TRUE) 関数#Subscriberトピック名で、2番目のパラメータは第三のパラメータのデータ・タイプである最初の引数は、コールバック関数名受信される rospy.Subscriber(「gps_info」、GPSをコールバック) rospy.spin() IF __name__ == '__main__': リスナー()
陳@(ベース)chenjianqu:〜/ ROS /プロジェクト/ WS2 / SRC / topic_test /スクリプト$ chmodの+ X pylistener.py
Pythonのコードは、実行するための別のリフレッシュ環境変数、cmakelists.txtファイルを変更する必要はありませんので、動的言語であるワークスペースで直接catkin_make。
コードの最初の行#は!は/ usr / binに/ envを pythonのこの使用法は、ユーザがPythonがデフォルトの/ usr / binパスの内部に設置されていませんオペレーティングシステムを防止するためです。システムは、この行を見ると、まず最初に、ENVパイソンでインストールパスの設定を見つけること、および、操作を完了するために、対応するパスの下にインタプリタプログラムを呼び出します。
リファレンス
[0] CASソフトウェア、重いドイツの諜報会社。MOOCの中国大学は---コースのノートを「アンドロイドOS入門」。Https://sychaichangkun.gitbooks.io/ros-tutorial-icourse163/content/