在沈阳航空航天大学T-UP战队2023赛季雷达程序基础上的拓展
方案:单相机与Livox mid-70 + pnp结算
请认真阅读本文档,配置程序时需要注意部分细节,务必完成Demo运行后再进行参数修改
程序点云接收基于ros-noetic框架,使用ROS版Livox雷达驱动
程序整体的设计目的在于尽可能的压榨算力的条件下保留充足的可扩展性,各模块充分解耦、即插即用,做到程序二次开发简便、扩展性高。
特别感谢上海交通大学[SJTU]提供的开源程序及测试资源对本项目的帮助。
本程序适用采用激光雷达+单工业相机方案的雷达岗。硬件上我们采用Livox 觅道Mid-70激光雷达和迈德威视MV-SUA630C-T工业相机,串口通讯采用了USB转TTL的方式。根据实际场景,可以选择快速但低精度的简易点云背景分割+单层神经网络方案(CPU+GPU均衡负载)[已废弃]或速度略低但精度较高的双层神经网络方案(GPU重负载CPU轻负载)。
功能:提供场上车辆的高精度坐标
部署前需要自行准备的并更改的有:
- Livox雷达驱动配置[包含于ThirdParty]
- 相机内参与畸变参数
- 相机到激光雷达的外参 推荐使用 Livox相机-激光雷达 联合标定[包含于ThirdParty]
- 网络对应的TensorRT相关参数[废弃]
- 车辆及装甲板识别模型
- 测试视频[可选]
对每个模块更加具体的说明可以参考文件夹下的README.md文件:
在使用minimum配置或显存为6G时,应注意程序占用,雷达程序显存占用约为5G,显存吃紧时不应运行其他程序。
1[minimum]
- Ubuntu 20.04 LTS
- GCC 9.3.0
- CUDA 11.6
- cudnn 8.6.0
- Tensorrt 8.5.1.7
- ros-noetic
- OpenCV4.6.0
- PCL 1.10.0(ROS安装附带)
- spdlog
- fmt[选择性安装]
- Eigen3
- MKL[可选]
- matplotlibcpp[可选]
- Livox雷达驱动
- 迈德威视相机驱动
运算平台 (tested && minimum):
[tested]
- AMD R7 5800H CPU
- DDR4 32G 3200 RAM
- GeForce RTX 3070 Laptop GPU
[minimum]
- Intel Core i5-1250P CPU
- DDR4 16G 3200 RAM
- GeForce RTX 3060 Laptop GPU [6GB]
2[best]
- Ubuntu 20.04 LTS
- GCC 9.4.0
- CUDA 11.8
- cudnn 8.9.0
- Tensorrt 8.5.2.2
- ros-noetic
- OpenCV4.6.0
- PCL 1.10.0(ROS安装附带)
- spdlog
- fmt[选择性安装]
- Eigen3
- MKL[可选]
- matplotlibcpp[可选]
- Livox雷达驱动
- 迈德威视相机驱动
运算平台 (best):
- Intel Core i9 13900KF CPU
- DDR5 32G 7400 RAM
- GeForce RTX 4090 GPU
- radar2023
- demo_resource 存放常用资源和工具
- logs 日志存放文件夹
- RadarClass 雷达模块库
- Camera 相机及录制相关
- Common 通用文件
- Detectors 检测器
- Location 坐标系处理相关
- Logger spdlog日志记录器
- Radar 程序主线程及线程管理
- UART 官方裁判系统通讯
- tools 调试工具
- Recorder 录制文件存放
- CMakeLists.txt CMake文件
- config.h 程序参数配置文件
- main.cpp 程序主文件
- package.xml ROS
-
环境配置完成后,需根据运算平台及环境修改src下CMakeLists.txt
- 特别注意事项:
- 应根据设备显卡型号及其算力修改第20行 CUDA_GEN_CODE 例:RTX 4060 : -gencode=arch=compute_89, code=sm_89 ;
-
若不使用MKL,注释掉src/radar2023/CMakeLists.txt ->34 include_directories(/opt/intel/oneapi/mkl/latest/include)、35 link_directories(/opt/intel/oneapi/mkl/latest/lib/intel64) 、108 libmkl_rt.so 和 src/radar2023/RadarClass/Common/include/public.h -> 3 #define EIGEN_USE_MKL_ALL、4 #define EIGEN_VECTORIZE_SSE4_2 [可选]
-
修改Config目录下default.yaml以适配参数
-
ExpResultDir[实验数据输出目录]、logs[日志存放目录]、models[模型存放目录『onnx、engine』]、params[参数存放目录『Config、yaml、Json』]、Record[录制视频存放目录]、resources[资源存放目录『pcds.txt、*.mp4、map.jpg』]
-
修改config.h中相关配置
- 特别注意事项:
- 本项目不存在测试用视频,需自行准备并放置于resources目录下
-
准备装甲板识别及车辆识别模型,现版本可用模型为yolov5 v6.0,注意导出动态Onnx
-
车辆分类[CAR]
-
装甲板分类[B1 B2 B3 B4 B5 B7 R1 R2 R3 R4 R5 R7]
-
将yolov5导出的动态尺寸onnx放置于models目录
-
将标定所得参数放置在params目录中,格式如资源文件camera0.SJTU.yaml所示
-
确保ROS环境激活后在RM_RADAR2023文件夹下使用(oneapi命令为mkl所需环境):
source /opt/ros/noetic/setup.sh source ~/intel/oneapi/setvars.sh catkin_make
-
为串口及雷达驱动添加权限[在串口权限自动设置失败时使用]
source devel/setup.bash
source ~/intel/oneapi/setvars.sh
roslaunch livox_ros_driver livox_lidar.launch bd_list:="XXX"
roslaunch radar2023 radar2023.launch
1.若第一次运行,程序会针对运行设备进行Onnx生成Engine的过程,根据设备算力,时间在1~10分钟不等,此操作会一共进行两次(车辆模型和装甲板模型)。
2.初始化完成后,程序会尝试启动相机并展示一张预览图,若对相机曝光、增益不满意,在预览图上按“t”进入调节界面,在调节界面中有相应的退出滑条。
3.相机预览结束后,进入四点标注界面,根据提示完成标注点选取,每确定一点,在标定窗口按“z”撤回,按其他任意键确定。Tips: 在params/MapMappingPoints配置标定点
4.标定结束后,进入控制窗口,可控制程序退出和视频录制,在图像中显示空间点反投影效果和识别车辆,对标定结果不满意可退出程序重新标定。
5.【不稳定功能未在此列出】
使用下列launch前需修改其中pcd_path参数
预置pcds.txt由上交开源程序提供,需搭配上交开源视频[非上交视频仅用于正常运行]
- OfflinePointCloudPub_and_Rviz.launch //启动离线点云发布及Rviz
roslaunch radar2023 OfflinePointCloudPub_and_Rviz.launch
- OfflinePointCloudPub.launch //启动离线点云发布
roslaunch radar2023 OfflinePointCloudPub.launch
- radar2023_with_OfflinePointCloudPub_and_Rviz.launch //启动离线点云发布、Rviz及雷达主程序
roslaunch radar2023 radar2023_with_OfflinePointCloudPub_and_Rviz.launch
- radar2023_with_OfflinePointCloudPub.launch //启动离线点云发布及雷达主程序
roslaunch radar2023 radar2023_with_OfflinePointCloudPub.launch
本程序提供实验性的基于点云深度图的目标分割算法
点云深度图背景分割算法为纯CPU负载算法,开启后可极大减轻GPU运算压力和显存占用,但相较于双层神经网络方案存在精度较差的问题
修改Config.h中注释掉的UsePointCloudSepTarget项目及配套配置
重新编译即可使用
此为实验性功能,不保证有效效果
本程序提供实验性的DeepSort目标跟踪
利用DeepSort稳定目标类别跟踪,可有效应对装甲板长时间丢失的情况
修改Config.h中注释掉的UseDeepSort项目及配套配置
重新编译即可使用
此为实验性功能且性能消耗极大,不保证有效效果
- Q: 程序内存占用持续升高,过不了多久就会OOM怎么办?
- A: 使用视频或高帧率相机时,图像队列可能会因为主线程无法及时将图像pop出而持续累积,应适当减少config.h中 FRAME_DEPTH 的值。
- Q: 程序可否运行在6GB显存的显卡上?
- A: 可以,正常运行时,程序的显存占用为5GB左右。
- Q: 在程序初次运行时,会长时间没有输出,并抛出TRT警告。
- A: 此为正常现象,初次运行时程序会根据设备进行onnx到engine的转化,因设备性能差异持续1~10分钟不等。
- Q: 我是3060显卡,运行时抛出cuda failure: 2怎么办?
- A: 检查default.yaml中路径是否合法,报错中应当存在"Engine bad file"。
- A: 运行雷达程序时,尽可能减少其他程序对显存的占用。
- Q: engine生成了,但是运行程序时没有检出怎么办?
- A: 程序中所提供的onnx模型已在多台设备上通过测试,请确认CMakeLists.txt中CUDA_GEN_CODE项设置正确。
- Q: 可否更换到自用Yolov5模型?
- A: 可以,但需要导出动态onnx并确认单输入单输出,程序中相应修改:MapMapping.h -> _ids的映射值、Radar.h -> ids过滤id。
- Q: 报错 error while loading shared libraries: libnvinfer.so.8: cannot open shared object file: No such file or directory…
- A: 没有配置好Tensorrt环境,请确保环境变量配置正常
- Q: 程序无报错退出,终止前输出Strating to read params from yaml file
- A: 多为opencv FileStorage 错误,请尝试更换版本或重新编译opencv
- Q: 编译时报错:找不到 -lCUDA:cublas -lCUDA:cudart...但是CUDA等已正常安装
- A: 安装了冲突的CUDA和ceres-solver版本,临时解决办法:编译安装ceres-solver后转移或删除系统cmake目录下FindCUDAToolkit.cmake,重新编译项目
- Q:加载模型时报错CUDA failure:100
- A: 首次使用主机,需要在bios下禁用Security Boot[disable]
- 在控制窗口再次进入四点标定模式时会抛出窗口丢失的错误,导致窗口缩放异常无法完成标定
- 暂时通过重启程序来避开此问题
- 进入标定的控制滑条已移除
- 在使用相机时绘制结果会发生闪烁
- 暂时不影响程序运行
- 疑似相机驱动类存在逻辑BUG
- 异常退出的程序并不会释放显存
- 通过关闭终端来释放显存