lvxiafu 发表于 2024-8-7 07:52:37

SpireCV 助力在ArduPilot上快速实现二维码检测等视觉功能!内附超详细教程,干货满满

以下文章来源于:CSDN开发者社区   
作者:干了这碗汤
原文链接:https://blog.csdn.net/weixin_43321489/article/details/134703965?spm=1001.2014.3001.5502

由于篇幅内容过长,本文将分为两期为大家展开介绍,本期主要介绍以下几个方面:

1. APSync


说到机载计算机Companion computer就不得不提另一个关键词APSync;

APSync简化了机载计算机的设置,以便它可以为ArduPilot提供额外的功能,并简化与互联网服务的集成;

提供日志下载和视频流转发到地面站的功能;

机载计算机通过串口与飞控连接,将飞控的log转存到自己的文件系统中,并创建一个网络热点,用于给运行地面站的PC连接,PC连接该热点后可以:1)从机载计算机下载日志;2)查看视频流;3)连接热点后地面站可以通过UDP连接到飞控;

http://10.0.1.128 (Configuration pages)

http://10.0.1.128:8000 (Which shows a video streaming on/off button)

PC连接到网络热点后(网络热点名称为ardupilot,密码也是ardupilot),地面站可通过UDP,port 14550来连接到飞控;

关于下载log:可以用这个脚本来下载机载计算机的日志到PC:apsync-download-logs,或者从机载计算机上拔下SD卡来读取;(https://firmware.ardupilot.org/Companion/apsync/apsync-download-logs-latest.zip)

关于视频流:视频流被发送到请求遥测数据的第一个地面站的IP地址;地面站查看视频流:右击Hub ~> Video ~> Set GSreamer Source;

PC连接热点后可通过SSH工具来远程登录到机载计算机;

飞控的数据如何路由到各种程序的?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

Installing APSync and setting the autopilot:https://ardupilot.org/dev/docs/apsync-intro.html#installing-apsync




2. 阿木实验室SpireCV-SDK

参考文献:SpireCV-SDK

(https://docs.amovlab.com/Spire_CV_Amov/#/src/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D/%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D?id=spirecv-sdk-wiki%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C)
2.1 简介*

主要功能包括吊舱/相机控制、视频保存、推流、目标检测、识别与跟踪等。旨在为智能无人系统开发者提供高性能、高可靠、接口简洁、功能丰富的视觉处理功能。


3. SpireCV-SDK实践历程

编译源码:
cd~/SpireCV/buildsudo make install
查看应用程序名称:

ls ~/SpireCV/build
执行应用程序:
./app-name3.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 更改视觉源输入类型


以视频文件作为输入源

在当前目录下新建一个mp4文件如000.mp4,以camera_reading2.cpp为例,做以下代码修改:
cap.setVideoPath("/home/hyl20/SpireCV/samples/demo/000.mp4");cap.open(sv::CameraType::VIDEO, 0);// CameraID 0

以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 02)打印一张标定图案(A4纸)

3)录制一段标定图案的视频保存为:/home/hyl20/SpireCV/samples/demo/bd1.mp4


拍摄注意事项:不同角度、不同距离拍摄;

4)编译代码
cd~/SpireCV/buildsudo make install
5)执行标定程序

./CameraCalibrarion -w=5 -h=7 -sl=0.035 -ml=0.021 -d=6 -ci=0 calib.yaml
6)注意事项

w为标定板一行的格子数,h为标定板一列的格子数,sl为测量黑色实心方块的边长,ml为测量黑色二维码方块的边长,ci为Camera ID数;

标定时需要拍摄不同距离、不同像平面位置、不同倾斜角的多张图像(>5张);

标定完成后,标定文件保存在build目录下calib.yaml里;
3.4 二维码检测

认识Aruco二维码


二维码示例文件下载

(https://download.amovlab.com/model/template/6X6_250.zip)

用途:一般用于增强现实、相机姿势估计和相机校准等应用场景,具体如无人机的自主降落地标、机器人定位等。
组成:黑色宽边框 + 二进制矩阵(黑白方形阵列) 黑色边框:有助于其在图像中的快速检测;黑白方形阵列:标识符 (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/buildsudo make install5)运行
./ArucoDetection6)观察终端的打印信息


7)运行ros接口查看ros数据
4. 在wsl2-ubuntu20.04上安装SpireCV


参考:Ubuntu20.04+CUDA11.6安装教程( https://docs.amovlab.com/Spire_CV_Amov/#/src/%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8/SDK%E5%AE%89%E8%A3%85/Ubuntu20.04+CUDA11.6%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B/Ubuntu20.04+CUDA11.6%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)

问题:文档上提供的教程是基于ubuntu20.04 cuda11.6 ,但是本机电脑的cuda版本是12.2的,应该如何安装环境和依赖呢?请看本文的第6小节。

实践依据:分析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项目相关介绍

https://mmbiz.qpic.cn/mmbiz_png/pIhI343Smtx3wViaVicVDbrTtzYibTHic1rlUO3UR200vrfGfGzFLSfhDgwrE99aE4lU6qzl2JtCkicgTJvSaI9yiaxg/640?wx_fmt=other&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

项目Github网址:
https://github.com/amov-lab/SpireCV
项目Gitee网址:
https://gitee.com/amovlab/SpireCV

使用手册:

https://www.wolai.com/4qWFM6aZmtpQE6jj7hnNMW
页: [1]
查看完整版本: SpireCV 助力在ArduPilot上快速实现二维码检测等视觉功能!内附超详细教程,干货满满