lib/choreonoid-1.8/python/cnoid/ROSPlugin.so が生成されない問題の報告

概要

2019/07/01 時点の choreonoid.git と choreonoid_rosplugin.git のコードでは、catkin_ws/devel/lib/choreonoid-1.8/python/cnoid/ROSPlugin.so が生成されない問題を発見しましたので、ご報告をいたします。
後半に問題の原因を記載いたしますので、コードの修正などをご検討頂ければ幸いです。

問題内容

Choreonoid 開発版 ドキュメント > World Robot Summit 2018 > ROSによる遠隔操作サンプルの手順に従って、ROS のインストールを行い、WRS2018 の ROS を用いた遠隔操作サンプル(T1L-DoubleArmV7S-ROS.py)起動させたところ、Choreonoid のコンソールに以下の Warning が表示され、正しくサンプルプロジェクトがロード出来ませんでした。

サンプルプロジェクトが正しくロードされない原因

エラーの発生箇所は catkin_ws/devel/share/choreonoid-1.8/WRS2018/script/WRSUtil.py の以下の箇所となります。

catkin_ws/devel/share/choreonoid-1.8/WRS2018/script/WRSUtil.py

        elif remoteType == "ROS":
            joystickInput.setController("JoyTopicSubscriberController")
            bodyPublisher = BodyPublisherItem()  <--
            bodyPublisher.name = "BodyPublisher"
            robot.addChildItem(bodyPublisher)

原因は catkin_ws/devel/lib/choreonoid-1.8/python/cnoid/ROSPlugin.so(以降 ROSPlugin.so) が存在しないため、上記 Python スクリプトで BodyPublisherItem を追加できずにエラーが発生しています。

ROSPlugin.so が存在しない原因

2019/07/01 時点の choreonoid.git と choreonoid_rosplugin.git のコードでは、ROSPlugin.so が生成されない状態になっているようです。

ROSPlugin.so が生成されない原因は以下の 2 点になります。

1) USE_PYBIND11

catkin_ws/src/choreonoid_rosplugin/src/CMakeLists.txt を確認しましたところ、ROSPlugin.so を生成するためには以下のオプション変数が ON になっている必要があります。

  • CHOREONOID_ENABLE_PYTHON
  • CHOREONOID_USE_PYBIND11

catkin_ws/src/choreonoid_rosplugin/src/CMakeLists.txt

if(CHOREONOID_ENABLE_PYTHON)
  if(CHOREONOID_USE_PYBIND11)
    add_subdirectory(pybind11)
  endif()
endif()

CHOREONOID_ENABLE_PYTHON と CHOREONOID_USE_PYBIND11 は以下で設定されます。

catkin_ws/src/choreonoid/misc/cmake/choreonoid-config.cmake.in

set(CHOREONOID_ENABLE_PYTHON @ENABLE_PYTHON@)
set(CHOREONOID_USE_PYBIND11 @USE_PYBIND11@)

ENABLE_PYTHON は catkin_ws/src/choreonoid/CMakeLists.txt で以下の通り ON が設定されるようになっておりますが、USE_PYBIND11 の設定は書かれていないため、CHOREONOID_USE_PYBIND11 には空が設定されています。
このため、catkin_ws/src/choreonoid_rosplugin/src/CMakeLists.txt の上記箇所で add_subdirectory(pybind11) を通らなくなり、ROSPlugin.so が生成されません。

catkin_ws/src/choreonoid/CMakeLists.txt

# Python
if(WIN32)
  option(ENABLE_PYTHON "Enable Python" OFF)
else()
  option(ENABLE_PYTHON "Enable Python" ON)
endif()

なお、以前は catkin_ws/src/choreonoid/CMakeLists.txt に USE_PYBIND11 を ON 設定するコードが書かれておりましたが、以下の修正で削除されたようです。

また、以下の修正で USE_PYBIND11 は削除されておりますが、上記 set(CHOREONOID_USE_PYBIND11 @USE_PYBIND11@) のように、USE_PYBIND11 を別の変数に設定している箇所や、if 文の条件式で USE_PYBIND11 の値を見ている箇所が残っているようです。

~/catkin_ws/src/choreonoid$ git log CMakeLists.txt
<..snip..>
commit 95f4460b7ed43680a76cb7417b2c71fac2b90bb2
Author: Shin'ichiro Nakaoka <s.nakaoka@aist.go.jp>
Date:   Thu May 16 18:12:02 2019 +0900

    Remove the description on boost.python from the top CMakeLists.txt
~/catkin_ws/src/choreonoid$ git --no-pager diff 95f4460b7ed43680a76cb7417b2c71fac2b90bb2^ 95f4460b7ed43680a76cb7417b2c71fac2b90bb2
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 33ce2ab..0feccc3 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -306,23 +306,15 @@ else()
 endif()

 # Python
-set(CNOID_PYTHON_SUBDIR ${CNOID_PLUGIN_SUBDIR}/python)
-
 if(WIN32)
   option(ENABLE_PYTHON "Enable Python" OFF)
 else()
   option(ENABLE_PYTHON "Enable Python" ON)
 endif()

-option(USE_PYBIND11 "Use the pybind11 library to make python bindings" ON)
+set(CNOID_PYTHON_SUBDIR ${CNOID_PLUGIN_SUBDIR}/python)
 set(PYBIND11_DIR ${PYBIND11_DIR} CACHE PATH "The directory of the pybind11 library")
-if(USE_PYBIND11)
-  set(USE_BOOST_PYTHON OFF)
-else()
-  set(USE_BOOST_PYTHON ON)
-endif()
-set(CNOID_USE_PYBIND11 ${USE_PYBIND11})
-set(CNOID_USE_BOOST_PYTHON ${USE_BOOST_PYTHON})
+set(CNOID_USE_PYBIND11 ON)
<..snip..>

2) pybind11 のインクルードパス設定

ROSPlugin.so を生成するにあたって、pybind11 を使用します。pybind11 を使用するにあたり、ビルド時に pybind11 のインクルードパスを設定する必要があります。
catkin_ws/src/choreonoid/misc/cmake/CMakeLists.txt の以下の箇所で当該パスの設定を行っておりますが、PYBIND11_DIR が空の値となっているため、pybind11 のインクルードパスが正しく設定されず、ビルド時に pybind11 のヘッダーファイルが見つからず、ビルドエラーとなります。

catkin_ws/src/choreonoid/misc/cmake/CMakeLists.txt

if(ENABLE_PYTHON AND USE_PYBIND11)
  list(APPEND include_dirs ${PYBIND11_DIR}/include ${PYTHON_INCLUDE_PATH})
endif()

なお、choreonoid.git 側のソースで pybind11 を使用して生成を行っている OpenRTMPlugin.so などについては、catkin_ws/src/choreonoid/CMakeLists.txt の以下の箇所で、pybind11 のインクルードパスとして、catkin_ws/src/choreonoid/thirdparty/pybind11-2.2.4/include が設定されるため生成ができているようです。

catkin_ws/src/choreonoid/CMakeLists.txt

  if(PYBIND11_DIR)
    include_directories(${PYBIND11_DIR}/include)
  else()
    include_directories(${PROJECT_SOURCE_DIR}/thirdparty/pybind11-2.2.4/include)
  endif()

catkin_ws/src/choreonoid/misc/cmake/CMakeLists.txt の当該箇所のコードは、以下の改修で追加されて以来、特にコードの変更などは行われていないようです。

~/catkin_ws/src/choreonoid$ git log misc/cmake/CMakeLists.txt
<..snip..>
commit cbf7a70c50472c10c20a8e5ddd0914a39ee0a93a
Author: Shin'ichiro Nakaoka <s.nakaoka@gmail.com>
Date:   Sat Aug 11 01:40:47 2018 +0900

    Add the CMake description for external package to build python bindings
~/catkin_ws/src/choreonoid$ git --no-pager diff cbf7a70c50472c10c20a8e5ddd0914a39ee0a93a^ cbf7a70c50472c10c20a8e5ddd0914a39ee0a93a
diff --git a/misc/cmake/CMakeLists.txt b/misc/cmake/CMakeLists.txt
index 4181247..1450783 100644
--- a/misc/cmake/CMakeLists.txt
+++ b/misc/cmake/CMakeLists.txt
@@ -8,6 +8,10 @@ set(include_dirs
   ${Qt5Network_INCLUDE_DIRS}
   )
 
+if(ENABLE_PYTHON AND USE_PYBIND11)
+  list(APPEND include_dirs ${PYBIND11_DIR}/include ${PYTHON_INCLUDE_PATH})
+endif()
+
 list(REMOVE_DUPLICATES include_dirs)

  if(PYBIND11_DIR)
    include_directories(${PYBIND11_DIR}/include)
  else()
    include_directories(${PROJECT_SOURCE_DIR}/thirdparty/pybind11-2.2.4/include)
  endif()

暫定対処をして確認

暫定的に各コードを以下のように修正し、catkin build を実行しましたところ、ROSPlugin.so が生成できることを確認しました。
また、T1L-DoubleArmV7S-ROS.py を起動させ、プロジェクトが正常にロードできること、および rosrun rqt_image_view rqt_image_view を実行し DoubleArmV7 のカメラ画像が rqt_image_view に表示できることも確認しております。

catkin_ws/src/choreonoid/CMakeLists.txt

~/catkin_ws/src$ diff -u choreonoid/CMakeLists.txt{.org,}
--- choreonoid/CMakeLists.txt.org	2019-06-21 12:05:24.563441000 +0900
+++ choreonoid/CMakeLists.txt	2019-06-26 15:49:37.654242037 +0900
@@ -315,6 +315,8 @@
 set(CNOID_PYTHON_SUBDIR ${CNOID_PLUGIN_SUBDIR}/python)
 set(PYBIND11_DIR ${PYBIND11_DIR} CACHE PATH "The directory of the pybind11 library")
 set(CNOID_USE_PYBIND11 ON)
+set(USE_PYBIND11 ON)

catkin_ws/src/choreonoid/misc/cmake/CMakeLists.txt

~/catkin_ws/src$ diff -u choreonoid/misc/cmake/CMakeLists.txt{.org,}
--- choreonoid/misc/cmake/CMakeLists.txt.org	2019-06-21 12:05:24.579441000 +0900
+++ choreonoid/misc/cmake/CMakeLists.txt	2019-06-26 15:50:43.866161367 +0900
@@ -11,7 +11,13 @@
   )
 
 if(ENABLE_PYTHON AND USE_PYBIND11)
-  list(APPEND include_dirs ${PYBIND11_DIR}/include ${PYTHON_INCLUDE_PATH})
+  #list(APPEND include_dirs ${PYBIND11_DIR}/include ${PYTHON_INCLUDE_PATH})
+  if(PYBIND11_DIR)
+    list(APPEND include_dirs ${PYBIND11_DIR}/include ${PYTHON_INCLUDE_PATH})
+  else()
+    list(APPEND include_dirs ${PROJECT_SOURCE_DIR}/thirdparty/pybind11-2.2.4/include ${PYTHON_INCLUDE_PATH})
+  endif()
 endif()

なお、上記のコード修正方法はビルドを通すための暫定的なものになりますので、正式な修正方法は改めてご検討頂ければ幸いです。

報告は以上となります。
宜しくお願いいたします。

ご指摘ありがとうございました。
また、お手数をおかけして申し訳ありませんでした。

こちらの不具合について、当方でも確認し、修正した旨を先程この掲示板でご報告しました。
ご指摘いただいた部分は恐らく修正できているかと思いますので、ご確認いただければ幸いです。
ご協力ありがとうございました。

nakaoka 様
ご返答ありがとうございます。

07/17 時点での choreonoid.git と choreonoid_rosplugin.git の最新版のコードを取得しビルドを行いまして、ROSPlugin.so が生成されること、および、ROS を用いた遠隔操作サンプルプロジェクト(T1L-DoubleArmV7S-ROS.py) が正常にロード出来ることを確認しました。
遠隔操作用の PC から DoubleArmV7 が操作できることも確認しております。

不具合修正のご対応ありがとうございました。