国产开源视觉项目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数据

  1. 在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

使用手册:https://www.wolai.com/4qWFM6aZmtpQE6jj7hnNMW