国产开源视觉项目SpireCV 助力在ArduPilot上快速实现二维码检测等视觉功能!内附超详细教程,干货满满
以下文章来源于:CSDN开发者社区
作者:干了这碗汤
原文链接:https://blog.csdn.net/weixin_43321489/article/details/134703965?spm=1001.2014.3001.5502
由于篇幅内容过长,本文将分为两期为大家展开介绍,本期主要介绍以下几个方面:
1. APSync
1)说到机载计算机Companion computer就不得不提另一个关键词APSync;
2)APSync简化了机载计算机的设置,以便它可以为ArduPilot提供额外的功能,并简化与互联网服务的集成;
3)提供日志下载和视频流转发到地面站的功能;
4)机载计算机通过串口与飞控连接,将飞控的log转存到自己的文件系统中,并创建一个网络热点,用于给运行地面站的PC连接,PC连接该热点后可以:1)从机载计算机下载日志;2)查看视频流;3)连接热点后地面站可以通过UDP连接到飞控;
5)http://10.0.1.128 (Configuration pages)
6)http://10.0.1.128:8000 (Which shows a video streaming on/off button)
7)PC连接到网络热点后(网络热点名称为ardupilot,密码也是ardupilot),地面站可通过UDP,port 14550来连接到飞控;
8)关于下载log:可以用这个脚本来下载机载计算机的日志到PC:apsync-download-logs,或者从机载计算机上拔下SD卡来读取;https://firmware.ardupilot.org/Companion/apsync/apsync-download-logs-latest.zip
9)关于视频流:视频流被发送到请求遥测数据的第一个地面站的IP地址;地面站查看视频流:右击Hub ~> Video ~> Set GSreamer Source;
10)PC连接热点后可通过SSH工具来远程登录到机载计算机;
11)飞控的数据如何路由到各种程序的?How flight controller data is routed to various programs:https://ardupilot.org/dev/docs/apsync-intro.html#how-flight-controller-data-is-routed-to-various-programs
12)Installing APSync and setting the autopilot:https://ardupilot.org/dev/docs/apsync-intro.html#installing-apsync
2. 阿木实验室SpireCV-SDK
参考文献:SpireCV-SDK
2.1 简介*
主要功能包括吊舱/相机控制、视频保存、推流、目标检测、识别与跟踪等。旨在为智能无人系统开发者提供高性能、高可靠、接口简洁、功能丰富的视觉处理功能。
3. SpireCV-SDK实践历程
编译源码:
cd ~/SpireCV/build
sudo make install
查看应用程序名称:
ls ~/SpireCV/build
执行应用程序:
./app-name
3.1 新增一个demo,如何修改CMakeLists.txt让编译器编译自己的demo
方法:在VSCode中搜索现有的demo的cpp文件名,看看在哪里使用了这些文件名,你会发现仅在同一目录的CMakeLists.txt中使用了这些cpp文件名,因此只需要修改这些CMakeLists.txt即可。
如:在/home/hyl20/SpireCV/CMakeLists.txt 中添加:
add_executable(CameraReading2 samples/demo/camera_reading2.cpp)
target_link_libraries(CameraReading2 sv_world)
其中camera_reading2.cpp就是新添加的demo的名称。
3.2 更改视觉源输入类型
1)以视频文件作为输入源
在当前目录下新建一个mp4文件如000.mp4,以camera_reading2.cpp为例,做以下代码修改:
cap.setVideoPath(“/home/hyl20/SpireCV/samples/demo/000.mp4”);
cap.open(sv::CameraType::VIDEO, 0); // CameraID 0
2)以RTSP视频流作为输入源
以camera_reading2.cpp为例,做以下代码修改:
cap.setRtspUrl(“rtsp://192.168.144.25:8554/main.264”);
cap.setPort(8554);
cap.open(sv::CameraType::RTSP, 0); // CameraID 0
报错后应该如何解决?
修改代码:SpireCV/video_io/sv_video_input.cpp中的else if (this->_type == CameraType::RTSP) {…}
//原来的代码
sprintf(pipe, "rtspsrc location=%s W=%d H=%d FPS=%d latency=100 ! \
application/x-rtp,media=video ! rtph264depay ! parsebin ! avdec_h264 ! \
videoconvert ! appsink sync=false",
this->_rtsp_url.c_str(), this->_width, this->_height, this->_fps);
this->_cap.open(pipe, cv::CAP_GSTREAMER);
//修改后的代码:
sprintf(pipe, "rtspsrc location=%s latency=100 ! \
application/x-rtp,media=video ! rtph264depay ! parsebin ! avdec_h264 ! \
videoconvert ! \
videorate ! video/x-raw,framerate=%d/1 ! \
videoscale ! video/x-raw,width=%d,height=%d ! \
appsink sync=false",
this->_rtsp_url.c_str(), this->_fps, this->_width, this->_height );
this->_cap.open(pipe, cv::CAP_GSTREAMER);
//或者改成:
sprintf(pipe, "%s",this->_rtsp_url.c_str());
this->_cap.open(pipe, cv::CAP_ANY);
其中cv::CAP_ANY会自动检测数据来源类型,opencv会自行调用gstreamer中合适的功能函数。
3.3 相机内参标定
1)采用读取视频文件的方式作为视觉输入源,修改calibrate_camera_charuco.cpp中的代码:
inputVideo.setWH(imW, imH);
inputVideo.setFps(fps);
inputVideo.open(c_type, camId);
//修改为:
inputVideo.setVideoPath("/home/hyl20/SpireCV/samples/demo/bd1.mp4");
inputVideo.setWH(imW, imH);
inputVideo.setFps(fps);
inputVideo.open(sv::CameraType::VIDEO, camId); // CameraID 0
2)打印一张标定图案(A4纸)
3)录制一段标定图案的视频保存为:/home/hyl20/SpireCV/samples/demo/bd1.mp4
拍摄注意事项:不同角度、不同距离拍摄;
4)编译代码
cd ~/SpireCV/build
sudo make install
5)执行标定程序
./CameraCalibrarion -w=5 -h=7 -sl=0.035 -ml=0.021 -d=6 -ci=0 calib.yaml
6)注意事项
a. w为标定板一行的格子数,h为标定板一列的格子数,sl为测量黑色实心方块的边长,ml为测量黑色二维码方块的边长,ci为Camera ID数;
b. 标定时需要拍摄不同距离、不同像平面位置、不同倾斜角的多张图像(>5张);
c. 标定完成后,标定文件保存在build目录下calib.yaml里;
3.4 二维码检测
认识Aruco二维码
用途:一般用于增强现实、相机姿势估计和相机校准等应用场景,具体如无人机的自主降落地标、机器人定位等。
组成:黑色宽边框 + 二进制矩阵(黑白方形阵列) 黑色边框:有助于其在图像中的快速检测;黑白方形阵列:标识符 (ID) ,用于被识别以及错误检测和校正技术;黑白方形的大小决定了内部矩阵的大小。例如,6×6 的Aruco码大小由 36 位组成;6×6即长宽都是4个方形;
实践:
1)采用读取视频文件的方式作为视觉输入源,修改aruco_detection.cpp中的代码:
cap.open(sv::CameraType::V4L2CAM, 0); // CameraID 0
改为:
cap.setVideoPath("/home/hyl20/SpireCV/samples/demo/ac2.mp4");
cap.open(sv::CameraType::VIDEO, 0); // CameraID 0
2)修改内参文件的路径,使用上一个实验生成的内参:
// 手动导入相机参数,如果使用Amov的G1等吊舱或相机,则可以忽略该步骤,将自动下载相机参数文件
ad.loadCameraParams(sv::get_home() + "/SpireCV/build/calib1.yaml");
3)录制一段aruco二维码图案视频保存为:/home/hyl20/SpireCV/samples/demo/ac2.mp4
拍摄注意事项:不同角度、不同距离拍摄。
4)编译
cd ~/SpireCV/build
sudo make install
5)运行
./ArucoDetection
6)观察终端的打印信息
7)运行ros接口查看ros数据
- 在wsl2-ubuntu20.04上安装SpireCV
参考:Ubuntu20.04+CUDA11.6安装教程
a. 问题:文档上提供的教程是基于ubuntu20.04 cuda11.6 ,但是本机电脑的cuda版本是12.2的,应该如何安装环境和依赖呢?请看本文的第6小节。
b. 实践依据:分析SpireCV官方教程中的 ubuntu2004-cuda-cudnn-11-6.sh 脚本。
5. Ubuntu20.04安装NVIDIA显卡驱动、cuda、cuDNN、tensorRT
参考文献:
https://blog.csdn.net/JineD/article/details/131201121
https://blog.csdn.net/qq_43515934/article/details/123897435
本期的内容分享就先到这里,下一期我们将为大家介绍如何在wsl2-Ubuntu20.04上安装cuda、cuDNN、tensorRT,以及Gstreamer等软件。如果您在SpireCV开发过程中有其他方面的问题,欢迎给我们留言,共同探讨相关技术~
以下为SpireCV项目相关介绍
项目Github网址:https://github.com/amov-lab/SpireCV
项目Gitee网址:https://gitee.com/amovlab/SpireCV