RoboTry

ROSを使ってロボットを動かすぞ

ROS2 Tutorialsをやってみた ~パッケージ作成~

今回は以下を実施します。

  • ROS 2 Tutorials
    • Installation from binary and source, all platforms
    • Using colcon to build a custom package
  • パッケージの作成

前回までのあらすじ

前回はROS 2 のインストールとAbout ROS 2を読みました。

robotry.hatenablog.com

ROS 2 Tutorials

このページを実施します。

Tutorials · ros2/ros2 Wiki · GitHub

Installation from binary and source, all platforms

すでにインストール済みなので省略します。

バイナリではなく、ソースからビルドしています。

Using colcon to build a custom package

  • このページはcolconのTutorialであって、詳細なドキュメントではない
    • チョット前まではcolconではなくament_toolsを使っていた
  • colcon はROSの新しいビルドツール

Development Environment

  • 開発環境を構築するためにROS2をソースからビルドする(実施済み)

Run the tests

  • ここはInstallationで実施してなかったのでやってみる
    • いくつかのtestが失敗した
パッケージの更新

testに失敗したことが気になるのでパッケージを入れ直します。

下記ページを参考にしました。

※各パッケージごとに更新する方法もありますが、今回は全部入れ直してます。

Maintaining a Source Checkout · ros2/ros2 Wiki · GitHub

# パッケージ全部入れ直すことにします
$ rm -rf ~/ros2_ws
$ mkdir -p ~/ros2_ws/src
$ cd ~/ros2_ws
# masterブランチのパッケージをダウンロード
$ wget https://raw.githubusercontent.com/ros2/ros2/master/ros2.repos
$ vcs import src < ros2.repos

# rosdepの更新
$ rosdep update
$ rosdep install --from-paths src --ignore-src --rosdistro bouncy -y --skip-keys "console_bridge fastcdr fastrtps libopensplice67 rti-connext-dds-5.3.1 urdfdom_headers"

# ビルド&テスト
$ colcon build --symlink-install
$ colcon test

~~~中略~~~

Summary: 195 packages finished [7min 43s]
  3 packages had stderr output: composition osrf_pycommon test_rclcpp
  2 packages had test failures: composition test_rclcpp

~~~中略~~~

それでもテストに失敗するのでログを見てみます。

ログファイルは~/ros2_ws/log/ にあります。

各ログファイルの役割についてはcolcon公式ページを参照してください。

How to — colcon documentation

# latest_testが最新のtestログファイルへのシンボリックリンクになっています
$ cd ros2_ws/log/latest_test
$ cat composition/stdout.log

~~~中略~~~
The following tests FAILED:
      5 - test_linktime_composition__rmw_fastrtps_cpp (Timeout)
      9 - test_api_srv_composition_client_first__rmw_fastrtps_dynamic_cpp (Timeout)
     10 - test_dlopen_composition__rmw_fastrtps_dynamic_cpp (Timeout)

$ cat test_rclcpp/stdout.log

~~~中略~~~
The following tests FAILED:
     15 - test_parameter_server_cpp__rmw_fastrtps_cpp (Timeout)

Fast RTPSが関わるテストでタイムアウトが発生しています。(wait時間の設定ミスとかかな?) 単独テストでもエラーが発生するのか確認してみます。

単独テストの方法は下記ページが参考になります。

How to — colcon documentation

$ cd row2_ws
$ colcon test --packages-above composition
~~~略(エラー発生しませんでした)~~~
$ colcon test --packages-above test_rclcpp
~~~略(エラー発生しませんでした)~~~

エラーが発生しなかったので次のステップに進みます。

Source the environment

ビルドに成功したのでパスを通します。自分はzshを使ってるのでzsh用のスクリプトを実行します。

$ . install/local_setup.zsh

Try a demo

listenerとtalkerのデモが動きました。

Develop your own package

overlay用のディレクトリを作成し、そこに練習用のリポジトリをコピーします。

$ mkdir -p ~/ros2_overlay_ws/src
$cd ~/ros2_overlay_ws/src

# ROS2インストール時のパッケージ(undelay)が最新状態であればgithubからダウンロード
git clone https://github.com/ros2/examples.git

# そうでない場合はunderlayディレクトリからコピー
# git clone ~/ros2_ws/src/ros2/examples

ビルドしてパスを通します。

$ cd ~/ros2_overlay_ws
$ colcon build --cmake-args -DCMAKE_BUILD_TYPE=Debug

$ . ~/ros2_overlay_ws/install/local_setup.zsh

ros2_wsディレクトリにもexamplesパッケージがあるためoveralyできてるのかイマイチわかりません。

オリジナルのパッケージを作って確認してみます。(この記事の最後に記載)

Create your own package

  • ros2 pkg createを使えば、catkin_create_packageと同じようにパッケージを作れる
  • colconはいくつかのビルドタイプをサポートしてる
    • 推奨はament_cmakeament_python
    • ROS1ではCMakeLists.txtにいろいろ書いてたけど
    • ament_cmakeでは同じくCMakeListsに、ament_pythonではsetup.pyに色々書く

パッケージを作ってみる

練習としてpub/subのパッケージを作ってみます。 Exampleパッケージを参考にします。

GitHub - ros2/examples: Example packages for ROS2

作成したパッケージがこちらです。

github.com

$ cd ~/ros2_overlay_ws/src 
$ git clone https://github.com/ShotaAk/first_ros2_pkg

$ cd ..
$ colcon build

$ . ~/ros2_overlay_ws/install/local_setup.zsh
$ ros2 run first_python_pkg first_pub_node

[INFO] [first_pub_node]: Publishing: "Hello World! ^^: 0"
[INFO] [first_pub_node]: Publishing: "Hello World! ^^: 1"
~~~ 以下略~~~


# 別のターミナルで
$ . ~/ros2_overlay_ws/install/setup.zsh
$ ros2 run first_cpp_pkg first_sub_node

[INFO] [first_sub_node]: I heard: 'Hello World! ^^: 5 ^^
[INFO] [first_sub_node]: I heard: 'Hello World! ^^: 6' ^^
~~~ 以下略~~~

ポイント(自分がつまづいたところ)

  • install/[package_name]/lib 以下に実行ファイルを生成しないと、ros2 runできない
    • 例: ros2_overlay_ws/install/first_python_pkg/lib/first_python_pkg/
    • pythonのパッケージではsetup.cfgで対処している
    • cppのパッケージではCMakeLists.txtで対処している

次のステップ

次回はROS 2 TutorialsのIntrospection with command-line toolsからやっていきます。