Journalアラサー社会人博士による徒然日記。技術についてつらつら。コンテンツが貧弱なので、会社公認で大学院博士課程に進学した経緯や、独学でTOEICを475→910にしたノウハウを共有します。日本語訳シリーズです。本ブログの日本語翻訳版のトップページは以下のリンクを参照下さい。プロジェクトで使用されています)。拡張したもので、パッケージ作成時の便利機能が追加されています。基本を知っておくと理解が深まります。公式のチュートリアルも参考になります。<パッケージ名>で作成されます。その後、基本的なビルド情報はpackage.xmlとCMakeLists.txtの2つのファイルに集約されます。インストールしたり、さらにリリースに関する情報をbloomで提供できるようにするには、package.xmlにすべての依存関係とメタデータを含めておく必要があります。CMakeLists.txtには、実行可能ファイルとライブラリをビルドおよびパッケージ化するためのコマンドが含まれています。このページでは主としてそのコマンドについて説明します。チュートリアルも参照してください。パッケージのCMakeLists.txtの基本的な概要は以下の通りです。3.5)project(my_project)ament_package()projectの引数はパッケージ名になり、package.xmlのパッケージ名と同じでなければなりません。プロジェクトの設定はament_package()によって行われます。この呼び出しはパッケージごとに1回だけ行う必要があります。config(そしておそらくtarget)ファイルをインストールします。他のパッケージから検出できるようになります。ament_package()はCMakeLists.txt内の全ての情報を集約して処理をする関数なので、"CMakeLists.txt"の最終行に記述する必要があります。ファイルとディレクトリをコピーするinstall関数によってament_package()を再現することもできますが、ament_package()を最後の呼び出すほう楽です。ament_packageには追加の引数を与えることができます。よって展開された.cmakeまたは.cmake.inテンプレート)のリスト。これらの引数を使用する場合の例については、リソースの追加を参照してください。公式文書を参照してください。CONFIG_EXTRAS_POST:CONFIG_EXTRASと同じですが、ファイルが追加される順序が異なります。CONFIG_EXTRASから生成されたファイルがament_export_*用に生成されたファイルの「前」に含まれるのに対して、CONFIG_EXTRAS_POSTから生成されたファイルはその「後」に含まれます。ament_packageに追加する代わりに、変数${PROJECT_NAME}_CONFIG_EXTRASおよび${PROJECT_NAME}_CONFIG_EXTRAS_POSTに同じ効果を追加することもできます。唯一の違いは、ファイルが追加される順序が次の通りであることです。_CONFIG_EXTRAS_POSTにアペンドして追加されたファイルCONFIG_EXTRAS_POSTによって追加されたファイルファイルとヘッダの追加ビルドする主なターゲットは2つあります。それぞれadd_libraryとadd_executableによってビルドされる、ライブラリと実行可能ファイルです。実装では、add_library/add_executableの引数として、必ずしも両ファイルを追加する必要はありません。以下のベストプラクティスが提案されています。ライブラリをビルドする場合は、クライアントに解放する全ヘッダーをパッケージ名に相当する名前のフォルダ配下のincludeサブディレクトリに格納しておきます。srcフォルダ内にあります。ファイルのみを明示的に参照する。フォルダ内の全てのファイル(${CMAKE_INSTALL_DIR}からの相対パス)が追加されます。原則として、両フォルダともincludeフォルダだった場合や、${CMAKE_CURRENT_SOURCE_DIR}および${CMAKE_INSTALL_DIR}直下のフォルダの場合には、ジェネレータ式を使用する必要はありません。そのような場合でもジェネレータ式を記述しておくのが一般的です。リソースの追加パッケージを新しい依存関係に対してリンクするには2つの方法があります。あるament_target_dependenciesを使うことです。対してリンクさせたいとします。Eigen3)これにより、必要なヘッダとライブラリおよびそれらの依存関係を、プロジェクトが検出できるようになります。オーバーレイワークスペースを使用するときに、すべての依存関係のインクルードディレクトリが正しく順序付けされていることも保証されます。2番目の方法はtarget_link_librariesを使うことです。推奨される方法は、ターゲットのみを使用し、それらをエクスポートしてリンクすることです。同様に名前空間があります。Eigenをを指定します。Clemmysより前までは、ターゲット名がament_target_dependenciesマクロでサポートされていません。関数を使う必要があります。例では、呼び出しは次のようになります。Eigen3::Eigen)これには必要なヘッダ、ライブラリ、およびそれらの依存関係も含まれますが、ament_target_dependenciesとは対照的に、オーバーレイワークスペースを使用するときに依存関係を正しく順序付けできない可能性があります。明示的に必要とされないライブラリをfind_packageすることは不要ですが、別の依存関係(依存A)を持つ依存関係(依存B)を記述する場合には、依存Aを明示的に記述しなければなりません。その場合、該当するパッケージに対してバグを報告してください。ライブラリのビルド再利用可能なライブラリをビルドするとき、それを利用しやすくするために下流のパッケージ用にいくつかの情報をエクスポートする必要があります。include)ここでは、includeフォルダーにエクスポートする必要があるヘッダーが含まれているとします。すべてのヘッダを別々のフォルダに入れる必要はないことに注意してください。クライアントが含めるべきヘッダだけを入れてください。ターゲットをエクスポートします。my_library::my_library)構文を使えるようにするために必要です。コマンドにおけるEXPORTという名前の任意のターゲットリストと、環境変数に潜在的な依存ライブラリを登録する追加オプションHAS_LIBRARY_TARGETを取ることができます。ament_export_dependenciesは依存関係を下流のパッケージにエクスポートします。これは、ライブラリのユーザがそれらの依存関係に対してもfind_packageを呼び出さなくてもいいようにするためです。最初のinstallコマンドは、クライアントに公開するヘッダファイルをインストールするためのものです。最後の大きなinstallコマンドはライブラリをインストールします。アーカイブとライブラリファイルはlibフォルダにエクスポートされ、ランタイムバイナリはbinフォルダにインストールされ、インストールされたヘッダへのパスもシステムに登録されます。DESTINATIONフォルダにインストールされます。ベースのシステムでライブラリを開発する場合でも、RUNTIMEインストールを除外しないことをお勧めします。フォルダをインストールしません。<dest>)によってヘッダをコピーすることによって行われます。呼び出しのEXPORT表記にはさらに注意が必要です。ファイルをインストールします。これはament_export_interfacesの引数とまったく同じ名前で、ライブラリのように名前を付けることもできます。ament_target_dependenciesでインクルードできなくなってしまいます。それとは完全に切り離せるよう、専用のexport_<target>のようなものをエクスポート先に追加することをお勧めします。すべてのインストールパスは、colcon/amentによってすでに正しく設定されているCMAKE_INSTALL_PREFIXからの相対パスです。使用できる2つの追加機能がありますが、ターゲットベースのインストールには不要です。DESTINATIONによって実現されます)。2番目のマクロは、インストールされているライブラリの場所を示します(これはament_export_interfaceへの呼び出しのHAS_LIBRARY_TARGET引数によって行われます)。これらのオプションのドキュメントはソースコード内に記載してあります。規格に準拠しているコンパイラを対象としています。新しいバージョンは将来的には見据えていて、こちらで言及されています。フラグを設定するのが慣例です。14)endif()コードをきれいに保つために、コンパイラは不正が疑われるコードに対してワーニングを出すべきであり、修正されるべきです。少なくとも次の警告レベルをカバーすることをお勧めします。Studioの場合:デフォルトのW1警告は保持されます。-Werrorが推奨されます(後者はワーニングをエラーと解釈します)。-Wall)現時点では、ディレクトリレベルの関数add_compile_options(-Wall)を使用して、すべての実行可能ファイルおよびテスト用のターゲットベースのコンパイルオプションで行数が増えてしまい、コードが乱れないようにすることをお勧めします。上でビルドできるようにする必要があります。ライブラリフォーマットはシンボルの可視性を強化します。クライアントから使用されるべきすべてのシンボルはライブラリによって明示的にエクスポートされる必要があります(そしてデータシンボルは暗黙的にインポートされる必要があります)。ウィキ内に記載されているロジックを使用することをお勧めします。my_libraryというパッケージに使用するにはリンク内のロジックをvisibility_control.hppというヘッダーファイルにコピーします。可視性制御を参照してください)。エクスポートする必要があるすべてのシンボル(つまり、クラスまたは関数)に対してマクロ「MY_LIBRARY_PUBLIC」を使用します。プロジェクトCMakeLists.txtで、以下のコマンドを使用します。使ってライブラリをビルドをすることととテストを分離するために、構文チェックとテストへのすべての呼び出しを条件付きでラップします。よって提供されるすべての構文チェッカは別々に追加することができますが、それらを組み合わせたコマンドを使用することをお勧めします。REQUIRED)ament_lint_auto_find_test_dependencies()これはpackage.xmlで定義されているように構文チェッカを実行します。ament_lint_commonパッケージで定義されている一連の構文チェッカを使用することをお勧めします。これにより、以下のすべての構文チェッカ実行されます。スタイルチェッカament_uncrustifyには、コマンドラインツールが付属しています。これを呼び出すと、スタイルガイドに従ってコードを自動的に再フォーマットできます。マクロが含まれています。<test_sources>)これは他のライブラリ(プロジェクトライブラリなど)に対してリンクできる通常のターゲットです。マクロには追加のパラメータがあります。APPEND_ENV:環境変数を追加します。プレフィックスパスに追加できます。PATH=some/addtional/path/for/testing/resources)APPEND_LIBRARY_DIRS:実行時にリンカが検出できるようにライブラリを追加します。LD_LIBRARY_PATHのような環境変数を設定することでも実現できますが、この場合は呼び出しプラットフォームごとに異なる設定をしなければなりません。ENV:環境変数を設定します(APPEND_ENVと同じ構文)。TIMEOUT:テストタイムアウトを秒単位で設定します。GTestsのデフォルトは60秒です。SKIP_LINKING_MAIN_LIBRARIES:GTestにリンクしません。WORKING_DIRECTORY:テスト用の作業ディレクトリを設定します。それ以外のデフォルトの作業ディレクトリはCMAKE_SOURCE_DIRで、これは最上位のCMakeLists.txtのディレクトリとなります。CMakeマクロがあります。<test_sources>)ament_add_gtestと同様に追加パラメータがあります。登録し、それを拡張することができます。拡張することはしばしば他のパッケージが使えるようにするための機能を追加したいという意図があると思われます。これは、${PROJECT_NAME}_CONFIG_EXTRAS変数を追加することによって実行できます。これは、次の関数を呼び出した後、ament_package()を呼ぶことで実現できます。other/pathto/file.cmake")あるいは、ファイルをament_package()で直接追加することもできます。自体への拡張も可能です。その拡張機能は拡張ポイントを定義する関数で実行されるスクリプトです。メッセージジェネレータを登録することです。ジェネレータを書くとき、メッセージ/サービス定義パッケージのためのコードを修正することなしにジェネレータですべてのメッセージとサービスを通常生成するのが望ましいです。これは、ジェネレータをrosidl_generate_interfacesの拡張として登録することで可能です。例として、下記があります。"rosidl_generator_cpp_generate_interfaces.cmake")これは、パッケージrosidl_generator_cppのマクロrosidl_generator_cpp_generate_interfaces.cmakeを、拡張ポイントrosidl_generate_interfacesに登録するものです。拡張ポイントが実行されると、ここでスクリプトrosidl_generator_cpp_generate_interfaces.cmakeの実行がトリガーされます。正確に言うと、これは関数rosidl_generate_interfacesが実行されるたびにジェネレータを呼び出します。ジェネレータ用のrosidl_generate_interfaces以外の最も重要な拡張ポイントはament_packageです。これは単にament_package()呼び出しでスクリプトを実行するだけです。この拡張ポイントは、リソースを登録するときに役立ちます(下記参照)。ament_register_extensionは、必ず3つの引数をとる関数です。ファイルを含むパッケージの名前(すなわち、ファイルが書き込まれているプロジェクトのプロジェクト名)cmake_filename:拡張ポイントが実行されたときに実行されるcmakeファイル注意:ament_packageやrosidl_generate_interfacesと同じようにカスタム拡張ポイントを定義することは可能ですが、これはほとんど必要ないでしょう。新しい拡張ポイントを定義したくなることもあるでしょう。対応するマクロが呼び出されたときにすべての拡張が実行されるように、拡張ポイントをマクロ内に登録できます。以下のように行います。登録したい拡張の名前(例えばmy_extension_point)を定義して、ファイルとして保存してください。これは拡張ポイントを使うときにament_register_extensionマクロに渡される名前です。拡張機能を実行するマクロ/関数では、次のように呼び出します。拡張は、拡張ポイントの名前を含む変数を定義し、それに実行するマクロを入れることによって機能します。ament_execute_extensionsを呼び出すと、変数に定義されたスクリプトが次々に実行されます。パッケージにリソースを追加することが不可欠です(例:プラグイン)。使ったツール用のプラグインがあります。インデックス(「リソースインデックス」とも呼ばれる)を使用して実現できます。設計の詳細については、こちらを参照してください。内のフォルダに含まれています。さまざまな種類のリソースにちなんだ名称のサブフォルダが含まれています。サブフォルダ内では、上記リソースを提供する各パッケージは「マーカファイル」という名で参照されます。ファイルには、リソースを取得するために必要なあらゆるコンテンツが含まれます。(リソースのインストールディレクトリへの相対パスが例。それは単に空の場合もありますが。用の表示プラグインを提供することを検討してください。よってインストールおよび使用されるplugin_description.xmlファイルを提供します。リソースとして登録されます。サブフォルダrviz_common__pluginlib__pluginにインストールします。モジュールは、プラグインをエクスポートするパッケージについて、rviz_common__pluginlib__pluginという名称の全フォルダから情報を収集することを認識します。モジュール用のマーカーファイルには、plugins_description.xmlファイルへのインストールフォルダへの相対パス(およびマーカファイル名としてのライブラリの名前)が含まれています。ライブラリをロードし、どのプラグインをplugin_description.xmlファイルからロードするかを知ることができます。プラグインがあなた自身のカスタムメッシュを使うようにする可能性を考えてください。メッシュについて知っている必要があることを意味します。インデックスに登録します。関数を呼び出すプロジェクト名のファイルをrviz_ogre_media_exportsというサブフォルダーにインストールします。このファイルには、マクロにリストされているディレクトリへのインストールフォルダへの相対パスが含まれています。起動時、rviz_ogre_media_exportsという名前のすべてのフォルダを検索し、指定された全フォルダにリソースをロードできるようになりました。パッケージの場合はament_index_py)を使って行われます。追加し、そうするためのベストプラクティスを提供する方法を探ります。インデックスに対してリソースの問い合わせが可能です。ament_index_has_resource:以下のパラメータで存在する場合、リソースへのプレフィックスパスを取得します。var:出力パラメータ:リソースが存在しない場合はこの変数にFALSEを、存在する場合はリソースへのプレフィックスパスを設定します。インデックス内のマーカファイルの内容を取得する。var:出力パラメータ:リソースマーカファイルが存在する場合はその内容が代入されます。resource_type:リソースの種類(例:rviz_common__pluginlib__plugin)resource_name:通常resource_type型のリソースを追加したパッケージの名前に相当するリソースの名前(例:rviz_default_plugins)PREFIX_PATH:検索するプレフィックスパス(通常、デフォルトのament_index_get_prefix_path()で十分です)。リソースが存在しない場合、ament_index_get_resourceはエラーをスローするので、ament_index_has_resourceを使用して確認する必要があるかもしれません。ament_index_get_resources:インデックスから特定の種類のリソースを登録したすべてのパッケージを取得します。var:出力パラメータ:resource_typeのリソースを登録した全てのパッケージ名のリストが代入されます。ビットの情報が必要です。ユニークなリソース名マーカファイルのレイアウト。パッケージをマークする“package”リソースに当てはまります)。RVizメッシュリソースの場合、対応する選択肢は次のとおりです。rviz_ogre_media_exports、リソースを含むすべてのフォルダへの相対パスをインストールします。これにより、パッケージ内の対応するリソースを使用するためのロジックを記述できるようになります。パッケージのリソース登録を容易にするには、さらに、pluginlib関数やrviz_ogre_media_exportsなどのマクロや関数を用意する必要があります。リソースを登録するには、ament関数ament_index_register_resourceを使用します。これによりマーカファイルが作成され、resource_indexにインストールされます。例として、rviz_ogre_media_exportsの対応する呼び出しは以下のとおりです。中にあるrviz_ogre_media_exportsフォルダにインストールされます。マクロには色々な便利パラメータが用意されています。最初の(名前なし)パラメータはリソースの名前です。内のフォルダの名前になります。CONTENT:文字列としてのマーカファイルの内容。これは相対パスのリストなどです。CONTENTをCONTENT_FILEと一緒に使用することはできません。CONTENT_FILE:マーカファイル作成のために使用されるファイルへのパス。ファイルはプレーンファイルでも、configure_file()で展開されたテンプレートファイルでも、どちらでも構いません。CONTENT_FILEをCONTENTと一緒に使用することはできません。PACKAGE_NAME:リソースをエクスポートしているパッケージ/ライブラリの名前。マーカファイルの名前になります。デフォルトは${PROJECT_NAME}です。インデックスの基底パス。本当に必要な場合以外は、常にデフォルトの${CMAKE_BINARY_DIR}/ament_cmake_indexを使用してください。SKIP_INSTALL:マーカファイルのインストールをスキップします。回呼び出されると、通常は問題になります。大規模プロジェクトでは、リソースを登録する呼び出しを分割するのが最善の方法です。したがって、register_rviz_ogre_media_exports.cmakeなどのリソースを登録するマクロにいくつかの変数のみを設定させることがベストプラクティスとなります。拡張内で追加できます。回限りでなければならないため、リソースが登録される場所は常に1つのみとなります。rviz_ogre_media_exportsの場合、これは次のような方針となります。マクロregister_rviz_ogre_media_exportsはフォルダのリストを受け取り、それらをOGRE_MEDIA_RESOURCE_FILEという変数に追加します。${OGRE_MEDIA_RESOURCE_FILE}が空でない場合、register_rviz_ogre_media_exports_hookという別のマクロがament_index_register_resourceを呼び出します。拡張として登録されます。"register_rviz_ogre_media_exports_hook.cmake")register_rviz_ogre_media_exports.cmakeおよびregister_rviz_ogre_media_exports_hook-extra.cmakeは、ament_package()でCONFIG_EXTRAとして登録されます。日本語訳シリーズです。日本語訳シリーズです。日本語訳シリーズです。日本語訳シリーズです。動かす!お問い合わせお問い合わせフォームプライバシーポリシーこちらの記事をご参照下さい.はてなブログをはじめよう!MoriKen254さんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。