Skip to content

catkinではないROSパッケージの取り扱いについて #1062

@kyawawa

Description

@kyawawa

Please excuse me for writing Japanese.

タイトルの通り,hrpsysやopenhrp3など,非catkin(build_typeがcmake)のROSパッケージの取り扱いについてです.

問題を先にハッキリさせておくと,非catkinのROSパッケージをincludeやlinkするときに,PATHの順番を相当気をつけないとsourceとdebが混ざってしまいます. ref: start-jsk/rtmros_choreonoid#224 start-jsk/rtmros_choreonoid#263
以下,具体例としてhrpsysで話を進めていきます.

原因は分かっていて,aptで入るhrpsysは${catkin_INCLUDE_DIRS}や${catkin_LIBRARY_DIRS}でおそらくほとんどの場合PATHが通ってしまうのに対して (/opt/ros/${ROS_DISTRO}/includeにPATHが通る),ソースで入れたパッケージに対しては${hrpsys_INCLUDE_DIRS}など固有の名称を使わないとPATHが通らないということに起因します.
このことが引き起こす問題点を並べると以下のとおりです.

  • catkin_INCLUDE_DIRSがhrpsys_INCLUDE_DIRSより前に来るとhrpsysがソースで入っていてもaptの方を参照する
  • openrtm_aistがaptでのみ入っている時,openrtm_aist_INCLUDE_DIRSがhrpsys_INCLUDE_DIRSよりも前に来るとhrpsysがソースで入っていてもaptの方を参照する (/opt/rosの方にPATHが通るため)
  • 問題に気づきにくい (コンパイルエラーならまだ良いが,中身が変わっていて動作が異なったり,リンク先が異なってセグフォで落ちたりする)

これらの問題点に加えて,難しいのは再発防止です.
上述の通りcatkin_INCLUDE_DIRSやopenrtm_aist_INCLUDE_DIRSを前に持ってきてしまうだけで問題が起こるので,今小手先で直してもいつかまた再発すると思われます.

個人的に思いつく解決策は,

  • build_typeをcatkinにする (catkin依存になるので現実的では無さそう)
  • build_typeがcmakeのパッケージはrosを使ったaptで入れない

くらいなのですが,何か良い方法はありますでしょうか?
今orocos_kdlを見てみたら同じようにbuild_typeがcmakeで,かつrosのaptでも入るようになっているので,諦めるしかないものなのでしょうか.

余談ですが,現在hrpsys_ros_bridgeはaptのhrpsysが無いとビルドが通らないようになっています.
https://github.com/start-jsk/rtmros_common/blob/master/hrpsys_ros_bridge/CMakeLists.txt#L104
このあたりに include_directories(${hrpsys_INCLUDE_DIRS})を入れると通ることは確認しています.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions