はじめに
この記事は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に目を通しておきましょう。
ドキュメントより、サンプルコードや元の実装の方がわかりやすい場面が多々ある。
ドキュメントの整備が間に合ってないんだと思われます。ドキュメント通りにやっても行き詰まるようなら、早々にexamplesやturtlebot2_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になっているので、一からパッケージ作成する際は特に問題にならないはずです。
# 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:
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()