在非系统自带的Python环境中使用CvBridge
使用最新的深度学习网络时往往需要较新版本的Python,在封装成ROS时,涉及到图像的发布/接收需要使用CvBridge。
1. 源码编译安装Python
apt安装的python缺少libpython3.Xm.so,无法编译boost,因此需要源码编译安装Python3.X(以Python3.7.9为例)
wget https://www.python.org/ftp/python/3.7.9/Python-3.7.9.tgz
tar -xvf Python-3.7.9.tgz
cd Python-3.7.9
./configure --prefix=/home/dcv/tools/python3.7.9 --enable-shared --enable-optimizations
make
sudo make install
加上–enable-shared是为了得到libpython3.Xm.so
如果要在虚拟环境中使用手动安装的python,需要在.bashrc里面加入:
export PATH=$PATH:/home/dcv/tools/python3.7.9/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/dcv/tools/python3.7.9/lib
如果pip不可用,使用以下命令重装:
wget https://bootstrap.pypa.io/get-pip.py
python get-pip.py --force-reinstall
如果在CMake的时候想指定Python,编译时使用:
cmake -DPython_EXECUTABLE=/home/dcv/tools/python3.7.9/bin/python3 ..
如果在virtualenv报错error while loading shared libraries: libpython3.Xm.so.1.0:cannot open shared object file: No such file or directory ,则执行:
cp libpython3.Xm.so.1.0 /usr/local/lib64/
cp libpython3.Xm.so.1.0 /usr/lib/
cp libpython3.Xm.so.1.0 /usr/lib64/
2. 编译安装boost
(1)下载代码
在 https://www.boost.org/users/history/ 上找到合适版本的boost源码,建议下载1.77以上的版本,这些版本会直接给出cmake文件方便编写CMakeLists
(2)编译boost
以Python3.7.9+Boost-1.78.0为例
./bootstrap.sh --with-python=python3 --with-python-root=/home/dcv/tools/python3.7.9/bin/python3.7 --with-python-version=3.7 --with-toolset=gcc
./bootstrap.sh --with-python=/home/dcv/tools/python3.7.9/bin/python3.7 --with-python-version=3.7 --with-python-root=/home/dcv/tools/python3.7.9/lib/python3.7
./b2 cflags='-fPIC' cxxflags='-fPIC' --with-python include="/home/dcv/tools/python3.7.9/include/python3.7m"
sudo ./b2 install
编译完成后会在 stage/lib 文件夹下面生成所需的 libboost_python37.a 和 libboost_python37.so,并在 stage/lib/cmake/Boost-1.78.0文件夹下面生成 BoostConfig.cmake 文件,可以用它在编译过程中找到Boost
3. 编译Cv_bridge
(1)创建工作空间并且将代码切换成符合本机软件的版本
mkdir -p cv_bridge_ws/src && cd cv_bridge_ws
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
apt-cache show ros-melodic-cv-bridge | grep Version
cd src/vision_opencv/
git checkout 1.XX.X # 改成前面查看的版本号
cd ../../
(2)修改CMakeLists
在 /vision_opencv/cv_bridge/CMakeLists.txt中第四行
find_package(catkin REQUIRED COMPONENTS rosconsole sensor_msgs)
之前加入以下三行:
set(Boost_DIR "/home/dcv/tools/boost_1_78_0/stage/lib/cmake/Boost-1.78.0") # BoostConfig.cmake 文件路径
set(rosconsole_DIR "/opt/ros/melodic/share/rosconsole/cmake") # 单独安装的Python可能需要这一行
set(sensor_msgs_DIR "/opt/ros/melodic/share/sensor_msgs/cmake") # 单独安装的Python可能需要这一行
(3)配置编译环境
指定编译所用的Python版本(也就是刚刚安装的Python3.7.9)
catkin config -DPYTHON_EXECUTABLE=/home/dcv/tools/python3.7.9/bin/python3 -DPYTHON_INCLUDE_DIR=/home/dcv/tools/python3.7.9/include/python3.7m -DPYTHON_LIBRARY=/home/dcv/tools/python3.7.9/lib/libpython3.7m.so -DSETUPTOOLS_DEB_LAYOUT=OFF
catkin config --install
加上-DSETUPTOOLS_DEB_LAYOUT=OFF是为了防止报错 error: option --install-layout not recognized
(4)编译
catkin build cv_bridge
(5)验证
source devel/setup.bash --extend # 加入--extend是为了防止后面的source覆盖掉前面的source
# 验证
python
>> import cv_bridge
>> from cv_bridge.boost.cv_bridge_boost import getCvType