跑在ros下的yolo过程记录
设备(r9000p2021款):win11 3070ti
基础环境
wsl (windows下的linux子系统)
优点:开销小、可以同时使用windows和linux减小开发难度
-
在Windows 10上启用WSL(Windows Subsystem for Linux)的步骤如下:
- 打开“控制面板”并选择“程序和功能”选项。
- 单击左侧的“启用或关闭Windows功能”链接。
- 滚动到底部并选中“适用于Linux的Windows子系统”复选框。
- 单击“确定”按钮并等待Windows完成安装。
- 重新启动计算机以完成安装。
(同时启动的虚拟机平台、hype-v)
-
设置默认版号和wsl内核更新(这个版号很重要,v2的wsl可以做到与win丝滑交互)
wsl --set-default-version 2
wsl --update
-
安装wsl
在 Windows 应用商店搜索
ubuntu
,选择自己喜欢的版本,安装即可。这里我选择的是Ubuntu 18.04 LTS
,之后的所有内容也是基于 WSL Ubuntu 编写。 -
初始化wsl 设置用户名和密码
-
用户权限 permission deny 的问题
在/etc/wsl.conf文件中添加
[automount]
enabled = true
root = /mnt/
options = "metadata,umask=22,fmask=11"
mountFsTab = false
然后在~/.bashrc文件中加入umask解决deny问题
#Fix mkdir command has wrong permissions
if grep -q Microsoft /proc/version; then
if [ "$(umask)" == '0000' ]; then
umask 0022
fi
fi
-
更换源 使用小鱼脚本 更换系统源
wget <http://fishros.com/install> -O fishros && . fishros
-
安装可以在win下显示的linux工具(特别是gedit 很好用,不用使用vim简直就是半吊子程序员的福音)
sudo apt install gedit -y sudo apt install gimp -y sudo apt install nautilus -y sudo apt install vlc -y sudo apt install x11-apps -y
-
汉化
# 安装中文基础语言包 sudo apt install language-pack-zh-hans # 安装中文桌面语言包 sudo apt install language-pack-gnome-zh-hans sudo apt install language-pack-kde-zh-hans # 安装中文手册页(man命令) sudo apt install manpages-zh
sudo gedit /etc/locale.gen
找到 zh_CN.UTF-8 UTF-8 并取消注释,然后保存并退出
locale.gen... # zh_CN.GBK GBK zh_CN.UTF-8 UTF-8 # zh_HK BIG5-HKSCS ...
编译语言
sudo locale-gen
设置默认中文
sudo gedit /etc/default/locale
替换原来的内容如下
localeLANG=zh_CN.UTF-8
-
ros一键安装
小鱼的一键安装系列 | 鱼香ROS (fishros.org.cn)
wget <http://fishros.com/install> -O fishros && . fishros
-
配置rosdepc(为之后安装kortex做准备)
-
安装ros-melodic桌面版
-
装完测试一下ok不ok(三个终端三个小乌龟)
roscore rosrun turtlesim turtlesim_node rosrun turtlesim turtle_teleop_key
-
wsl下ros_kortex安装
Kinovarobotics/ros_kortex at melodic-devel (github.com)
由于我wsl安装的是ubuntu18.04 就是这个分支 如果是更古老的16.04 wsl安装过程就太繁琐了 这里就不写了
sudo apt install python3 python3-pip
sudo python3 -m pip install conan==1.59
conan config set general.revisions_enabled=1
conan profile new default --detect > /dev/null
conan profile update settings.compiler.libcxx=libstdc++11 default
mkdir -p catkin_workspace/src
cd catkin_workspace/src
git clone -b melodic-devel <https://github.com/Kinovarobotics/ros_kortex.git>
cd ../
rosdepc install --from-paths src --ignore-src -y
注意最后一步是rosdepc 和 官方github主页上面不一样,因为墙的关系 rosdep 是 使用不了的 rosdepc yyds!
编译kortex
catkin_make
source devel/setup.bash
wsl下kinova_version安装
具体操作如下
Kinovarobotics/ros_kortex_vision: ROS package for KINOVA® KORTEX™ arms vision module (github.com)
安装依赖
sudo apt install gstreamer1.0-tools gstreamer1.0-libav libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev gstreamer1.0-plugins-good gstreamer1.0-plugins-base
安装rgbd(注意这里原来是16.04的命令,18.04 需要改为melodic)
sudo apt-get install ros-melodic-rgbd-launch
然后进ws下的src目录克隆包
git clone <https://github.com/Kinovarobotics/ros_kortex_vision.git>
然后编译
cd ~/catkin_workspace/src/
catkin_init_workspace
cd ..
catkin_make clean
catkin_make
catkin_make install
echo "source ~/catkin_workspace/devel/setup.bash" >> ~/.bashrc
source ~/.bashrc
然后测试一下
# ros核心
roscore
# 启动version驱动
roslaunch kinova_vision kinova_vision.launch
# 颜色和深度摄像机回传
rosrun image_view image_view image:=/camera/depth/image_raw
darknet_ros
为了实现cv识别物体给机械臂控制提供信息 有两种方案
- find_object_2d 可以用图形化的界面,以模板匹配的算法去识别物体。但是这个包首先是没办法调用GPU,其次模板匹配方法准确率很低,如下图
- darknet_ros 实现 帧率高 识别准 只需要进行权重替换就可以实现多分类
nvidia driver cuda cudnn
由于wsl2的关系 只需要在windows端安装nvidia driver 就可以了,这里出现第一个bug 。
bug1
如果driver自带的cuda驱动和你之后所安装的cuda不匹配在使用一段时间后会出现输入nvidia-smi命令后的不到正确的cuda版本,也就是说电脑会找不到正确的cuda路径
这里根据设备GPU 3070ti算力 选择带有cuda11.7的driver版本 516.94 [GeForce Game Ready 驱动程序 | 516.94 | Windows 10 64-bit, Windows 11 | NVIDIA](https://www.nvidia.cn/Download/driverResults.aspx/192991/cn/)
然后进行wsl内的cuda安装,这里出现第二个bug
bug2
在安装过程中会报错
/usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link
这个错误是wsl和nvidia wsl驱动安装之间的问题 要在安装完widows端nvidia驱动之后就要解决
解决方法,参见这个issue/usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link · Issue #5663 · microsoft/WSL · GitHub,在windows端找到出问题的libcuda.so.1文件删了,然后在Linux端重新生成短链接,这样这个libcuda.so.1文件就确实存在于linux了就不会报错了
继续cuda toolkit安装
下载地址CUDA Toolkit 11.7 Downloads | NVIDIA 开发者
选择如下选项,这样选wsl-ubuntu 所下载的安装包就没有linux nvidia driver ,之前已经在windows端安装了driver 这样可以避免linux端安装的driver覆盖windows端的设置,以避免出现问题(干脆不下载)。
darknet_ros安装编译
安装完这个cuda toolkit就可以下载darknet_ros的元包进行编译了,这里出现第三个bug
bug3
在下载编译之前需要将自己的github账号和自己的Linux的电脑进行ssh密钥链接,不然这个库会因为权限问题不让git
ssh-keygen -t ed25519 -C "your_email@example.com"
一路回车,在~/.ssh文件夹下生成id_rsa.pub文件,查看它将码复制出来贴近github账号setting下的new ssh gpg内
继续下载,将包下载近工作空间下的src目录下
cd catkin_workspace/src
git clone --recursive git@github.com:leggedrobotics/darknet_ros.git
cd ../
下载完成后 进行编译
catkin_make -DCMAKE_BUILD_TYPE=Release
bug4
这里会出现无法编译的bug ,具体报错是 cannot find -lcuda
这里是因为darknet_ros的元包的cmkefile 没有加入cuda toolkit 的lcuda路径,见issue cannot find -lcuda · Issue #340 · leggedrobotics/darknet_ros · GitHub
其次还有另外一个bug,nvcc fatal … compute_30
bug5
这是因为设备用的3070ti规格高,但是darknet_ros元包编写时用的显卡设备没有这么高 他设置的compute_30太低,修改元包根目录下的Makefile文件 将设备号修改成对应标号,删除其他标号,就可以解决这个bug,对应关系参见 显卡对应的算力表(来自yolov3—darknet) - 小丑_jk - 博客园 (cnblogs.com)
3070ti对应的设备标号如下
ARCH= -gencode arch=compute_86,code=[sm_86,compute_86]
对应修改Makefile文件以及cmakefile.txt就可以解决问题
如果cuda版本不是11.7 也有可能出现某一句的bug只要将原来出现错误的被弃用函数替换掉就可以解决问题
继续没有问题编译完成后,还需要修改对应的配置文件和权重文件参数 然后进行roslaunch就可以了