由于项目需要,需要使用ros topic发布工业相机的图片,这里使用到了ros中的CVbridge,因为默认的CVbridge使用ros 的python2.7,但是subscriber接收到图片后使用YOLO检测目标,YOLO需要在python3下运行
了解到有两种解决方法:
1. 新建一个工作空间,在python3下编译CVbridge。
2. 新建一个中间节点,中间节点接受图片并把图片转为自定义message发布出来。
这里只尝试第一种方法,以下是详细过程。
硬件: NVIDIA JETSON NX + 大恒工业相机USB3.0接口
软件:JetPack 4.4, Python3.6 .9,Ros Melodic,Opencv 4.1.11
未使用 Anaconda
首先创建一个新的工作空间
mkdir catkin_workspacecd catkin_workspacemkdir src在工作空间中配置依赖,前两个参数都一样,注意最后一个jetson为 arm 架构,文件名不一样。注意:根据评论反馈,每个人的环境存在差异,路径需要查看自己的环境
catkin config -DPYTHON_EXECUTABLE=/usr/bin/python3 -DPYTHON_INCLUDE_DIR=/usr/include/python3.6m -DPYTHON_LIBRARY=/usr/lib/arrch64-linux-gnu/libpython3.6m.socatkin config --install在工作空间中克隆cv_bridge包。注意:ROS Melodic对应的cv_bridge的依赖为OpenCV3,Jetson NX自带的为OpenCV4,这里我们选择编译Noetic版的cv_bridge,其依赖为OpenCV4。
cd srcgit clone https://github.com/ros-perception/vision_opencv.git接下来返回上一目录进行编译
cd ..catkin build最后source环境
source install/setup.bash --extend使用如下,先引用其他头文件,使用sys.path.remove移除python2.7环境,再使用sys.path.append添加刚才编译的cv_bridge所在的python3环境。注意:这里要注意引用顺序,顺序不对会导致某些引用报错。
import roslibimport rospyfrom geometry_msgs.msg import Quaternion from sensor_msgs.msg import Imagefrom neuvition_driver.msg import testfrom publishers.msg import scaleimport timeimport cv2import pycuda.autoinit # This is needed for initializing CUDA driverimport numpy as npimport ctypesimport tensorrt as trtimport pycuda.driver as cudaimport sysimport threadingimport randomsys.path.remove("/opt/ros/melodic/lib/python2.7/dist-packages")import cv2sys.path.append("/home/nvidia/Documents/xw/catkin_work/install/lib/python3/dist-packages")from cv_bridge import CvBridge, CvBridgeErrorhttps://www.codeleading.com/article/56434046919/

免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删