有時候,我們需要處理這些兼容性問題。此處列舉我的過程,以供參考
mkdir -p my_ws_py39/src
cd my_ws_py39
catkin_make_isolated-DPYTHON_EXECUTABLE=/usr/bin/python3 \-DPYTHON_INCLUDE_DIR=/usr/include/python3.8 \-DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.8.so
catkin_make_isolated allows per-package customization,和常見的 catkin_make 在這里區別不大。很多教程都推薦加上 --install,我這里沒有,因為失敗了,原因在下面。
其中,三個 命令行標識需要更改為你自己的環境路徑,你可以通過
python3 -c "import sysconfig; print(sysconfig.get_path('include'))"
python3 -c "import sysconfig; print(sysconfig.get_config_var('LIBDIR'))"
來找到后兩個。至于第一個,因為我在 miniconda下,可以通過指令
conda env list
查看。若是 linux,可以使用指令:
which python
顯示當前 激活的(actived) python環境。在編譯成功后,刷新當前環境,執行指令
source my_ws_py39/devel_ioslated/setup.bash
注意路徑。此處我處于?~路徑下。
然后,將 vision_opencv-melodic.zip?文件夾放在 my_ws_py39/src目錄下,并解壓。此處更通用的做法是通過 git 指令進行 clone。我不想花時間在 git 配置上,直接以 zip的形式下載。
再重新走一遍 上述的 catkin_make_isolated指令,帶上必要的命令行選項。
若成功,進行測試。
rospack find cv_bridge
查看文件路徑。
第二份測試方式,先在一個終端中執行 roscore,啟動 rosmaster。再在另一個終端中運行下述腳本,保證它能夠運行在 ros 網絡中。記得 通過指令?
chmod +x test_cv_bridge.py
?給腳本權限。此處,我假設腳本名為 test_cv_bridge.py
#!/usr/bin/env python
import rospy
from cv_bridge import CvBridge
import cv2if __name__ == '__main__':rospy.init_node('cv_bridge_test')bridge = CvBridge()# 創建一個空白圖像用于測試import numpy as npimg = np.zeros((100,100,3), dtype=np.uint8)try:# 將 OpenCV 格式轉換為 ROS 圖像消息img_msg = bridge.cv2_to_imgmsg(img, encoding="bgr8")rospy.loginfo("cv_bridge 工作正常!")except Exception as e:rospy.logerr("cv_bridge 測試失敗: %s", e)
Addition
我實際執行的語句
# 系統級的安裝
sudo apt-get install ros-melodic-cv-bridge ros-melodic-image-geometry
sudo apt-get install python3-dev# 虛擬環境中的安裝
pip install rospkg catkin_pkg# 實際使用的編譯指令
catkin_make_isolated -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9
source devel_isolated/setup.bash# 將 melodic 版本的package放入 /src目錄下后執行
catkin_make_isolated -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9
source devel_isolated/setup.bash#記得在 編譯后執行 source 刷新# 以下信息是另一個工作空間示例,使用 catkin_make
mkdir -p ws_py39/src
cd ws_py39/
catkin_make -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9 -DPYTHON_LIBRARY=/home/ncut/miniconda3/envs/tf/lib/libpython3.9.sosource devel/setup.bash
cd src/
catkin_create_pkg graduation std_msgs roscpp rospy
cd ../catkin_make -DPYTHON_EXECUTABLE=/home/ncut/miniconda3/envs/tf/bin/python3.9 -DPYTHON_INCLUDE_DIR=/home/ncut/miniconda3/envs/tf/include/python3.9 -DPYTHON_LIBRARY=/home/ncut/miniconda3/envs/tf/lib/libpython3.9.so
--install失敗的原因。
這里是log,方便查看:
error: option --install-layout not recognized
CMake Error at catkin_generated/safe_execute_install.cmake:4 (message):
execute_process(.../catkin_generated/python_distutils_install.sh)
returned error code
查了資料,因為?cv_bridge
的 setup.py
(或 CMakeLists.txt
)中的 --install-layout
選項在 Python 3 下不被識別。
為什么分兩次編譯
第一次編譯是為了 創建這個工作空間,然后通過 source 指令刷新該工作空間。這樣,后面的編譯操作,都會找到該工作空間中的信息,也即,它會使用python3。
第二次編譯則是為了編譯 cv_bridge。即我們真正的目的。
所以第一次編譯是 必要的 preprocess,預處理。