OpenCV 4.5.5を使用してArUcoマーカを認識し、画像をROSトピックでパブリッシュしてRvizに表示しようとした際に、ROSのOpenCV 3.2.0とOpenCV 4.5.5のバージョン競合によりArUcoマーカの認識処理でエラーが発生しました。今回は、その対応方法について解説します。

1. 使用した環境

・Ubuntu 18.04 LTS
・OpenCV 4.5.5
・ROS Melodic Morenia

2. 発生現象

ArUcoマーカ認識プログラムをROSパッケージとしてビルドを行い、プログラムを実行したところ以下のエラーが発生しました。これは、ROSのOpenCV 3.2.0と新しくインストールしたOpenCV 4.5.5のバージョン競合によるエラーが原因でした。
 
【ターミナル①】

roscore

【ターミナル②】

rosrun aruco_marker arMarkerRecognizer_node
Segmentation fault (コアダンプ)

上記のプログラムは、以下からダウンロードできます。
<https://rtc-fukushima.jp/wp/wp-content/uploads/2022/11/arMarkerRecognizerNode.zip>

3. 対応方法

今回発生したエラーの対応方法は、2パターンあります。
1. ROSのOpenCV 3.2.0を参照する。
2. cv_bridge関連のcmakeファイルを修正し、OpenCV 4.5.5で実行できるようにする。
 
1の対応では、CMakeLists.txtで使用するOpenCVのバージョンを指定します。
【CMakeLists.txt】

SET(OCV_VERSION "3.2")
find_package(OpenCV ${OCV_VERSION} REQUIRED)

 
2の対応では、CMakeLists.txtでバージョンを指定する必要はありませんが、ROSのcv_bridgeのcmakeファイルを修正する必要があります。
【CMakeLists.txt】

find_package(OpenCV REQUIRED)

以下のコマンドを実行し、編集ファイルのバックアップを作成します。

cd /opt/ros/melodic/share/cv_bridge/cmake
sudo cp -fp cv_bridgeConfig.cmake cv_bridgeConfig.cmake.bkyyyyMMdd
sudo cp -fp cv_bridge-extras.cmake cv_bridge-extras.cmake.bkyyyyMMdd

※yyyyMMddは、バックアップ取得日
 
cv_bridgeConfig.cmakeの94~96、122行目をコメントアウトし、97~99、123行目を追加します。
【cv_bridgeConfig.cmake】

# if(NOT "include;/usr/include;/usr/include/opencv " STREQUAL " ")
#   set(cv_bridge_INCLUDE_DIRS "")
#   set(_include_dirs "include;/usr/include;/usr/include/opencv")
if(NOT "/usr/local/include/opencv4;include;/usr/include;/usr/include/opencv " STREQUAL " ")
   set(cv_bridge_INCLUDE_DIRS "")
   set(_include_dirs "/usr/local/include/opencv4;include;/usr/include;/usr/include/opencv")
# set(libraries "cv_bridge;/usr/lib/x86_64-linux-gnu/libopencv_core.so.3.2.0;/usr/lib/x86_64-linux-gnu/libopencv_imgproc.so.3.2.0;/usr/lib/x86_64-linux-gnu/libopencv_imgcodecs.so.3.2.0"))
set(libraries "cv_bridge;/usr/local/lib/libopencv_core.so.4.5.5;/usr/local/lib/ libopencv_imgproc.so.4.5.5;/usr/local/lib/ libopencv_imgcodecs.so.4.5.5")

cv_bridge-extras.cmakeの1~6行目をコメントアウトし、7~12行目を追加します。
【cv_bridge-extras.cmake】

# set(OpenCV_VERSION 3.2.0)
# set(OpenCV_VERSION_MAJOR 3)
# set(OpenCV_VERSION_MINOR 2)
# set(OpenCV_VERSION_PATCH 0)
# set(OpenCV_SHARED ON)
# set(OpenCV_CONFIG_PATH /usr/share/OpenCV)
set(OpenCV_VERSION 4.5.5)
set(OpenCV_VERSION_MAJOR 4)
set(OpenCV_VERSION_MINOR 5)
set(OpenCV_VERSION_PATCH 5)
set(OpenCV_SHARED ON)
set(OpenCV_CONFIG_PATH /usr/local/share/opencv4)

 
上記の対応を行うことで、以下のようにArUcoマーカの認識結果をRvizに表示できます。


図 1. ArUcoマーカの認識結果

 
いかがでしたでしょうか。
ROSのOpenCVとのバージョン競合に関する情報は調査しても少なかったので、掲載いたしました。
少しでも皆様のお役に立てれば幸いです。ぜひ、ご活用ください。