ROSの新規ワークスペース(workspace)とパッケージ(package)のコンパイルの実践(C++の例)

ROS ワークスペースは、ROS ワーク パッケージを保存するために使用されるディレクトリであり、これらのワーク パッケージには、ソース コード、設定ファイル、メッセージ ファイルなどの ROS プログラムのさまざまなファイルが含まれています。したがって、ワークスペースの本質はフォルダーです。このフォルダーは、次に紹介するパッケージと、これらのパッケージのビルドに必要なファイルを保存するために使用されます。多くの ROS ワークスペースを作成でき、それらはすべて互いに独立しており、それぞれのワークスペースで特定のプログラムを実行するため、無関係なプログラムが一緒にされることが回避され、疎結合の設計概念にも準拠しています関数を一緒に使用すると、デバッグが簡単になります。

1.ROSワークスペース

新しいワークスペース (ディレクトリ)

mkdir -p ~/catkin_ws/src
cd ~/catkin_ws/src

-pを指定すると、複数の存在しないディレクトリ、つまりこのパス内のすべてのディレクトリが作成されます。存在しない場合は作成されます。さらに、新しいワークスペースを作成するには、通常、現在のユーザーのルート ディレクトリの下に作成します ~/

ワークスペースの初期化

catkin_init_workspace
#Creating symlink "/home/yahboom/catkin_ws/src/CMakeLists.txt" pointing to "/opt/ros/melodic/share/catkin/cmake/toplevel.cmake"

ここで重要なのは、 toplevel.cmakeを指すシンボリック リンクを作成することであり、その結果、システム全体が表示されるようになります。

ワークスペースを作成して初期化した後、他のワークスペース ファイルをいくつか作成します。

cd ~/catkin_ws
catkin_make

コマンドcatkin_make はすべてのノードをコンパイルし、すべての依存関係を最新の状態に保ちます。どのディレクトリがsrcディレクトリに追加されるかを確認してみましょう: ls

 ビルド  開発ソース

追加のbuildディレクトリとdevelディレクトリがあります。buildディレクトリは、C++ を使用するときに catkin がライブラリと実行可能プログラムを保存する場所です。Python を使用する場合、 buildの内容は無視できdevel はにsetup.bashファイルに焦点を当てます。 、これらのファイルを実行すると、システムはワークスペースとそれに含まれるコードを使用します。次のコマンドで設定するには、setup.bashを.bashrcに追加(>>)します

echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc

ワークスペースはとても快適に新築されました。次に、包括的なポイントを理解するために、C++ を使用してコンパイルを実行し、関連するどのような操作を実行する必要があるかを確認します。

2.ROSパッケージ

「パッケージ」という名前は、Ubuntu にもソフトウェアがパッケージの形で存在しますが、ROS のパッケージは Ubuntu のパッケージとは異なり、特にロボットのオペレーティング システムに関するものであるため、後述する「パッケージ」はROS パッケージに追加する場合、それが Ubuntu パッケージの場合は、それが Ubuntu パッケージであることを明確に示します。
パッケージを作成するコマンドは次のとおりです。

catkin_create_pkg tony_code rospy

このcatkin_create_pkgコマンドは、前の記事「ROS ロボット オペレーティング システム Catkin のコンパイルと共通コマンドの使用の紹介」に も登場しましたが、非常に一般的なコマンドです。

これにより、 CMakeLists.txtファイルpackage.xmlファイルを含むtony_codeという名前の新しいパッケージと、実際のソース コードを保存するsrcフォルダーが正常に作成されます。このパッケージは既存のrospyパッケージに依存します。パッケージが他のパッケージにも依存している場合は、これはコマンドラインにリストできます。

このワークスペースのディレクトリ構造はおおよそ次のとおりです。

|--- catkin_ws /
|------ build /
|------ devel /
| ------ src / |
         ---- CMakeLists.txt
         |---- tony_code /
             |- --- CMakeLists.txt  package.xml   src
         |----その他/
             |---- CMakeLists.txt  package.xml   src

ここには、区別する必要があるいくつかのCMakeLists.txtがあります。ワークスペースのルート ディレクトリのsrcディレクトリの下にあるものに加えて、各パッケージにもCMakeLists.txtがあります。

2.1、CMakeLists.txt

上で述べたように、ワークスペース内のCMakeLists.txtに加えて、各パッケージにも CMakeLists.txt があり、パッケージをコンパイルするときに、対応するパッケージの下のCMakeLists.txtを変更します。

Makeに慣れている読者にとっては非常に簡単で、このファイルは作業パッケージ内のソース コードをコンパイルする方法を定義します。新しいパッケージtony_codeCMakeLists.txt
ファイルの内容を確認してみましょう: cat CMakeLists.txt

cmake_minimum_required(VERSION 3.0.2)
プロジェクト(tony_code)

## ROS Kinetic 以降でサポートされる C++11 としてコンパイル
# add_compile_options(-std=c++11)

## catkin マクロとライブラリを検索します。
## find_package(catkin REQUIRED COMPONENTS xyz) のような COMPONENTS リストを
使用する場合 ## 他の catkin パッケージも検索します
find_package(catkin REQUIRED COMPONENTS
  rospy
)

## システムの依存関係は CMake の規則に従って検出されます
# find_package(Boost REQUIRED COMPONENTS system)


## パッケージに setup.py がある場合は、これのコメントを解除します。このマクロにより、
## その中で宣言されたモジュールとグローバル スクリプトが確実にインストールされます
## http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html を参照
# catkin_python_setup()

##############################################
## ROS メッセージ、サービス、アクションを宣言する ##
######################################## #######


## この## パッケージ内からメッセージ、サービス、またはアクションを宣言して構築するには、次の手順に従います。
## * MSG_DEP_SET を、
## メッセージ/サービス/アクション (例: std_msgs、 actionlib_msgs, ...)。
## * ファイル package.xml 内:
## * "message_generation" の build_depend タグを追加します。
## * MSG_DEP_SET 内の各パッケージに build_depend タグと exec_depend タグを追加します。
## * MSG_DEP_SET が空でない場合、次の依存関係が追加されています。 ##で取り込まれています
が、それでも確実に宣言できます:
## * 「message_runtime」の exec_depend タグを追加します
## * このファイル (CMakeLists.txt) 内:
## * "message_generation" と MSG_DEP_SET のすべてのパッケージを
## find_package(catkin REQUIRED COMPONENTS ...)に追加します。 ## * "message_runtime" と MSG_DEP_SET のすべてのパッケージを## catkin_package(CATKIN_DEPENDS ...)
に追加します## * コメントを解除します必要に応じて以下の add_*_files セクションを## 処理するすべての .msg/.srv/.action ファイルをリストします ## * 以下のgenerate_messages エントリのコメントを解除します## * MSG_DEP_SET 内のすべてのパッケージをgenerate_messages(DEPENDENCIES ...) に追加します




## 「msg」フォルダーにメッセージを生成します
# add_message_files(
# FILES
# Message1.msg
# Message2.msg
# )

## 「srv」フォルダーにサービスを生成します
# add_service_files(
# FILES
# Service1.srv
# Service2.srv
# )

## 「action」フォルダーにアクションを生成します
# add_action_files(
# FILES
# Action1.action
# Action2.action
# )

## ここにリストされている依存関係を持つ追加メッセージとサービスを生成します
#generate_messages(
# DEPENDENCIES
# std_msgs # または msgs を含む他のパッケージ
# )

##############################################
## ROS 動的再構成パラメータの宣言 ##
########################################### #####

## この
## パッケージ内で動的再構成パラメーターを宣言してビルドするには、次の手順に従います。
## * ファイル package.xml 内:
## * 「dynamic_reconfigure」の build_depend タグと exec_depend タグを追加します
## * このファイル内 ( CMakeLists.txt):
## * "dynamic_reconfigure" を
## find_package(catkin REQUIRED COMPONENTS ...) ##
* 以下の "generate_dynamic_reconfigure_options" セクションのコメントを解除し
、処理されるすべての .cfg ファイルをリストします。

## 「cfg」フォルダーに動的再構成パラメーターを生成します
#generate_dynamic_reconfigure_options(
# cfg/DynReconf1.cfg
# cfg/DynReconf2.cfg
# )

#################################
## catkin 固有の構成 ##
######## ###########################
## catkin_package マクロは、パッケージの cmake 構成ファイルを生成します
## 依存プロジェクトに渡すものを宣言します
# # INCLUDE_DIRS: パッケージにヘッダー ファイルが含まれている場合はコメントを解除します
## LIBRARIES: このプロジェクトで作成するライブラリで、依存プロジェクトにも必要です
## CATKIN_DEPENDS: catkin_packages 依存プロジェクトにも必要です## DEPENDS: 依存プロジェクトにもcatkin_packageが必要な
、このプロジェクトのシステム依存関係
(
# INCLUDE_DIRS インクルード
# LIBRARIES tony_code
# CATKIN_DEPENDS rospy
# DEPENDS system_lib
)

###########
## ビルド ##
###########

## ヘッダー ファイルの追加の場所を指定します
## パッケージの場所は他の場所の前にリストする必要があります
include_directories(
# include
  ${catkin_INCLUDE_DIRS}
)

## C++ ライブラリを宣言します
# add_library(${PROJECT_NAME}
# src/${PROJECT_NAME}/tony_code.cpp
# )

## ライブラリの cmake ターゲット依存関係を追加します
## 例として、ライブラリの前にコードを生成する必要がある場合があります
## メッセージ生成または動的再構成のいずれかによって
# add_dependency(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS })

## C++ 実行可能ファイルを宣言します
## catkin_make を使用すると、すべてのパッケージが単一の CMake コンテキスト内でビルドされます
## 推奨されるプレフィックスにより、パッケージ間のターゲット名が衝突しないことが保証されます
# add_executable(${PROJECT_NAME}_node src/tony_code_node.cpp)

## プレフィックスなしで C++ 実行ファイルの
名前を変更します。 ## 上記の推奨プレフィックスではターゲット名が長くなります。次の例では、##
ターゲットの名前をユーザーが使いやすいように短いバージョンに戻します。 # set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME ノード PREFIX "")

## 実行可能ファイルの cmake ターゲットの依存関係を追加します
## 上記のライブラリと同じ
# add_dependency(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

## ライブラリまたは実行可能ターゲットをリンクするライブラリを指定します
# target_link_libraries(${PROJECT_NAME}_node
# ${catkin_LIBRARIES}
# )

#############
## インストール ##
#############

# すべてのインストール ターゲットは catkin DESTINATION 変数を使用する必要があります
# http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html を参照してください

## 実行可能スクリプト (Python など) をインストール用にマークします
## setup.py とは対照的に、インストール先を選択できます
# catkin_install_python(PROGRAMS
# scripts/my_python_script
# DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## 実行可能ファイルにインストール用のマークを付ける
## http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_executables.html を参照
# install(TARGETS ${PROJECT_NAME}_node
# RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
#)

## ライブラリをインストール用にマークします
## http://docs.ros.org/melodic/api/catkin/html/howto/format1/building_libraries.html を参照してください
# install(TARGETS ${PROJECT_NAME}
# アーカイブ先 ${CATKIN_PACKAGE_LIB_DESTINATION}
#ライブラリの宛先 ${CATKIN_PACKAGE_LIB_DESTINATION}
# ランタイムの宛先 ${CATKIN_GLOBAL_BIN_DESTINATION}
# )

## cpp ヘッダー ファイルをインストール用にマーク
します # install(DIRECTORY include/${PROJECT_NAME}/
# DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
# FILES_MATCHING PATTERN "*.h"
# PATTERN ".svn" EXCLUDE
# )

## 他のファイルをインストール用にマークします (起動ファイルやバッグ ファイルなど)
# install(FILES
# # myfile1
# # myfile2
# DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
# )

#############
## テスト ##
#############

## gtest ベースの cpp テスト ターゲットとリンク ライブラリを追加します
# catkin_add_gtest(${PROJECT_NAME}-test test/test_tony_code.cpp)
# if(TARGET ${PROJECT_NAME}-test)
# target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME} )
#endif()

## Python namestests で実行するフォルダーを追加
# catkin_add_nosetests(test)

CMakeLists.txtテキストの内容から、1 つ以上のソフトウェア プロジェクトをビルドするための構成情報を記述するために使用されることも大まかに理解できます。構成を編集することで、CMake はコンパイルするプロジェクト構成情報に基づいてビルド スクリプトを自動的に生成できます。 、ソフトウェア項目をテストしてインストールします。
コメントを使用する必要がある場合は、必要に応じてコメントを削除してください。たとえば、構成では、ヘッダー ファイルのディレクトリを追加し、include_directoriesを開く必要があります。

opencvを使用する場合は、ヘッダー ファイル/usr/local/include/opencv/cv.hをインクルードする必要があります。そのディレクトリを含めます: include_directories(/usr/local/include)関数を呼び出すときに追加します:  #include "opencv/cv.h"

他の構成については、必要に応じて後で説明します。 

2.2、package.xml 

このpackage.xmlファイルには、パッケージ名、バージョン番号、依存関係など、作業パッケージのメタ情報が含まれています。
このファイルの内容を確認してみましょう: cat package.xml

<?xml version="1.0"?>
<package format="2">
  <name>tony_code</name>
  <version>0.0.0</version>
  <description>The tony_code package</description>

  <!-- One maintainer tag required, multiple allowed, one person per tag -->
  <!-- Example:  -->
  <!-- <maintainer email="[email protected]">Jane Doe</maintainer> -->
  <maintainer email="[email protected]">yahboom</maintainer>


  <!-- One license tag required, multiple allowed, one license per tag -->
  <!-- Commonly used license strings: -->
  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->
  <license>TODO</license>


  <!-- Url tags are optional, but multiple are allowed, one per tag -->
  <!-- Optional attribute type can be: website, bugtracker, or repository -->
  <!-- Example: -->
  <!-- <url type="website">http://wiki.ros.org/tony_code</url> -->


  <!-- Author tags are optional, multiple are allowed, one per tag -->
  <!-- Authors do not have to be maintainers, but could be -->
  <!-- Example: -->
  <!-- <author email="[email protected]">Jane Doe</author> -->


  <!-- The *depend tags are used to specify dependencies -->
  <!-- Dependencies can be catkin packages or system dependencies -->
  <!-- Examples: -->
  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->
  <!--   <depend>roscpp</depend> -->
  <!--   Note that this is equivalent to the following: -->
  <!--   <build_depend>roscpp</build_depend> -->
  <!--   <exec_depend>roscpp</exec_depend> -->
  <!-- Use build_depend for packages you need at compile time: -->
  <!--   <build_depend>message_generation</build_depend> -->
  <!-- Use build_export_depend for packages you need in order to build against this package: -->
  <!--   <build_export_depend>message_generation</build_export_depend> -->
  <!-- Use buildtool_depend for build tool packages: -->
  <!--   <buildtool_depend>catkin</buildtool_depend> -->
  <!-- Use exec_depend for packages you need at runtime: -->
  <!--   <exec_depend>message_runtime</exec_depend> -->
  <!-- Use test_depend for packages you need only for testing: -->
  <!--   <test_depend>gtest</test_depend> -->
  <!-- Use doc_depend for packages you need only for building documentation: -->
  <!--   <doc_depend>doxygen</doc_depend> -->
  <buildtool_depend>catkin</buildtool_depend>
  <build_depend>rospy</build_depend>
  <build_export_depend>rospy</build_export_depend>
  <exec_depend>rospy</exec_depend>


  <!-- The export tag contains other, unspecified, tags -->
  <export>
    <!-- Other tools can request additional information be placed here -->

  </export>
</package>

このファイルには、新しいパッケージに関する一連のメタデータが含まれています。それぞれのノードを紹介しましょう。

name : パッケージの名前。このノードは変更できません。
version : パッケージのバージョン番号
description : パッケージの機能の簡単な説明 Maintainer
:パッケージの管理者およびバグを修正する人、複数人
License : ライセンス
のURL : パッケージの URL
author : パッケージの作成者パッケージ
buildtool_depend : ビルドツール、ROS では基本的に catkin
build_depend : 依存関係の
エクスポート: catkin 以外のツールに必要な情報

3. C++ をコンパイルする

上記の知識をもとに、C++ を使用して最も単純なノードを作成し、それをコンパイルして、プロセス全体と発生するエラーについて理解します。

3.1、新しい最小限のパッケージを作成する

上記の紹介に従って、新しいパッケージを作成します。ここでは名前は最小限です

cd ~/catkin_ws/src
catkin_create_pkg minimal rospy

3.2. C++ コード

パッケージを作成した後、最小限のパッケージの下のsrcディレクトリに C++ ファイルを作成します。

cd minimal/src
gedit minimal.cpp

minimum.cppの内容は以下の通りです

#include <ros/ros.h>

int main(int argc,char **argv)
{
    ros::init(argc,argv,"minimal");
    ros::NodeHandle n;
    ros::spin();
    return 0;
}

これは、ROS ヘッダー ファイルを含む、C++ で書かれた最も単純な ROS ノードです。
ros::init(argc,argv,"minimal");ノードを初期化し、名前空間
ros::NodeHandle nと同等の minimum という名前を付けます;トピック、サービス、アクションを作成するためのノード ハンドルを作成します。
Python では、ROS の Python インターフェースが暗黙的にros::spin()を実装できるため、このように明示的にノード ハンドルを作成する必要はなく、ROS のスケジューリングを待っています。サブスクライブ時のコールバック関数の処理など、常に実行されます。 サイクリックサブスクリプションの意味。もちろん、後の段階でros::spinOnce();のような関数が出てきますが、これは同じことを意味しますが、これは通常ループ内に配置されます。

3.3. CMakeLists.txt を変更する

次に、設定ファイルを変更しますが、ここでも注意が必要で、最小パッケージ内のCMakeLists.txtファイルが使用されます。

cd ~/catkin_ws/src/minimal
gedit CMakeLists.txt

次の 3 か所を変更し、コメントを削除して有効にします。

find_package(catkin REQUIRED rospy)

add_executable(minimal src/minimal.cpp)

target_link_libraries(minimal ${catkin_LIBRARIES})

3.4、コンパイル

構成後、コンパイルを開始します。

cd ~/catkin_ws
catkin_make

ここでコンパイルする場合、ワークスペースのルート ディレクトリに戻ってコンパイルする必要があることに注意してください。
3 か所が変更されていますが、コンパイルでは依然として次のエラーが報告されます。ヘッダー ファイルros/ros.hが見つかりません。これは非常に一般的なエラーです。

ターゲットの依存関係をスキャンしています minimum
[ 50%] CXX オブジェクトを構築しています minimum/CMakeFiles/minimal.dir/src/minimal.cpp.o
/home/yahboom/catkin_ws/src/minimal/src/minimal.cpp:1:10: 致命的なエラー: ros/ros.h: そのようなファイルまたはディレクトリはありません
 #include <ros/ros.h>
          ^~~~~~~~~~~
コンパイルが終了しました。
minimum/CMakeFiles/minimal.dir/build.make:62: ターゲット 'minimal/CMakeFiles/minimal.dir/src/minimal.cpp.o' のレシピが
make[2] に失敗しました: *** [minimal/CMakeFiles/minimal. dir/src/minimal.cpp.o] エラー 1
CMakeFiles/Makefile2:431: ターゲット 'minimal/CMakeFiles/minimal.dir/all' のレシピが
make[1] に失敗しました: *** [minimal/CMakeFiles/minimal.dir/ all] エラー 2
Makefile:140: ターゲット 'all' のレシピが
make に失敗しました:
「make -j2 -l2」の呼び出しに失敗しました

3.5、コンパイルエラーの処理

上記のコンパイルエラーについては、上でも紹介していますが、ここにはヘッダーファイルがあるので、 include_directoriesを開く必要があります。

include_directories(${catkin_INCLUDE_DIRS} を含める) 

その後、再度コンパイルしますが、やはりエラーが発生します。ノード マネージャーroscoreを起動すると、正常に起動できるため、環境変数の設定は問題ありません。その理由は、ここではC++が使用されているため、このroscpp依存関係パッケージが必要であり、変更は次のようになります。

find_package(catkin 必須コンポーネント rospy roscpp) 

その後、問題なく再度コンパイルします。図に示すように:

このようにして、コンパイルされた最小限の実行可能プログラムは~/catkin_ws/devel/lib/minimal/minimalに配置されます。 

おすすめ

転載: blog.csdn.net/weixin_41896770/article/details/132273124