gscam + darknet_ros + image_view node 物体检测节点编译测试

环境配置

记录一下使用 gscam + darknet_ros + image_view node 做物体检测测试的过程。
在做这个测试前要先配置好ros2 ,gstreamer, nvidia显卡驱动的环境
我使用的环境如下:
gstreamer一般使用设备自带的即可,ros2要看ubuntu版本选择安装,我使用的是ubuntu22.04,
使用源码安装humble版本。nvidia驱动使用桌面版ubuntu的软件与更新->扩展驱动安装最新的即可,
安装完成后重启,使用nvidia-smi查看结果。
HP
ubuntu: 22.04
gstreamer: 1.20.3
ros2: humble
graphics: GA107M(RTX3050 Ti)
opencv: 3.4.16(这个是自己编译的,darknet_ros用4.x编译会失败)
cuda : 11.5
nvidia driver: 535.129.03

1. Install gscam

gscam 是ros2的一个节点,用于为ros2节点提供image更具体的请看github的介绍,地址:
https://github.com/ros-drivers/gscam

下载安装:
mkdir gscam/src && cd gscam/src (也可以放到ros_humble下编译,不用每次配置环境)
git clone git@github.com:ros-drivers/gscam.git -b ros2
cd …
colcon build --packages-select gscam

使用:
. ~/envtool/ros2_humble/install/local_setup.bash
source install/local_setup.bash
运行节点:ros2 launch gscam v4l.launch.xml

我编译的lunch文件在~/envtool/ros2_humble/install/gscam/share/gscam/examples/v4l.launch.xml
,可以自行配置参数。
编译这个应该不会有什么错误。最多是一些库需要用apt安装一下。下面安装image_view node 来测试一下它。

2.install image_pipeline && vision_opencv

vision_opencv编译darknet_ros需要用到
安装 image_pipeline vision_opencv:
cd ~/envtool/ros2_humble/src/ros-perception
git clone git@github.com:ros-perception/image_pipeline.git -b humble
git clone git@github.com:ros-perception/vision_opencv.git -b humble

编译:
cd …/…/ (回到ros2_humble)
colcon build --symlink-install

可能会有错误:
错误:找不到 boost_pythonConfig.cmake,执行下面命令在编译
apt-cache search boost-python
sudo apt install libboost-python1.74-dev
sudo apt install libboost-python1.74.0
如果找不到**Config.cmake可以使用上面的方法安装,但这只能适用于ubuntu 与ros版本对应的情况,如果ubuntu22
源码装ros2 foxy或 u20装 humble就要动手上谷歌搜 boost_python使用源码安装了。(也有可能apt安装的库可以向下兼容,不过如果库与ros有关 eg: ros_***的,一定要用源码安装,apt无法安装,这是我在ubuntu18/04上安装 foxy的经验。对应关系:20.04 -> foxy ,22.04 -> humble)

2.2 gscam + image_pipeline测试

执行如下命令:
打开一个terminal
source ~/envtool/ros2_humble/install/local_setup.bash
source /opt/ros/humble/local_setup.bash
ros2 launch gscam v4l.launch.xml

在开一个:
source ~/envtool/ros2_humble/install/local_setup.bash
source /opt/ros/humble/local_setup.bash
ros2 launch gscam v4l.launch.xml
ros2 run image_view image_view --ros-args --remap image:=/v4l/camera/image_raw

3.安装darknet_ros

darknet_ros虽然年代久远,但是用来学习还是不错的。
节点地址: https://github.com/leggedrobotics/darknet_ros

3.1 获取code:

mkdir darknet_ros/src && cd darknet_ros/src
git clone --recursive git@github.com:leggedrobotics/darknet_ros.git -b foxy

cd 到darknet下 git branch 查看分支有没有在 508381b,没有的话手动切,仓库没有clone下来的话就手动clone一下,
然后: git checkout 508381b ,如下图:
在这里插入图片描述

3.2 编译code

命令:
colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release
有很多错误,毕竟我使用的是foxy版本,放到humble下且darknet_ros年代久远,接下来解决编译中的bug

3.3 编译问题

3.3.1 nvcc fatal : Unsupported gpu architecture ‘compute_30’ nvcc fatal : Unsupported gpu architecture ‘compute_30’

compute_30已经被cuda11放弃使用了,将Cmakeist.txt 中这一行对应内容注释掉即可。

3.3.2 opencv多版本共存

具体错误忘记是什么了,总之是没有安装opencv导致的。安装:
pip install opencv-python
pip install --upgrade pip

安装后的版本是4.5.4用这个版本编译,在我的另外一台设备(没有nvidia独立显卡和cuda是可以编译通过的)。
但是现在这一台不行,尝试了多种方法后只能选择使用 opencv3.x来编译darknet_ros了。我推测darknet_ros
是在opencv3.x、环境下开发的。 保留原有的opencv4.5.4,使用源码编译的方式 安装opencv3.4.16
( 3.x都可 )),使两个版本共存

opencv: github地址:https://github.com/opencv/opencv/releases

下载下面两个压缩文件
OPENCV
https://github.com/opencv/opencv/releases/tag/3.4.16
OPENCV_CONTRIB
https://github.com/opencv/opencv_contrib/releases/tag/3.4.16

mkdir opencv3.4.16 && cd opencv3.4.16 && mkdir build
在这里插入图片描述
cd opencv3.4.16/build ,在build目录下执行
执行编译命令:

CPU 版本:(过了)
cmake -D CMAKE_BUILD_TYPE=Release \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.16 \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.16/modules \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_ENABLE_NONFREE=True ..
GPU 版本 (没编译通过)
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.16 \
-D CUDA_ARCH_BIN='8.6' \
-D WITH_CUDA=ON -D WITH_QT=ON -D OPENCV_GENERATE_PKGCONFIG=ON \
-D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.16/modules \
-D INSTALL_C_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON ..
GPU编译二 (没过)
编译命令:
cmake -D CMAKE_BUILD_TYPE=RELEASE \
 -D CMAKE_INSTALL_PREFIX=/usr/local/opencv3.4.16 \
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D INSTALL_C_EXAMPLES=ON \
 -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib-3.4.16/modules \
 -D PYTHON3_EXECUTABLE=/usr/bin/python3 \
 -D PYTHON_EXECUTABLE=/usr/bin/python \
 -D WITH_TBB=ON \
 -D WITH_V4L=ON \
 -D WITH_QT=ON \
 -D WITH_GTK=ON \
 -D WITH_VTK=ON \
 -D WITH_OPENGL=ON \
 -D WITH_OPENMP=ON\
 -D BUILD_EXAMPLES=ON \
 -D WITH_CUDA=ON \
 -D BUILD_TIFF=ON \
 -D ENABLE_PRECOMPILED_HEADERS=OFF\
 -D INSTALL_PYTHON_EXAMPLES=ON \
 -D OPENCV_GENERATE_PKGCONFIG=ON \
 -DOPENCV_ENABLE_NONFREE=ON \
 -D CUDA_nppicom_LIBRARY=stdc++ \
 -D CUDA_ARCH_BIN="8.6" ..

参考: https://blog.csdn.net/weixin_49099730/article/details/128478549
在这里插入图片描述
成功执行上面命令后继续执行:

sudo make -j8 //编译
sudo make install //安装
sudo ldconfig -v //查看

在编译的过程中可能会有一些问题,一般都是一些依赖没有安装
sudo apt-get install -y libprotobuf-dev
配置opencv3.4.16到共享库列表 ,此时在编译darknet_ros应该就可编译过了,但是执行时会出现连接库找不到的问题

3.3.3 libopencv_highgui.so找不到

运行 ros2 launch darknet_ros darknet_ros.launch.py 出错
libopencv_highgui.so找不到,
配置如下:注意文件位置
找到这个库
在这里插入图片描述
添加一个文件 : sudo vim /etc/ld.so.conf.d/opencv.conf
在这里插入图片描述刷新: sudo ldconfig

还要配置环境变量
vim ~/.bashrc
加入 export PKG_CONFIG_PATH=/usr/local/opencv3.4.16/lib/pkgconfig
source ~/.bashrc

查看opencv版本:
pkg-config --modversion opencv (就是我们安装的3.4.16了)
pkg-config --modversion opencv4

如果想在加其他版本的opencv像上面步骤添加即可 *.pc文件自己改一下名字。
这样在编译和执行就应该没问题了

3.3.4 找不到darknet_ros_core_lib库

查看darknet_ros/src/darknet_ros/darknet_ros下的CMakeList.txt,CUDA_FOUND为真,不会编译darknet_ros_core_lib库,
把这一行注释掉:
#${PROJECT_NAME}_core_lib

注意 darknet_ros会使用到vision_opencv中 cv_bridge node

这个节点作用是沟通 ros2 与 opencv, 这个编译使用opencv4.x没问题,但是编译darknet_ros时还是会报一些警告,所以将这个
也用opencv3.4.16编译一下,修改它的CMakeList.txt
find_package(OpenCV QUIET) 看了下好像不用修改,添加了opencv3.x后默认应该就是先找到3.x版本的,
find_package(OpenCV 4.5.4 QUIET) 才是找4.5.4版本了。

ok,在编译一下ros_humble,然后编译darknet_ros,应该就没什么问题了。

4 测试

每打开一个terminal都要执行:
source ~/envtool/ros2_humble/install/local_setup.bash
source /opt/ros/humble/local_setup.bash

然后执行下面的命令:(每个ros2 node的 local_setup.bash也要执行一下,都在install目录下)

启动gscam 发布视频:
ros2 launch gscam v4l.launch.xml
在这里插入图片描述
topic如下,v4l/camera/image_raw就是发布主题,darknet_ros通过这个主题接收数据
在这里插入图片描述 执行启启动darknet_ros
在这之前还要配置一下,ros.yaml (主要是接受topic),还有使用yovo3检测
在这里插入图片描述在这里插入图片描述

再编译一下,
在这里插入图片描述运行:
成功后执行下面命令,启动节点开始检测
ros2 launch darknet_ros darknet_ros.launch.py
darknet_ros可以配置是否需要预览,也可以使用image_view进行预览
在这里插入图片描述GPU状态
在这里插入图片描述 在darknet_ros/src/darknet_ros/darknet_ros/config目录下还可以配置是否需要预览,检测的目标有那些等等。

完成

<think>我们正在处理一个ROS环境中的问题,用户尝试启动darknet_ros节点时出现错误。错误信息表明系统无法找到darknet_ros包中的可执行节点,并提示检查文件是否存在以及权限是否可执行。根据引用内容,我们可以总结出几个可能的原因和解决方案:1.文件权限问题:需要确保darknet_ros节点文件具有可执行权限(使用chmod+x命令)。2.编译问题:如果刚刚添加了darknet_ros包,可能没有进行编译(需要运行catkin_make)。3.环境变量问题:可能是由于conda等环境变量干扰了ROS环境(需要检查.bashrc文件,并注释掉conda环境变量,然后source)。4.包配置问题:在CMakeLists.txt中需要包含catkin_package()语句(引用[4])。此外,引用[3]提到了一些具体的步骤,如放置权重文件、编译时指定Release类型以及修改ros.yaml文件中的话题,但这些与节点找不到的问题可能没有直接关系。因此,针对用户的问题,我们按照以下步骤来解决:步骤1:确保节点文件存在并且具有可执行权限-进入darknet_ros包的目录,通常位于`catkin_ws/src/darknet_ros/darknet_ros`下,查找名为`darknet_ros`的可执行文件(可能在`src`目录下,或者是在`nodes`目录下,具体取决于包的结构)。-如果找到该文件,则赋予可执行权限:`chmod+x<文件路径>`-如果找不到,可能需要重新编译。步骤2:重新编译工作空间-确保在ROS工作空间(通常是catkin_ws)下运行编译命令:```bashcd~/catkin_wscatkin_make```或者,如引用[3]提到的,使用:```bashcatkin_make-DCMAKE_BUILD_TYPE=Release```编译完成后,记得source工作空间:```bashsourcedevel/setup.bash```步骤3:检查环境变量-如果上述步骤没有解决问题,考虑是否是环境变量冲突(如conda环境)。检查`~/.bashrc`文件,如果之前有添加conda的环境变量,可以暂时注释掉,然后执行:```bashsource~/.bashrc```-然后再次尝试启动节点。步骤4:检查CMakeLists.txt-在darknet_ros包的CMakeLists.txt中,确保有`catkin_package()`的调用(即使没有参数也要有这一行)。步骤5:验证包是否被ROS识别-使用`rospackfinddarknet_ros`命令,看是否能找到该包。如果找不到,说明包没有被正确放置在src目录下或者没有被编译识别。如果以上步骤都执行了仍然有问题,可能需要检查包的完整性和依赖是否满足。根据用户描述,他们是在网上下载的模型文件,并且文件没有错误。但问题可能出在编译步骤的遗漏。因此,我们建议用户首先尝试重新编译,并赋予可执行权限。如果不行,再考虑环境变量问题。下面给出具体的解决步骤:</think>针对ROS节点启动错误 `ERROR: cannot launch node of type [darknet_ros/darknet_ros]: Cannot locate node of type [darknet_ros]`,请按以下步骤排查解决: ### 解决方案 1. **检查可执行文件权限** ```bash # 定位节点文件(通常位于包目录下) roscd darknet_ros cd nodes || cd src # 进入节点所在目录 ls -l darknet_ros # 查看文件权限 # 若无执行权限,添加权限: chmod +x darknet_ros ``` 2. **重新编译工作空间** ```bash cd ~/catkin_ws catkin_make -DCMAKE_BUILD_TYPE=Release # 引用[3] source devel/setup.bash # 刷新环境 ``` 3. **验证环境变量冲突** - 检查`~/.bashrc`中是否有conda环境变量冲突(引用[2]) - 临时注释conda初始化行(如`conda activate`) - 重新加载环境: ```bash source ~/.bashrc ``` 4. **检查CMake配置** - 确保`darknet_ros`包的`CMakeLists.txt`包含: ```cmake catkin_package() # 必须存在(引用[4]) add_executable(darknet_ros src/darknet_ros.cpp) target_link_libraries(darknet_ros ${catkin_LIBRARIES}) ``` 5. **验证包路径** ```bash echo $ROS_PACKAGE_PATH # 查看ROS包搜索路径 rospack find darknet_ros # 确认包位置 ``` - 若未找到,检查包是否在`catkin_ws/src`内 ### 验证是否解决 ```bash roslaunch darknet_ros darknet_ros.launch # 重新启动 ``` 若仍失败,检查启动文件`darknet_ros.launch`中节点路径: ```xml <node pkg="darknet_ros" type="darknet_ros" name="darknet_ros" output="screen"/> ``` 确保`type`属性值与可执行文件名**完全一致**(区分大小写)。 ### 常见原因总结 | 原因 | 解决方式 | 引用来源 | |---------------------|----------------------------------|----------| | 文件权限不足 | `chmod +x` 节点文件 | [^1] | | 未编译/未刷新环境 | `catkin_make && source devel/setup.bash` | [^1][^3] | | Conda环境冲突 | 注释`.bashrc`中的conda初始化 | [^2] | | CMake配置缺失 | 添加`catkin_package()` | [^4] |
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值