LoginSignup
6
6

More than 5 years have passed since last update.

【自分用メモ】ROS2開発&移行Tips

Posted at

はじめに

この記事はROS2のパッケージの作成やROS1パッケージからのROS2移行にあたって私が躓いた点とその解決策を書き残していく備忘メモです。

今までに作ったもの

  • ros2_whill(WHILL Model CR用 ROS2パッケージ)

以下、雑多なメモ(未整理)

colconは別インストール

ROS2をソースからビルドするのではなく、debianパッケージからインストールするルートを選んだ時に陥りがちな罠。

sudo apt install python3-colcon-common-extensions

参考:
ubuntu18.04にROS2 crystalをインストールしたがcolconが使えない

命名規則、msg/srvの場所が変わっている

ROS2.0時代に備えたc++11/14 p.6に目を通しておきましょう。

ドキュメントより、サンプルコードや元の実装の方がわかりやすい場面が多々ある。

ドキュメントの整備が間に合ってないんだと思われます。ドキュメント通りにやっても行き詰まるようなら、早々にexamplesturtlebot2_demoのコードを読んでみた方が早く解決できることがあります。

コンパイラはC++14を使う(確定)

公式チュートリアルのMigration guide from ROS 1には下記のようにC++11を使うような指示がありますが、おそらくこれは古い記述の名残です。

In your CMakeLists.txt:
Start by enabling C++11

現行のROS2上でをパッケージをC++11でビルドしようとするとROS Answers: rclcpp parameter build failにもあるようにパラメータ関連のビルドが失敗します。

The CMake code of that package sets the compiler flag -std=c++11. If you are using the current ROS 2 code base you will need C++ 14.

今のところ、私はROS2リポジトリにあるExampleコードのCMakeLists.txtを参考にして上手く行っています。
この辺りは、ros2 pkg create [package_name]で生成されるCMakeLists.txtは最初からC++14になっているので、一からパッケージ作成する際は特に問題にならないはずです。

ros2/examples/rclcpp/minimal_publisher/CMakeLists.txt
# Default to C++14
if(NOT CMAKE_CXX_STANDARD)
  set(CMAKE_CXX_STANDARD 14)
endif()
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

実行ファイルのインストール先はlib/${PROJECT_NAME}

上記と同じくMigration guide from ROS 1の不備(?)ですが、最後のinstallコマンドでDESTINATION binになっているとros2 runから発見されないです。

install(TARGETS talker RUNTIME DESTINATION bin)

install(TARGETS talker RUNTIME DESTINATION lib/${PROJECT_NAME})

参考:
ROS2 Tutorialsをやってみた ~パッケージ作成~
ROS2 runコマンドをいじってみた

メッセージ、サービスを定義する場合は別パッケージにする(調査中)

Introduction to msg and srv interfacesでは下記のように書かれているのでカスタムメッセージやカスタムサービスを本体パッケージの中で生成できるはずなのですが、何度やってもうまくいきませんでした。こういう場合、ros2_whillに対するros2_whill_interfacesのように別パッケージにしておくととりあえず回避できます。

In order to use the messages generated in the same package we need to use the following cmake code:

CMakeLists.txt
get_default_rmw_implementation(rmw_implementation)
find_package("${rmw_implementation}" REQUIRED)
get_rmw_typesupport(typesupport_impls "${rmw_implementation}" LANGUAGE "cpp")

foreach(typesupport_impl ${typesupport_impls})
  rosidl_target_interfaces(publish_address_book
    ${PROJECT_NAME} ${typesupport_impl}
  )
endforeach()
6
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
6