捕获光和图像数据时,通常将小型计算机或 MCU 连接到摄像机以处理数据,然后将部分数据发送到云。几年来,我一直与一个在线开发者社区合作,使用运行 Raspian 的树莓派或运行 L4T 的 NVIDIA Jetson 构建相机项目,该项目源自 Ubuntu 18.04。
您可能还喜欢:
相机中的计算
在解释如何调整您的项目以控制使用 USB 电缆的摄像机之前,让我们了解一下由社区朋友构建的 360 摄像机项目。Hugues Perret 采用 Wi-Fi 数据传输和 USB 摄像机控制的组合。机器人上有一个树莓派。
在下面的示例中,工业无人机制造商 VTRUS 在自动驾驶机器人上安装了 RICOH THETA 360 度摄像机。
其他项目有一个固定摄像头由USB供电从树莓派,并使用PoE为Pi供电。 例如,哈佛大学的科恩·赫夫肯斯教授的虚拟森林项目作为国家科学基金会项目的一部分,已经在偏远的哈佛森林中运作了多年。
USB 连接的优势
使用 USB 电缆而不是 Wi-Fi 或蓝牙连接摄像机的优点包括:
-
USB 电缆可以在发送命令时无限期地为摄像机供电
-
USB-C 连接提供比 5Ghz 或 2.4Ghz Wi-Fi 更稳定的大图像和视频的快速传输
-
您可以将相机置于睡眠状态,并通过 USB 电缆将其唤醒
此体系结构的主要用途是:
-
带轮子的陆基无人机
-
飞行无人机
-
长期监控,包括多月延时
PTP 和 MTP 传输协议
要使用 USB 电缆控制摄像机,大多数人使用图片传输协议 (PTP)或扩展媒体传输协议(MTP)
在基于 Linux 的主板上使用 libptp
在Linux上,这是树莓派和NVIDIAJetson最常见的操作系统,最常用的库是libptp。说实话,这个库是旧的,需要从源编译是有用的。它不是一个即插即用的解决方案,但它确实可以工作。
修改数据包长度
下载源并修改 ptp.h 行 77。 PTP_USB_INT_PACKET设置为 28。
ptplib 构建演练
我在树莓派上用拉西比安·杰西将 libptp2-1.2.0 和libusb-1.0.21放在开发目录中的 RPi 上。
pi@raspberrypi:~/Development$ ls -l
total 992
-rw-r--r-- 1 pi pi 404105 Oct 4 04:11 libptp2-1.2.0.tar.gz
-rw-r--r-- 1 pi pi 607417 Oct 4 04:14 libusb-1.0.21.tar.bz2
pi@raspberrypi:~/Development$
pi@raspberrypi:~/Development$ tar xvf libusb-1.0.21.tar.bz2
libusb-1.0.21/
libusb-1.0.21/aclocal.m4
pi@raspberrypi:~/Development$ cd libusb-1.0.21/
pi@raspberrypi:~/Development/libusb-1.0.21$ ls
aclocal.m4 config.guess COPYING install-sh Makefile.am PORTING
android config.h.in depcomp libusb Makefile.in README
AUTHORS config.sub doc libusb-1.0.pc.in missing tests
ChangeLog configure examples ltmain.sh msvc TODO
compile configure.ac INSTALL m4 NEWS Xcode
pi@raspberrypi:~/Development/libusb-1.0.21$
为了构建ptplib,您必须首先安装libusb。与拉斯皮比亚杰西安装的默认 libusb 将不起作用。
安装利布德夫-德和使 libusb
$ sudo apt-get install libudev-dev
Reading package lists... Done
Building dependency tree
运行配置,然后进行:
$ make
make all-recursive
make[1]: Entering directory '/home/pi/Development/libusb-1.0.21'
Making all in libusb
make[2]: Entering directory '/home/pi/Development/libusb-1.0.21/libusb'
CC libusb_1_0_la-core.lo
CC libusb_1_0_la-descriptor.lo
....
make[2]: Leaving directory '/home/pi/Development/libusb-1.0.21/libusb'
Making all in doc
make[2]: Entering directory '/home/pi/Development/libusb-1.0.21/doc'
make[2]: Nothing to be done for 'all'.
make[2]: Leaving directory '/home/pi/Development/libusb-1.0.21/doc'
make[2]: Entering directory '/home/pi/Development/libusb-1.0.21'
make[2]: Leaving directory '/home/pi/Development/libusb-1.0.21'
make[1]: Leaving directory '/home/pi/Development/libusb-1.0.21'
pi@raspberrypi:~/Development/libusb-1.0.21$
进行安装。
将 /usr/本地/lib 添加到链接器路径:
$ export LDFLAGS='-L/usr/local/lib/'
安装 libptp
此时,您现在可以提取 libptp2、配置、制作和 sudo 进行安装。
使用 ptpcam
ptpcam 包含在 libptp 中。它是一个命令行程序,您可以在 bash 脚本内部使用。 尽管 bash 是我们相机开发社区中最流行的脚本语言,但我个人更喜欢使用 Python,因为我发现语法更易于阅读。
为了开始使用,让我们从 shell 中查看一些基本命令。我首先要出口我的LD_LIBRARY_PATH环境变量。 然后,我会跑去 ptpcam -i
获取相机上的信息序列号:”00101082″
设备版本: 1.00.2
扩展 ID: 0x00000006
扩展说明:(空)
扩展版本: 0x006e
root@raspberrypi:/家/皮/开发*ptpcam -c
启动捕获…
对象添加 0x400d0004
列出文件
root@raspberrypi:/home/pi/Development# ptpcam -L
Listing files...
Camera: RICOH THETA V
Handler: Size: Captured: name:
0x0000002d: 1970120 2017-09-28 12:58 R0010025.JPG
0x0000002e: 2402374 2017-09-28 12:58 R0010026.JPG
0x0000002f: 2136165 2017-09-28 12:58 R0010027.JPG
0x00000030: 2810985 2017-09-28 12:59 R0010028.JPG
0x00000031: 97458043 2017-09-28 21:08 R0010029.MP4
0x00000032: 1064880 2017-10-02 15:31 R0010030.JPG
0x00000033: 722622498 2017-10-02 15:53 R0010031.MP4
0x00000034: 131377941 2017-10-02 15:57 R0010032.MP4
0x00000035: 1040761 2017-10-02 16:02 R0010033.JPG
0x00000039: 1295975 2017-10-03 22:00 R0010034.JPG
root@raspberrypi:/home/pi/Development#
检查相机电池电量
# ptpcam --show-property=0x5001
Camera: RICOH THETA V
'Battery Level' is set to: 70
root@raspberrypi:/home/pi/Development#
在这个阶段,你想知道我从哪里得到”0x5001″。
您可以使用 ptpcam -o 获取操作列表:
您可以看到带有 ptpcam -p 的参数:
您还可以查看特定摄像机的 API 文档,或参阅媒体传输协议规范。就我而言,相机供应商有一个包含十六进制代码和命令的网页。
文档非常简单,但它可以完成工作。您的摄像机可能使用相同的代码,因为代码是所有符合 MTP 规范的摄像机的标准。供应商网站上的大多数命令与存储在 ptpcam 中的命令相同。
从静止图像更改为视频
# ptpcam --set-property=0x5013 --val=0x8002
Camera: RICOH THETA V
'Still Capture Mode' is set to: [Normal]
Changing property value to 0x8002 [(null)] succeeded.
root@raspberrypi:/home/pi/Development#
后续步骤
您应该能够通过使用 ptpcam 帮助或咨询 PTP 规范来获取其余命令。对于大多数人来说,困难在于安装 libptp,而不是实际使用 ptpcam 或访问 PTP API。
使用阿杜伊诺
可以使用 Arduino 控制一些佳能 EOS 和 Powershot 摄像机以及尼康 DSLR 和 P&S 相机。如果您有这些摄像机之一,请查看奥列格·马祖罗夫的PTP_2.0为 Arduino。不幸的是,这个库不能与RICOH THETA配合使用,而且很难让它与我的相机配合使用。
此外,我想在计算机上做更多的图像和视频处理比Arduino的能力,所以像NVIDIAJetson的东西是一个更好的平台对我来说
其他提示
由于使用这种技术的人很可能是在制造机器人,所以我将分享一些我从社区学到的教训。
在下图中,360 摄像机用 360 LED 灯条包裹,以提供全局照明。 灯条看起来像三条黄色条纹。
您将需要稳定相机在飞行无人机与云台。
如果您正在将无人机的 360 视频源实时流式传输到 VR 耳机中,则需要对减少延迟的技术进行一些研究,并在无人机上使用专门的无线电发射器。
如果您在 Linux 计算机上处理图像和视频,最常见的库是 OpenCV 和 TensorFlow。
总结
对于许多相机型号来说,让应用程序通过 USB 电缆控制摄像机可能非常棘手。 好消息是,一旦应用程序运行,命令易于使用,连接是稳定的。
如果找出一次配置,则可以将其用于所有机器人和监控项目。尽管 Linux 上的 libptp 库很旧,而且需要一些工作才能正确配置,但由于它在飞行和滚动机器人中的使用增加,从而将数据传输或触发数据传输到基于云的系统,因此它正出现新的流行浪潮。