Anaconda环境下使用ROS进行深度学习实例分割。

项目场景:

本次任务主要是将基于anaconda环境下的pytorch图像分割的代码,移植到ROS-—kinectic上。实现通过ROS的命令去启动我们anaconda下的深度学习的代码实现图像分割。


问题描述:

但是这个任务存在最大的难点在于,pytorch图像分割的代码使用的是python3,而ROS_kinectice使用的是python2,两者的原本的环境会像冲突。我们要同时使用两个环境,就必须要兼并两者的环境

首先遇到的第一个问题是

Traceback (most recent call last):
  File "test.py", line 2, in <module>
    import cv2
ImportError: /opt/ros/kinetic/lib/python2.7/dist-packages/cv2.so:  undefined symbol: PyCObject_Type

遇到这样的问题,一般在是我们的电脑中存在ros时,并且在anaconda的虚拟环境下,使用python3的程序,其中import cv2这个包的时候,会报出这个错误。为了解决这个错误我们需要进行如下操作

cd /opt/ros/kinetic/lib/python2.7/dist-packages/
sudo mv cv2.so cv2_ros.so

这样操作之后,你就可以在import cv2了。并且不会受到ros的干扰了。


然后我们需要创建ROS空间,并且在anaconda的环境下去启动我们的ROS空间,进行操作:

这一步需要同时兼容anaconda和ros两个环境,所以bashrc下的两个环境都不可以屏蔽。而且因为是在python3下进行图片的读取以及处理操作。最后要在ros下进行转换。转换涉及到的库是cv_bridge。这个库ros默认是在python2下编译的。所以我们用python3必定会报错。
报错如下所示:

[ERROR] [1520780674.845066]: bad callback: <bound method ViewsBuffer.update of <__main__.ViewsBuffer object at 0x7f5f45a07f28>>
Traceback (most recent call last):
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/rospy/topics.py", line 750, in _invoke_callback
    cb(msg)
  File "test.py", line 48, in update
    im = self.bridge.imgmsg_to_cv2(im, "bgr8")
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 163, in imgmsg_to_cv2
    dtype, n_channels = self.encoding_to_dtype_with_channels(img_msg.encoding)
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 99, in encoding_to_dtype_with_channels
    return self.cvtype2_to_dtype_with_channels(self.encoding_to_cvtype2(encoding))
  File "/opt/ros/kinetic/lib/python2.7/dist-packages/cv_bridge/core.py", line 91, in encoding_to_cvtype2
    from cv_bridge.boost.cv_bridge_boost import getCvType
ImportError: dynamic module does not define module export function (PyInit_cv_bridge_boost)

故,我们需要重新用python3单独编译这个cv_bridge,再把它导入到我们的环境下,完成python3到ros的图像转换过程。


解决方案:

首先要在python3的环境下安装一些链接。注意此处的python3并不是anaconda下的python3,是ubuntu16.04默认的python3.5的环境,(注意也不是(base)环境)。添加一些依赖。
sudo apt-get install python-catkin-tools python3-dev python3-catkin-pkg-modules python3-numpy python3-yaml ros-kinetic-cv-bridge

首先新创建一个工作空间

mkdir catkin_workspace
cd catkin_workspace
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.5m -DPYTHON_LIBRARY=/usr/lib/x86_64-linux-gnu/libpython3.5m.so
mkdir src  

然后进入到 src中,通过git clone进行下载编译cv_bridge

cd src
git clone https://github.com/ros-perception/vision_opencv.git src/vision_opencv
cd vision_opencv/
git checkout 1.12.8
cd ../../
catkin_make -DPYTHON_EXECUTABLE=/usr/bin/python3

上面那条catkin_make 命令,加了-DPYTHON_EXECUTABLE=/usr/bin/python3
,表示该工作空间下的编译环境自动设置为python3。之后再编译的话,默认使用python3.直接catkin_make即可。
如果遇到报错

在这里插入图片描述是因为cmake尝试去找libboost_python3.so的库,但是ubuntu下这个名字一般叫libboost_python-py35.so(/usr/lib/x86_64-linux-gnu/libboost_python-py35.so),所以可以去src/vision_opencv/cv_bridge/CMakeLists.txt 下将

find_package(Boost REQUIRED python37)
#修改为
find_package(Boost REQUIRED python-py35)

修改之后,在编译即可。
完成以上工作。我们就拥有了一个可以调用python3版本的cv_bridge.
然后在该工作空间下使用命令

source devel/setup.bash
cd ..

此时不要新开终端,就在刚刚用的这个终端下(它包含了cv_bridge的环境信息),然后我们再进入到我们需要进行图像分割的ROS空间下,
首先打开虚拟环境。

conda activate pytorch
cd catkin_XXX #这个是你自己存放算法的ros空间。
source devel/setup.bash --extend #(此处的extend表示扩展环境变量,他不会覆盖之前的环境变量。)
然后我们在启动我们的rosrun命令,启动ros节点。
  • 6
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值