【问题标题】:ROS and OpenCV with CUDA on Jetson Nano : Incompatible versionsJetson Nano 上带有 CUDA 的 ROS 和 OpenCV:不兼容的版本
【发布时间】:2020-08-21 11:04:24
【问题描述】:

我想在我的 Jetson Nano 上使用 ROS 和支持 CUDA 的 OpenCV。在这一点上,我不关心版本。

问题:Jetson Nano 仅支持 CUDA 10 和 Ubuntu 18.04。 Ubuntu 18.04的ROS版本是Melodic,需要OpenCV 3.2,但OpenCV 3.2只支持CUDA 8。

我在 SO (CMake Error: Variables are set to NOTFOUND) 上找到了使用 CUDA 9 构建它的指南,但是在使用 CUDA 10 尝试它时失败,因为“错误:标识符“__shfl_down”未定义”和其他一些“__shfl_XXX " 错误。

这里有人成功地让它工作了吗?或者关于如何修复“__shfl_down”错误的任何想法?

OpenCV 3.2 可以与 CUDA 10.2 一起使用吗?

【问题讨论】:

  • 只有在实际使用 CUDA 8 或更早版本进行编译时才会出现这样的错误 stackoverflow.com/a/59018716/681865
  • 但是安装的cuda肯定是10.2,这也是cmake在配置过程中检测到的。配置中是否有问题,告诉 cmake 尝试使用 cuda 版本

标签: opencv ros nano nvidia-jetson


【解决方案1】:
  1. 选项 01:

    不,不要尝试使用 CUDA 10.2 进行构建,这是我的建议,在这两个方面你都处于安全状态。在您的包 CMakeLists.txt 中添加您的替代 OpenCV(Nano 随附),同时假设 main.cpp 是您的主文件,如果不更改它:

       set(OpenCV_INCLUDE_DIRS
          <path_to>/include
          <path_to>/include/opencv2
        )
    
        set(OpenCV_LIB_DIR
          <path_to>/lib
        )
    
        set(OpenCV_LIBS
          opencv_core
          opencv_highgui
          opencv_imgcodecs
        )
    
        include_directories(${OpenCV_INCLUDE_DIRS})
        link_directories(${OpenCV_LIB_DIR})
        add_executable(${PROJECT_NAME} src/main.cpp)
        target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})
    

    OpenCV_LIBS 下添加您在代码中使用的 OpenCV 模块

    注意:我无法在我的机器上进行测试,因此请将此视为暂定答案,如果您有问题请告诉我,我会尽力提供帮助

  2. 选项 02:

    catkin_make -DOpenCV_DIR=/usr/local/share/OpenCV

    注意:OpenCV_DIR 必须指向带有 opencv-conifg.cmake 文件的文件夹。 更多信息可以找到here

【讨论】:

  • 感谢您的建议,我会尝试看看是否有效。但是 cv_bridge 是否仍然使用 OpenCV 3.2,导致使用 cv_bridge 从 ROS 图像转换为 OpenCV 图像时出现兼容性问题?
  • 原则上,您的建议有效,但只有在我添加 cv_bridge 作为依赖项之前。然后我收到错误“项目'cv_bridge'指定'/usr/include/opencv'作为包含目录,未找到”。我想我必须从源代码构建 cv_bridge(以及任何依赖于 OpenCV 的模块),指定使用哪个 OpenCV?
  • 感谢您的更新,我也刚刚找到该帖子并尝试了它。不幸的是,它似乎只有在主要 OpenCV 版本匹配时才有效,因为它失败并出现错误“找不到与请求的版本“3”兼容的包“OpenCV”的配置文件”,然后将版本 4.1.1 列为不接受。
  • @Milan 你是如何构建 cv_bridge 的?下载 cv_bridge 包并尝试使用catkin_make -DOpenCV_DIR=/usr/local/share/OpenCV 构建或更改 cv_bridge 的 CMakeLists.txt 文件添加替代 opencv 位置
  • 是的,我使用了您的第一个选项,将 cv_bridge 下载到我的 catkin_workspace 并运行 catkin_make -DOpenCV_DIR=/usr/local/share/opencv4。那是我得到错误的时候。似乎 cv_bridge 正在检查以确保 opencv 版本是 3.x.x
【解决方案2】:

我找到了解决方案,尽管我还没有对其进行广泛的测试:

  1. 从源代码构建 OpenCV 4.2(任何支持 CUDA 10.2 的版本都应该工作),启用 CUDA。 https://www.pyimagesearch.com/2020/03/25/how-to-configure-your-nvidia-jetson-nano-for-computer-vision-and-deep-learning/ 提供了一个很好的指南(使用 tensorflow 等跳过部分)

  2. 安装 ROS Melodic。无需从源代码构建。

  3. 创建工作空间后,将 cv_bridge 和 image_transport 模块克隆到其中。重要提示:切换到分支“Noetic”!

  4. 在cv_bridge的CMakeLists.txt中,将find_package(Boost REQUIRED python37)改为find_package(BOOST REQUIRED python)

  5. 在函数do_numpy_import的cv_bridge/src/module.hpp中,将返回类型由void*改为void,并去掉return nullptr;

  6. 使用 catkin 构建工作区。它应该可以正常构建。

我已经测试了一个基本的图像发布,并在 rqt_image_view 中查看它。像魅力一样工作!

我知道这是一个有点老套的解决方案,所以如果有人知道更好的方法,请告诉我!

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 2020-04-30
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2020-12-16
    • 2018-12-31
    • 2021-10-26
    相关资源
    最近更新 更多