知乎大咖详述 Jetson 系列的多样化应用
2020-06-05 18:33
自 Jetson 系列产品推出以来,就在不断满足广大开发者和创新者的各种想象。近期,一位知乎极具影响力的 KOL 袁博融(HIT Robot Group DL 工程师,拥有 7,418 名粉丝)通过 Jetson 系列产品,实现了多样化的应用。
使用 Jetson+ 双目相机模组自制深度相机
很多 Jetson 开发者在刚接触这个平台时都会有个疑问,为什么预装的 OpenCV 竟然没有 GPU 加速。
NVIDIA 论坛上的解释说,OpenCV 的 GPU 部分可能存在 Bug,不能保证稳定性。于是大家要在 Jetson 上使用有 GPU 支持的 OpenCV,就要从源码编译。
实际上,除了 OpenCV,Jetson 平台上的计算机视觉库还有另一个选择,就是 NVIDIA 的 VisionWorks。
VisionWorks 包含了大量算法,大部分都使用了 GPU 加速。同时 VisionWorks 也可以和 OpenCV 一起使用。下面是 VisionWorks 的算法清单:
IMAGE ARITHMETIC
-
Absolute Difference
-
Accumulate Image
-
Accumulate Squared
-
Accumulate Weighted
-
Add / Subtract / Multiply +
-
Channel Combine
-
Channel Extract
-
Color Convert +
-
CopyImage
-
Convert Depth
-
Magnitude
-
MultiplyByScalar
-
Not / Or / And / Xor
-
Phase
-
Table Lookup
-
Threshold
FLOW & DEPTH
-
Median Flow
-
Optical Flow (LK) +
-
Semi-Global Matching
-
Stereo Block Matching
-
IME Create Motion Field
-
IME Refine Motion Field
-
IME Partition Motion Field
GEOMETRIC TRANSFORMS
-
Affine Warp +
-
Warp Perspective +
-
Flip Image
-
Remap
-
Scale Image +
FILTERS
-
BoxFilter
-
Convolution
-
Dilation Filter
-
Erosion Filter
-
Gaussian Filter
-
Gaussian Pyramid
-
Laplacian3x3
-
Median Filter
-
Scharr3x3
-
Sobel 3x3
FEATURES
-
Canny Edge Detector
-
FAST Corners +
-
FAST Track +
-
Harris Corners +
-
Harris Track
-
Hough Circles
-
Hough Lines
ANALYSIS
-
Histogram
-
Histogram Equalization
-
Integral Image
-
Mean Std Deviation
-
Min Max Locations
在刷好 JetPack 后,一般就会自动执行 /usr/share/visionworks/sources/install-samples.sh 将 VisionWorks 示例放到用户目录下,如果不慎删除可以再手动执行。关于示例的运行可以参考官方文档。
在这篇文章中,我们还为大家介绍了 VisionWorks 的一个特别的使用方式,即在 ROS 中使用 GPU 加速调用双目相机并生成视差图和点云。ROS 包已更新至 GitHub(以下链接)。
https://github.com/borongyuan/jetson_csi_stereo_ros
这部分使用了微雪推出的 Jetson 双目相机模组,不到 300 元就能买到。
http://www.waveshare.net/wiki/IMX219-83_Stereo_Camera
这个模组其实是将 2 个 CSI 相机和 1 个 IMU 做到同一块电路板上,但并没有硬件同步。有硬件同步的双目深度相机如 ZED、小觅、INDEMIND 效果更好,但价格都较高。
得益于 GPU 加速,使用廉价的双目模组也能取得很好的效果。相机的读取和解码通过 gscam 包使用了 Gstreamer,尽管没有硬件同步,左右相机间也几乎没有延迟。
在整个流程中,图像获取和处理部分都使用了 GPU。我们目前建议用 Jetson Xavier NX 进行测试。
要跑整套流程,可以参考以下主要步骤:
-
apt 安装 ROS 非 OpenCV 依赖的部分
-
编译安装依赖 OpenCV 的 ROS 包
-
双目相机标定
-
运行 Pipeline
用这种特殊的方式安装部分 ROS 包是因为 JetPack 4.3 和 4.4 预装的是 OpenCV 4.1,而 ROS Melodic 预编译用的是 OpenCV 3。
用 apt 安装使用相关包一般不会有问题,但会导致我们用到的 gpu_stereo_image_proc 无法编译。
使用 jetson_csi_stereo.launch 即可以启动 2 个相机,其中包含 Gstreamer 的配置字符串。
相机图像消息分别发布到 /stereo/left/image_raw和/stereo/right/image_raw,可以使用 rqt 来查看。这里发布的是原始图像,未经过校准,此时的 camera_info 也是空的或错误的。
建议先检查一下左右图像有没有搞反。如果在 Jetson Xavier NX 开发者套件上,CAM0 和 CAM1 实际反了,需要在 launch 文件修改 Gstreamer 字符串中的 sensor-id。如果相机安装方式不同,导致图像颠倒,flip-method 也要修改。
接下来,为了能顺利进行视差计算,我们需要对双目相机进行标定。标定包括两个相机的内参和外参。这里直接使用 ROS 的相机标定工具,参考 ROS 中的教程即可。
http://wiki.ros.org/camera_calibration/Tutorials/StereoCalibration
如果还想尝试相机和 IMU 联合标定,可以试试 kalibr 标定工具。标定成功后更新到 cfg 目录下的 left.yaml 和 right.yaml。下次再启动相机时就可以发布正确的 camera_info。
完成相机标定后,就可以生成校准后的图像,并计算视差,生成点云。ROS 包 stereo_image_proc 就实现了这一系列流程。但其使用 CPU 运算,在 PC 上都未必能流畅运行,更不用说 Jetson。我们使用的 gpu_stereo_image_proc 提供了和 stereo_image_proc 几乎一样的功能和接口,但内部使用 VisionWorks 的 GPU 版 SGBM 算法,性能要好很多。跑整套流程只需要 jetson_csi_stereo_pipeline.launch 这一个文件,其中已包含 jetson_csi_stereo.launch。
运行参数中,只需将 shrink_scale 改为 4。具体参数大家可以使用 rqt_reconfigure 自行试验。
要在 rviz 中可视化点云,需要将 Fixed Frame 设为 stereo_left_image_raw。
为 Jetson 安装 WPS, QQ, VSCode, TeamViewer, NoMachine 等应用
Jetson 不光可以用于开发,而且还可以用来当做办公的小电脑。对于小标题中列出的可安装工具,大家可能会觉得很惊讶。由于社区开发者对 arm64 软件生态上的建设,这些现在都可以进行安装。
WPS Office
Linux 上最佳的办公软件,免费无广告。最早发布的那个版本测试启动不了,但后来更新的几版都能正常使用。安装很简单,可以从 WPS Office for Linux 官网下载 arm64 的 deb 包。
至于启动时提示字体缺失等问题,需要通过网上搜索自行解决,因为官方也无法提供版权字体。
虽说目前安装微信比较困难,但可以安装 QQ。同时,NVIDIA 也为开发者朋友们建了多个 QQ 群。以后 Jetson 上遇到什么问题直接截图群聊就好了。安装同样很简单,即通过 QQ for Linux 官网下载 arm64 的 deb 包。
VSCode
这个虽然不是官方编译,但有社区维护,同样能及时更新。安装有脚本,也很方便。
https://github.com/JetsonHacksNano/installVSCode
可以直接执行 installVSCode.sh,Jetson系列都能用。可以安装部分插件,比如改简体中文,Python 插件。之后可使用 apt-get 更新。
TeamViewer
这个安装步骤较多。TeamViewer 其实还没有推出官方的 arm64 版,可以安装的其实是TeamViewer Host for Raspberry Pi。树莓派版为 armhf 架构,于是需要装一些 armhf 的依赖。
sudo dpkg --add-architecture armhf
sudo apt-get update
sudo apt-get install libxtst6:armhf
然后再 dpkg 安装下载好的 armhf 版 deb 包。最后,如果缺依赖,还要再修复一下。
sudo apt-get install -f
TeamViewer 连接后可能资源占用会较高。而且官方现在查商业用途越来越严,容易被误伤。下面的 NoMachine 也是一个不错的远程桌面选择。
NoMachine
NoMachine 也是跨平台的远程桌面工具。Jetson 系列 K1 之前都是 ARMv7 的 CPU,X1 之后都是 ARMv8,因此大家可以从官网页面下载 ARMv8 的 deb 包。
在 Jetson 上用 NoMachine 体验要比 VNC 和 TeamViewer 好很多,而且想要更好连接的可以选择加硬件。
DFRobot 的 LattePanda Streaming Cable 也可以直接用。这样就可以用笔记本屏幕当显示器来做 Jetson 开发。实际通过 USB 虚拟网卡进行连接,又快又稳。
Vivaldi 浏览器
Vivaldi 浏览器采用 Chromium 引擎,可定制化程度高,保留了简洁的风格。Vivaldi 其实也有 arm64 编译,但因还未正式推出,链接被官方隐藏了起来。
流程是先从官网页面复制 Linux DEB ARM 的链接,链接最后是 armhf.deb,改成 arm64.deb 就可以进行下载。