Controlling IoT cameras with libptp

了解有关使用 libptp 控制 IoT 摄像机的更多详细信息。

捕获光和图像数据时,通常将小型计算机或 MCU 连接到摄像机以处理数据,然后将部分数据发送到云。几年来,我一直与一个在线开发者社区合作,使用运行 Raspian 的树莓派或运行 L4T 的 NVIDIA Jetson 构建相机项目,该项目源自 Ubuntu 18.04。

您可能还喜欢:
相机中的计算

在解释如何调整您的项目以控制使用 USB 电缆的摄像机之前,让我们了解一下由社区朋友构建的 360 摄像机项目。Hugues Perret 采用 Wi-Fi 数据传输和 USB 摄像机控制的组合。机器人上有一个树莓派。

FOX SEWER ROVER by Hugues Perret

福克斯·塞弗·罗弗·胡格斯·佩雷特

在下面的示例中,工业无人机制造商 VTRUS 在自动驾驶机器人上安装了 RICOH THETA 360 度摄像机。

VTRUS has a RICOH THETA 360 degree camera mounted on an autonomous flying robot

VTRUS 的 RICOH THETA,一个安装在自主飞行机器人上的 360 度摄像头。

其他项目有一个固定摄像头由USB供电从树莓派,并使用PoE为Pi供电。 例如,哈佛大学的科恩·赫夫肯斯教授的虚拟森林项目作为国家科学基金会项目的一部分,已经在偏远的哈佛森林中运作了多年。

VirtualForest project

虚拟森林项目

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。

Image title

Image title

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 获取操作列表:

Image title

您可以看到带有 ptpcam -p 的参数:

Image title

您还可以查看特定摄像机的 API 文档,或参阅媒体传输协议规范。就我而言,相机供应商有一个包含十六进制代码和命令的网页。

文档非常简单,但它可以完成工作。您的摄像机可能使用相同的代码,因为代码是所有符合 MTP 规范的摄像机的标准。供应商网站上的大多数命令与存储在 ptpcam 中的命令相同。

Image title

从静止图像更改为视频

# 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 灯条包裹,以提供全局照明。 灯条看起来像三条黄色条纹。

Image title

Image title

您将需要稳定相机在飞行无人机与云台。

Image title

如果您正在将无人机的 360 视频源实时流式传输到 VR 耳机中,则需要对减少延迟的技术进行一些研究,并在无人机上使用专门的无线电发射器。

Image title

如果您在 Linux 计算机上处理图像和视频,最常见的库是 OpenCV 和 TensorFlow。

总结

对于许多相机型号来说,让应用程序通过 USB 电缆控制摄像机可能非常棘手。 好消息是,一旦应用程序运行,命令易于使用,连接是稳定的。

如果找出一次配置,则可以将其用于所有机器人和监控项目。尽管 Linux 上的 libptp 库很旧,而且需要一些工作才能正确配置,但由于它在飞行和滚动机器人中的使用增加,从而将数据传输或触发数据传输到基于云的系统,因此它正出现新的流行浪潮。

进一步阅读

相机中的计算

如何将亚历克萨添加到树莓派

Comments are closed.