1
Help us understand the problem. What are the problem?

posted at

updated at

ROS2プロジェクトの作成

ROS2関係トップページへ
ROS2レクチャー:初級 -ROS1 style-
ROS2レクチャー:初級 -class style-

【前:ROS2に関する基本情報:初級 -ROS1 style-
【前:ROS2に関する基本情報:初級 -class style-
【次:ROS2最小構成プログラム:初級 -ROS1 style-
【次:ROS2最小構成プログラム:初級 -class style-

概要

ROS2プログラミングの第一歩として,プロジェクトの作成,ビルドを行う.

2020/07/24:ワークスペース・プロジェクトについてでディレクトリについての考えを追加
2020/06/26:ワークスペース・プロジェクトについての【ros2 pkg createが行うこと】の詳細部分に追記

ワークスペース・プロジェクトについて

"ROS2勉強用"を目的としたワークスペースを作成する.ディレクトリ名をros2_studies_ws/とし,このワークスペースに他の練習用プロジェクトも全て入れることとする.ワークスペースはmkdirで普通に作成する.また練習用のパッケージ名をros2_testとする.こちらはros2 pkg createコマンドで作成する.

terminal
$ mkdir -p ~/ros2_studies_ws/
$ cd ~/ros2_studies_ws/
$ ros2 pkg create ros2_test --build-type ament_cmake --dependencies rclcpp

ros2のコマンドは以下のページに詳しい.
- Introspection with command line tools


ros2 pkg createが行うこと

ros2 pkg createは必要なディレクトリ・ファイルの雛形を作成するもので,手動で作成したりgithubから持ってきても問題ない.このコマンドによって作成されるものは以下のとおり.ただし,githubから持ってきた場合,package nameなどちゃんと修正しないといけない.
ros2_studies_ws/
└ ros2_test/
  ├ CMakeLists.txt
 ├ package.xml
  ├ include/
  │ └ ros2_test/
  └ src/

このもととなるのはCMakeの推奨ディレクトリ構造である.An Introduction to Modern CMakeHow to structure your projectは一読の価値あり.


includeディレクトリについてament_cmake User Documentationによると[パッケージ名]/include/[パッケージ名]/のディレクトリには外部公開する機能に関するヘッダを入れる.共有ライブラリで使用する.外部公開しないものはsrc/以下に入れる.「何を外部に公開し何を公開しないか」を意識しよう.


ディレクトリについての考え

公式のはチュートリアルでは,ワークスペース(~/dev_ws/)にsrcディレクトリ(~/dev_ws/src)を作成し,その中にパッケージを作成する方法が推奨となっている.今回の場合に当てはめるとディレクトリ構成は以下のようになる.
ros2_studies_ws/
└ src/
   └ ros2_test/
     ├ CMakeLists.txt
     ├ package.xml
     ├ include/
     │ └ ros2_test/
     └ src/

コンパイル後はワークスペース直下には,src/, build/, install/のみとなって余計なものが入らない,というのは分かる.しかしsrc/が二か所あるのが気になる.自分のすっきりする方法としては以下の通り.

  1. 推奨通りワークスペース直下もsrc/,パッケージの中身もsrc/とする
  2. ワークスペース直下にはsrc/ではなくpackages/とする
  3. ワークスペース直下に直接パッケージを配置する

色々な人との共同作業を考えると推奨通りにしておく方がよいと思うが,個人的には2か3かな.
ここでは3とする.理由は,面倒だから&公式のgithubのプロジェクトをパッと見て推奨通りになってなさそうだったから(2021/7/24)..

package.xmlとCMakeLists.txtの観察

以下,自動生成された両ファイルの一部抜粋.

package.xml
<package format="3">
  <name>ros2_test</name>
  <version>0.0.0</version>
  <desciption>TODO: Package description</description>
  <maintainer email="hoge@gmail.com">hoge</maintainer>
  <license>TODO: License declaration</license>
  ...
  <depend>rclcpp</depend>

1行目:xmlの書き方のバージョンを指定.
2行目:パッケージ名
3行目:バージョン.編集するたび増やしていく.
4行目:一応自由記載
5行目:メンテナス者.複数指定する場合,<maintainer ...の行をコピペして増やす.
6行目:パッケージのライセンス.
8行目:ros2 pkg createの--dependenciesで指定した依存関係のあるパッケージがdependタグに記載される.複数指定した場合は複数行にわたり記載される.

まずはメンテナンス者として自分のメアド・名前を書き込んでおく.

CMakeLists.txt
project(ros2_test)
...
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
...
ament_package()

1行目:CMakeLists.txtの場合,パッケージ名がpackageではなくprojectとして指定されている.cmakeの仕様.
3行目:指定したコンパイラが記載される.
4行目:ros2 pkg createの--dependenciesで指定した依存関係のあるパッケージがdependタグに記載される.複数指定した場合は複数行にわたり記載される.
6行目:CMakeLists.txt内の設定をもとにamentのビルド用設定を行う.CMakeLists.txtの最後に一回だけ呼び出される.

ビルド

プログラムを作成していないけどビルドコマンドを実行してみる.
ビルドはワークスペースのトップディレクトリでcolcon build

terminal
$ cd ~/ros2_studies_ws/
$ colcon build
$ . install/local_setup.bash

3行目の. install/local_setup.bashはgalactic以降の推奨.以前はsetup.bashだった.どちらも使えるが,意味はROS2のsetup.とlocal_setup.を参照.

より実用的なビルドコマンド

上記2行目のビルドコマンドであるが,より実用的なものは以下のような引数をとることが多い.

terminal
$ colcon build --symlink-install --packages-up-to ros2_test
  • --symlink-install
    • 可能な限りリンクを使用して2重にファイルをつくらない?
  • --packages-up-to [package1 package2 ...]
    • 指定されたパッケージとそれに依存関係のあるパッケージのみをビルドする.
    • 複数指定する場合にはスペース区切りとする.

詳しくはcolcon buildを参照のこと.

【前:ROS2に関する基本情報:初級 -ROS1 style-
【前:ROS2に関する基本情報:初級 -class style-
【次:ROS2最小構成プログラム:初級 -ROS1 style-
【次:ROS2最小構成プログラム:初級 -class style-

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?