はじめに
ROSで画像をMessageとしてPub/Subしたい場合は,CvBridgeを使うのが一般的だと思います.
しかし,Python3からCvBridgeを使おうとするとエラーになります.
(前回,ROSノードをPython3で動かす方法を紹介しました)
CvBridge自体はPython2用にインストールされていて,Python3でROSノードを動かすとPython3でCvBridgeを動かすことになるので,エラーになります.
そこでCvBridgeをPython3用にビルドするのですが,ネットの記事だとエラーになったので,解決策を備忘録的に残します.
環境構築
Pythonはビルドイン・仮想環境どちらでも問題ないです.
(どちらかというと仮想環境向けです)
$ mkdir -p ~/cvbridge_build_ws/src
$ cd ~/cvbridge_build_ws/src
$ git clone -b melodic https://github.com/ros-perception/vision_opencv.git
$ cd vision_opencv
$ git checkout 578af4d6c7846876b3fc64512b1cc92a54894483
$ cd ../..
$ source /opt/ros/melodic/setup.bash
$ catkin config \
-DCMAKE_BUILD_TYPE=Release \
-DSETUPTOOLS_DEB_LAYOUT=OFF\
-DPYTHON_EXECUTABLE={Pythonのパス} \
-DPYTHON_LIBRARY={Pythonのlibパス} \
-DPYTHON_INCLUDE_DIR={Pythonのincludeパス}
$ catkin config --install
$ catkin build cv_bridge
$ source install/setup.bash --extend
ex)
$ catkin config \
-DCMAKE_BUILD_TYPE=Release \
-DSETUPTOOLS_DEB_LAYOUT=OFF\
-DPYTHON_EXECUTABLE=~/.anyenv/envs/pyenv/versions/3.9.1/bin/python \
-DPYTHON_LIBRARY=~/.anyenv/envs/pyenv/versions/3.9.1/lib/libpython.3.9.so \
-DPYTHON_INCLUDE_DIR=~/.anyenv/envs/pyenv/versions/3.9.1/include/python3.9
Checkoutしてバージョンを戻していますが,最新でも問題ないと思います.
開発の際の注意点
元々入っているPython2のCvBridgeを削除しない場合,
PYTHONPATHの順番に注意しないとビルドしたCvBridgeが使われません.
ROS本体の順番が先だとPython2のCvBrdigeが使われます.
この順番だとダメ(root直下にワークスペースを作ってるので以下のようになっているので,順番だけ見てください)
$ echo $PYTHONPATH
/opt/ros/melodic/lib/python2.7/dist-packages:/cvbridge_build_ws/install/lib/python3.9/site-packages
解決策としては,以下.
- PYTHONPATHの先頭に明示的に追加する
- sourceの順番を変える
1.PYTHONPATHの先頭に明示的に追加する
こちらは2回記述されてすっきりしないのと,site-packagesまで記載しないといけないので面倒です.
$ export PYTHONPATH=~/cvbridge_build_ws/install/lib/python3.9/site-packages/$PYTHONPATH
2.sourceの順番を変える
ROS(関連)のsetup.shの中を見ると,自身のPYTHONPATHをPYTHONPATHの先頭に追加しています.
なので,ROS本体のsetup.bash(sh)より後にCvBridgeのsetup.bash(sh)を実行すれば解決します.
Dockerfileで環境を作っている場合は,
bashrcに記載するかentrypointで順番をコントロールすれば面倒はないかと思います.
まとめ
CvBridgeをPython3から使う方法を紹介しました.
ご参考になれば幸いです.