-
Notifications
You must be signed in to change notification settings - Fork 53
Description
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})を入れると通ることは確認しています.