1. 介绍
机器视觉 (MV) SDK 是一个 C/C++ 编程 API,由库、头文件和应用程序组成。
1.1 开发板设置
对于操作系统版本为3.1.3.1或更早版本的Snapdragon Flight板卡,首次刷板后需要固定主目录的所有权。
cd /home
sudo chown linaro linaro
sudo chgrp linaro linaro
刷机后第一个X窗口成功打开后,需要复制权限文件。
cp /home/linaro/.Xauthority /root
1.2 工作站设置
某些 MV 应用程序能够打开 X11 窗口进行查看。 Linux 工作站具有显示这些窗口的本机能力,但 Microsoft Windows 需要先安装像 Xming 这样的程序。
在 Windows 机器上,应用程序 PuTTY 通常用于串行线路连接。 通过设置选项,PuTTY 还可用于通过 SSH 连接到板以进行 X windows 转发。
Session > Connection type
Connection > SSH > X11 > Enable X11 forwarding
1.3 安装
要安装 MV,需要获得有效的许可文件 (snapdragon-flight-license.bin) 和 MV Debian 软件包 (mv_1.1.7_8x74.deb)。 之后,还需要两个步骤。
- 将包从本地计算机复制到板上。
scp tmp/mv_1.1.7_8x74.deb linaro@<BOARD_IP_ADDRESS>:/home/linaro/mv.deb
scp snapdragon-flight-license.bin \
linaro@<BOARD_IP_ADDRESS>:/home/linaro/snapdragon-flight-license.bin
- 将许可证安装到将安装库的位置或添加到 LD_LIBRARY_PATH。
mv snapdragon-flight-license.bin /usr/lib
- 在板上安装包。
sudo dpkg -i mv.deb
安装位置:
- 应用程序放入/usr/bin;
- 库文件放入 /usr/lib;
- 头文件放入/usr/include/mv;
- 应用程序源代码进入/usr/share/mv。
1.4 启动后的初始化
无论是否使用数据,某些应用程序都需要访问 IMU。 因此,如果您尚未将 imu_app 添加到启动脚本中,则在每次启动后启动 imu_app 非常重要。 可以使用以下两个命令从命令行启动应用程序:
sudo su
imu_app &
2. 应用
这些应用程序是开始使用 MV 的好方法。 尽管不会在整个示例中显示,但由于当前部署在板上的权限方案,通常需要在每个命令行前面加上 sudo。 例如,运行 mvCameraView 之后的数字为 1,实际上如下所示:
sudo mvCameraView 1
这些示例还将假设一个人通过 SSH 连接到板,并如前所述启用 X 转发。
为便于理解,应用程序分为两类:在线和离线(即播放)。 此处列出的应用程序按照人们使用它们的自然顺序排列。因此,在线应用程序是一个很好的起点。
2.1 在线应用程序
在线应用程序在目标上实时运行,以演示使用板载传感器的各种技术。 除了演示技术之外,还有一些额外的应用程序可以帮助开发人员开始工作。
mvCameraView
由于大多数 SDK 依赖于相机数据,因此测试相机是一个自然的起点。 相机视图应用程序也不依赖于 MV 库,因此它也可用于调试平台问题。 相机视图应用程序对于向下跟踪相机运行非常简单。
mvCameraView 1
正如帮助选项中列出的那样,你可以尝试每台不同的相机和并行的多台相机。
应打开一个实时窗口,显示相机视图。 尽管以 30 FPS 的速率请求相机帧。 他们实际达到的速率由窗口中的 FPS 值显示。 因为通过 SSH 传输 X 窗口是非常处理和带宽密集型的,所以显示的帧速率要低得多。 因此,查看的更新率可能看起来不稳定。
由于该应用程序不使用 MV 库,因此它为没有内置自动增益和曝光控制的摄像机(跟踪和立体声)实现了非常基本的曝光控制。
mvCPA
CPA 功能是 MV 应用程序通常实现自动增益和曝光控制的方式。 此应用程序以与 mvCameraView 非常相似的方式演示 CPA 性能。 除了增加了算法选择的规范外,运行它看起来也非常相似。
mvCPA 1 1
该窗口还显示对图像场景纹理质量的估计。 这是为了让人们了解哪些场景适合跟踪,哪些不适合。 稍后在进行序列捕获以进行校准时,此知识很有用。
mvCapture
捕获应用程序是捕获传感器数据序列的一种方式,这些数据序列稍后可用于回放应用程序或离线开发和调试。 该应用程序目前仅支持一次捕获一个摄像头。 要从跟踪摄像机中捕获一系列数据,请运行一段时间,然后使用 control-C 退出。
mvCapture -o -t -d record_tracking
然后,该序列可以直接与回放应用程序(例如,mvVISLAMPlayback)一起使用或从板复制作为支持数据以帮助识别问题。 通过预先设置超时命令,定时捕获很容易。
timeout -s SIGINT 30s mvCapture -o -t -d record_tracking
此应用程序最常用的是通过 CAC 和 SAC 回放应用程序离线校准相机。 该校准程序在单独的部分中进行了介绍,以使这些步骤更易于阅读。
mvVISLAM
注意:良好的性能要求首先对跟踪相机进行相机校准,并修改源代码以包含该校准并重新编译。
VISLAM 应用程序很容易使用默认校准运行,因为它不需要参数并且通常使用默认校准。
mvVISLAM
唯一的显示是写入终端的 6 自由度姿势。 该位置将全部为零值,直到 VISLAM 初始化。 为了帮助它初始化,需要在跟踪相机看到足够的纹理进行跟踪的同时移动和旋转板子(即,不要指向全白的桌子)。
mvDFS
注意:良好的性能要求首先完成立体相机和立体装备校准。 之后,可以修改源代码以包含这些校准并重新编译,或者可以选择从文件中读取校准。
应用程序通常在指定许多选项的情况下运行。
mvDFS -m 1 -j 0 -i 0 -a -F 4 -p 0
由于此应用程序仅用于开发并且非常初级,因此在尝试使用它之前最好先研究源代码。 因此,运行时不再赘述。
2.2 播放应用程序
播放应用程序是如何使用离线数据练习各种技术的示例。 该离线数据是一个 SRW 序列,通常由 mvCapture、SNAV 或开发人员自己的应用程序使用 SRW API 捕获。 大多数播放应用程序将序列数据的路径作为第一个参数或通过 -s 选项。
mvCACPlayback
该应用程序旨在从离线 SRW 数据序列运行。
mvCACPlayback -b eagle -s 100 <PATH>/seq1
忽略任何 AR 错误消息。 输出应以如下形式结束:
Reprojection error=1.024093
Inlier ratio=0.977944
DG.input-size=640x480
DG.K=276.807434,0,321.829407,0,276.807434,248.027313,0,0,1
DG.distortion=-0.002200,0.006687,-
0.002951,0.000253,0.000000,0.000000,0.000000,0
.000000
DG.distortion-model=10
DG.RBC=-0.001901,-0.189321,0.981914,-0.999962,0.008671,-0.000264,-
0.008464,-0.98
1877,-0.189330
DG.timing-offset-in-ms=-7.678854
Rolling shutter skew=0.000000ms
生成的校准文件直接添加到序列目录中。
mvDFSPlayback
注意:良好的性能要求首先完成立体相机和立体装备校准。 之后,可以修改源代码以包含这些校准并重新编译,或者可以选择从文件中读取校准。
该应用程序旨在从离线 SRW 数据序列运行。
mvDFSPlayback -m 11 -d 0 -D 32 -s <PATH>/seq1 -c <PATH>/seq1/sac.xml
除非使用 -o 选项指定,否则输出图像应位于本地子目录 (tmp/) 中。
mvDFTPlayback
该应用程序旨在从内置数据运行,并且源代码中内置的校准值与该数据匹配。
mvDFTPlayback
输出的结尾应该类似于以下内容:
DFT failed. Iteration: 0
DFT Worked. Movement: x: 3.32349 y: 0.0497742
Test complete
mvSACPlayback
该应用程序旨在从离线 SRW 数据序列运行:
mvSACPlayback -s 100 -e 200 <PATH>/seq1
输出应以如下形式结束:
Performing calibration ...
Reprojection error=0.924225
Inlier ratio=0.909164
Stereo calibration:
rRL=0.035636 0.016273 -0.005733
tRL=-0.080000 0.000000 0.000000
mvVISLAMPlayback
注意:良好的性能要求首先对跟踪相机进行相机校准,并修改源代码以包含该校准并重新编译。
该应用程序旨在从离线 SRW 数据序列运行。
mvVISLAMPlayback <PATH>/seq1
输出应以如下内容结尾:
No more frames
AR INFO:
FIT:FeatureName=>SensorFusion, TSBDrift=>0.01366 (0.001)
FIT:FeatureName=>SensorFusion, TSBDrift0=>0.002 (0.000)
FIT:FeatureName=>SensorFusion, TSBDrift1=>0.003 (0.000)
FIT:FeatureName=>SensorFusion, TSBDrift2=>-0.013 (0.000)
FIT:FeatureName=>SensorFusion, RSBDrift=>0.11181
FIT:FeatureName=>SensorFusion, AccelBias0=>0.25693
FIT:FeatureName=>SensorFusion, AccelBias1=>-0.33832
FIT:FeatureName=>SensorFusion, AccelBias2=>-0.04446
FIT:FeatureName=>SensorFusion, GyroBias0=>-0.00643
FIT:FeatureName=>SensorFusion, GyroBias1=>-0.00062
FIT:FeatureName=>SensorFusion, GyroBias2=>-0.00355
FIT:FeatureName=>SensorFusion, GravityBias0=>-2.34048
FIT:FeatureName=>SensorFusion, GravityBias1=>1.08543
FIT:FeatureName=>SensorFusion, GravityBias2=>9.44810
FIT:FeatureName=>SensorFusion, FrameCount=>256
FIT:FeatureName=>SensorFusion, ImuCount=>8270
FIT:FeatureName=>SensorFusion, AvgTimeFrameUpdate=>4.05ms
FIT:FeatureName=>SensorFusion, NumResets=>3
AR INFO:
TrckLnDst:392 117 71 77 49 40 43 31 31 32 29 21 25 24 24 13 13 14 11 9 11 6
5 6 3 3 6 2 2 3 4 5 8 3 5 0 6 5 3 2 2 1 0 0 0 2 2 2 1 2 2 1 0 1 2 1 1 2 0 1
1 3 1 2 3 0 0 1 0 0 0 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 2 0 2 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
AR INFO:
Distribution of num of consec keyframes w/ GN failing all features:83 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
AR INFO:
Distribution of num of consec frames w/ increasing depth uncertainty:245 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
mempool num blocks 4
Frames read: 256
Playback finished
mvSRWPlayback
该应用程序旨在在唯一参数指定的目录中创建一个小的离线 SRW 数据序列。
mvSRWPlayback srw
输出图像应位于本地子目录 (srw/) 中。 srw/camera0/ 目录中的图像应如下所示:
在此过程中可能会有几条错误消息。 输出的结尾应该类似于以下内容:
nCameras=1
cameraName=camera0 cameraType=mono
CameraParameters
pxlWidth=320 pxlHeight=240 memStride=320 uvOffset=0
principalPoint = (10.000000, 11.000000)
focalLength = (1.100000, 1.200000)
distortionModel=10 distortion=[2.100000, 2.200000, 2.300000, 2.400000,
2.500000, 2.600000, 2.700000, 2.800000]
Pau hanna...
mvVMPlayback
该应用程序旨在从深度数据的离线序列运行。
mvVMPlayback -s <PATH>/seq1
输出应以如下内容结尾:
Collision for box -0.0945612 -0.099557 -0.0970303 - 0.105439 0.100443
0.102970 at 1.96182e-44 1.96182e-44 1.96182e-44
Collision for box -0.0945612 -0.099557 -0.0970303 - 0.105439 0.100443
0.102970 at 1.96182e-44 1.96182e-44 1.96182e-44
Collision for box -0.0940224 -0.0991988 -0.0962258 - 0.105978 0.100801
0.1037740 at 1.96182e-44 1.96182e-44 1.96182e-44