4脚ロボット制御用のROSパッケージであるCHAMPを、ROS 2 Humbleに対応させるためにPull Requestを作成しました。その際に遭遇した内容については、その他のROS 2パッケージにおいてもROS 2 GalacticからROS 2 Humbleに移行する際に影響する可能性がありそうなので共有します。
(※ROS 1からROS 2への移行ではありません)
この記事はROS 2 Advent Calendar 2022の19日目として投稿しています。
CHAMP
CHAMPは4脚ロボット制御をROSでもできるようにしようというプロジェクトで、2020年のROS WorldでJuanさんが発表したものです。入出力がmove_base互換なので移動ロボット用のパッケージもだいたいそのまま使うことができ、またMoveItのようにsetup_assistantもあるため、手軽に4脚ロボットをROS対応できるようになっています。当時はROS Kinetic/Melodicのみでしたが、その後AlexKaravaevさんの貢献によって2022年春にはROS 2 Galacticにも部分的に対応していました。
CHAMPについては、日本語の内容だと、nisshan_さんの記事が有名です。
CHAMPのROS 2 Galacticでの課題
ROS 2 GalacticはCHAMPで使う上では、ros2_controllers周りに課題がありました。具体的には、公式のros2_controllersのGalactic向けリリースにはJointTrajectoryControllerにeffortのcommand_interfacesが含まれていませんでした。
ROS 1でいうところのeffort_controllers::JointTrajectoryController
だと思われます。ros2_controllersではHardwareInterfaceをposition, velocity, effort以外にも指定できるようです。
ros(1)_control only allowed three hardware interface types: position, velocity, and effort. ros2_control allows you to create any interface type by defining a custom string. For example, you might define a
ros-controls/ros2_control_demos https://github.com/ros-controls/ros2_control_demos/blob/master/README.mdposition_in_degrees
or atemperature
interface. The most common (position, velocity, acceleration, effort) are already defined as constants in hardware_interface/types/hardware_interface_type_values.hpp.
effortのcommand_interfacesのためのコード自体が存在しなかったというではなく、masterブランチでは取り込まれていたため、ros2_controllersをforkしてeffortのcommand_interfacesに対応するためのパッチを当てたjoint_trajectory_controllerパッケージをGalactic向けに公開したユーザがいました。
CHAMPでは上記の有志がパッチを当てたros2_controllersをソースからビルドして使うような実装になっていました。APTでインストールできるパッケージはそのままでは使えないので、構成がややこしいです。
ROS 2 ControlについてはyoutalkさんのROSCon JP 2021のスライドがわかりやすく、とても勉強になりました。
CHAMPのROS 2 Humble対応
ROS 2 Galacticが2022年11月でEOLを迎えるため、ROS 2 Humbleで使いたいと思い、CHAMPをROS 2 Humbleで動かすためのPull Requestを作成しました。
4脚ロボット用のROSパッケージであるchampをROS 2 Humbleで動かすためのPull Requestを作成した🧐https://t.co/YMubxtegbk
— たいりょーくん (@Tiryoh) November 27, 2022
このPull Requestを作成することでROS 2 Humble+GazeboでCHAMPを動かせるようになりました!
このPull Requestの修正内容は主に3つです。
- C++17への対応
- ros2 control load_controllerのコマンド更新
- Gazebo用自作センサビルドエラー修正
C++17への対応
ROS 2 Galactic以降ではC++のバージョンがC++17に変わっています。
どういうわけかROS 2 GalacticのときはCMakeLists.txtでadd_compile_options(-std=c++14)
としてC++14を指定していても問題なくビルドできていたのですが、今回ROS 2 Humbleではビルドエラーが出たのでlibchampとあわせてC++17に対応するためにC++のソースの一部とCMakeLists.txtを修正しています。
ros2 control load_controllerのコマンド更新
CHAMPのlaunchファイルの中で、Gazeboを起動した後にROS 2 Controlのコントローラを読み込むため、ros2controlcliを使っています。
ROS 2 Galacticではload_controlerでset_stateするときに{configure,start}
で指定していました。
Command Line Interface — ROS2_Control: Galactic documentation
https://control.ros.org/galactic/doc/ros2_control/ros2controlcli/doc/userdoc.html#load-controller
しかし、ROS 2 Humbleではload_conrollerでset_stateするときに{configured,active}
で指定します。
Command Line Interface — ROS2_Control: Humble documentation
https://control.ros.org/humble/doc/ros2_control/ros2controlcli/doc/userdoc.html#load-controller
これはROS 2 Controlの2.12.0で変更された内容です。
start
をactivate
に変更するだけではありますが、この変更をしないと下記のようなエラーが出てしまうため、ROS 2 HumbleでROS 2 Controlを使うために重要な変更でした。
[ros2-9] ros2 control load_controller: error: argument --set-state: invalid choice: 'start' (choose from 'configured', 'active')
[ERROR] [ros2-9]: process has died [pid 104702, exit code 2, cmd 'ros2 control load_controller --set-state start joint_states_controller'].
Gazebo用自作センサビルドエラー修正
CHAMPではGazebo用にcontact_sensor(接触センサ)を自作して実装されています。
CMakeLists.txtの中でtarget_link_libraries(contact_sensor ${GAZEBO_LIBRARIES})
としてリンクしている箇所があるのですが、これがROS 2 Humbleでビルドするときに下記のエラーの原因になっているようでした。
CMake Warning (dev) at /usr/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:438 (message):
The package name passed to `find_package_handle_standard_args` (PkgConfig)
does not match the name of the calling package (gazebo). This can lead to
problems in calling code that expects `find_package` result variables
(e.g., `_FOUND`) to follow a certain pattern.
Call Stack (most recent call first):
/usr/share/cmake-3.22/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
/usr/lib/x86_64-linux-gnu/cmake/gazebo/gazebo-config.cmake:72 (include)
CMakeLists.txt:12 (find_package)
This warning is for project developers. Use -Wno-dev to suppress it.
/usr/bin/ld: CMakeFiles/contact_sensor.dir/src/contact_sensor.cpp.o: undefined reference to symbol '_ZN3tbb6detail2r114notify_waitersEm'
/usr/bin/ld: /lib/x86_64-linux-gnu/libtbb.so.12: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
gmake[2]: *** [CMakeFiles/contact_sensor.dir/build.make:238: contact_sensor] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:137: CMakeFiles/contact_sensor.dir/all] Error 2
gmake: *** [Makefile:146: all] Error 2
解決策は、以下のようにfind_packageでgazebo
ではなくgazebo_ros
を指定することでした。
(これについては適当に変更したらたまたま解決できたので、パッケージ名の変更が必要だった理由についてはきちんとした調査はできていません。何かわかったら追記したいと思います。)
-find_package(gazebo REQUIRED)
+find_package(gazebo_ros REQUIRED)
おわりに
4脚ロボット制御用のROSパッケージであるCHAMPの簡単な紹介と、そのCHAMPをROS 2 Humbleに対応させるためにPull Requestを作成したことを紹介しました。また、Pull Requestの内容について、ROS 2 GalacticからROS 2 Humbleにアップグレードする際に必要になりそうな項目という視点でまとめてみました。ROS 2 FoxyからROS 2 Humbleにアップグレードする際に必要になりそうな項目とも一致する部分はありそうです。
ROS 2 Humbleは2027年までサポートがあるので、積極的にいろいろなパッケージを使って、機会があればIssue/Pull Requestの作成をしていきたいと思います。
更新履歴
2023年12月3日
ros2_control ドキュメントへのリンク修正
コメント