环境配置
记录一下使用 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目录下还可以配置是否需要预览,检测的目标有那些等等。
完成