CHDK 摄像机控制教程

使用佳能黑客开发套件在任务期间自动拍照

您是否正在寻找一种既简单又廉价的方法来在执行任务时拍摄高质量照片?佳能黑客开发工具包 (CHDK) 允许您通过一些简单的脚本将佳能单反相机变成动态有效载荷。本教程将指导您完成这一自动相机控制解决方案的实施过程。

首先我们将介绍 CHDK:入门所需的内容和安装技巧。第一部分将介绍添加脚本、运行脚本以及将相机固定到固定翼飞机上。这种简单直接的方法非常适合基本的自动摄像机控制。

接下来,我们将介绍如何通过将 CHDK 与 ArduPilot 集成来协调相机控制与自主任务。虽然比较复杂,但这种实现方式为在航点自动拍照提供了出色的功能。最后,我们将展示一个有趣的应用程序,您可以通过创建静态照片的合成图像来绘制区域地图。

自动拍照:什么是 CHDK?

佳能黑客开发工具包 (CHDK) 是一款免费的实验性开发工具,可让您临时黑入佳能相机。通过解锁数码单反相机的所有功能,黑客相机就成了一个智能有效载荷,可以读取脚本功能,如拍摄、变焦和(重要的是)读取应用于其 USB 端口的电源。

要使用 CHDK,您需要

支持的佳能相机

CHDK 的出现得益于佳能单反相机能够读取 SD 闪存卡上的软件。一组开发人员创建了佳能黑客开发工具包,以便在以下设备上利用这一功能 仅适用于某些佳能相机.在本教程中,您需要一台佳能定点拍摄相机。 CHDK 维基百科 由 CHDK 官方支持。

../_images/camera-e1369761932378.jpg

SD 卡

我们建议使用每两秒可写入一次的 SD 卡,它可以存储您计划在任务期间拍摄的大量照片。您的电脑还需要一个 SD 卡读卡器。

../_images/sd_card.jpg

CHDK USB 电缆

我们使用的 gentWIRE USB 有两个通道,可用于 这里 (下半页)。将 CHDK 与 ArduPilot 集成时需要使用该电缆,使用间隔计脚本功能时则不需要。

../_images/gentled-CHDK.jpg

黑客攻击你的相机

首先,您需要在相机上安装 CHDK,因此自然需要 STICK:安装 CHDK 的简单工具 (可用于 Windows、Mac 和 Linux)。(您还需要 Java )。

请点击以下链接 STICK 说明页面,点击 "STICK zip file "下的 下载和安装 部分下载 STICK。STICK 安装到电脑后,使用非常简单:用相机拍照,将 SD 卡连接到电脑,然后将图片拖入 STICK 窗口。这个灵巧的工具会下载相应的 CHDK 版本,并自动准备好 SD 卡。该工具 STICK 说明页面 中提供了一些关于某些操作系统引起的问题的有用提示。

将脚本添加到 SD 卡

CHDK 允许您通过运行 SD 卡上的脚本来自动实现摄像机的功能。CHDK 脚本可以用以下两种语言编写 UBASICLuaUBASIC:简单易用的编程语言。在本教程中,我们将使用 UBASIC 脚本,文件扩展名为 .bas.

备注

UBASIC 脚本文件的扩展名必须为 .bas 以发挥作用。

将 CHDK 应用于任务的最简单、最有用的方法之一就是在飞行过程中每隔一段时间自动拍照。我们将通过添加一个 间隔计 脚本到 SD 卡。我们的朋友 无人机绘图仪 创建了一个很棒的 CHDK 间隔计脚本,可在 Drone Mapper 的 CHDK 文档点击此处查看.将区间计脚本复制到文本编辑器中,并将文件保存为 DM_interval.bas.

该脚本将测量五分钟的时间间隔,并每两秒触发一次相机快门。这些默认参数对我们来说效果很好(可拍摄约 150 张照片),但如果您想修改这些参数(例如,每五秒拍摄一张照片),请参见 CHDK Wiki 页面 关于 UBASIC 的脚本参数。

要将脚本加载到相机上,请解锁 SD 卡(将 SD 卡滑动面板上的开关滑到解锁位置),将其连接到电脑,然后打开 SD 卡的文件结构。选择 CHDK 文件夹,然后是 脚本 文件夹。复制脚本文件 (DM_interval.bas)到 脚本 文件夹。

3.带着相机飞行

在准备起飞前,您需要将相机装入车内。为获得最佳效果,请将相机镜头朝下放置在飞机中央。您可能需要改装飞机机身,以便为相机留出空间。请务必在相机就位的情况下设置飞机的重心,并牢记相机在发生故障时的安全性。请查看我们的设置以获得灵感;我们使用了魔术贴条将相机固定到位。

../_images/plane_install_camera_chdk.jpg

飞行前激活脚本

在发射飞机之前,有必要激活相机上的间隔计脚本。确保 SD 卡已锁定并装入相机,相机已打开。准备启动飞机时,按下 打印游戏 按钮(有关更多信息,请查阅 CHDK 维基百科).按下 菜单 按钮进入 CHDK 主菜单。选择 从文件加载脚本选择 DM_interval.bas.按下 商店 按钮来运行脚本。(您也可以使用快门按钮停止脚本。)启动脚本后,相机会在延迟五秒后自动开始拍照,因此在启动飞机时一定要考虑到这一点。

将 CHDK 与 ArduPilot 集成

../_images/chdk-cable.jpg

要将 CHDK 设置与 ArduPilot 集成,您需要一根 CHDK 电缆(如图所示),用于连接(飞行)控制器的输出信号引脚和摄像头的 USB 端口。我们使用 Gentles 的 gentWIRE-USB2 电缆.(敬请期待 3DR CHDK 电缆)。

CHDK 电缆的工作原理是将(飞行)控制器输出的脉宽调制 (PWM) 转换为摄像机可以读取的 USB 电源脉冲。它的工作原理是确定向 USB 端口供电的时间范围(例如:40-80 毫秒),并将该范围分配给与通道开关位置(例如:通道 1 中间)相对应的 PWM 值。下表显示了遥控发射机开关位置、(飞行)控制器 PWM 输出和摄像机 USB 电源之间的对应值。

开关位置

PWM (µs)

USB 功率(毫秒)

通道 1 向上

1,900

<50

通道 1 中部

1,500

>40和<80

通道 1 关闭

1,100

70和110

频道 2 向上

1,900

100 和 140

通道 2 中部

1,500

130 和 170

第 2 频道关闭

1,100

>160和<120

每个开关位置都可分配给一个脚本功能。这意味着你可以编写多达六个不同的摄像机控制脚本,例如触发快门和设置不同的变焦级别。在本教程中,我们将向你展示如何仅使用第一个通道设置三个功能,但如果你选择使用全部六个选项,也可以按照此过程进行设置。

配置 CHDK 电缆以便与 ArduPilot 配合使用

首先,我们需要选择一个遥控通道,分配给 CHDK 的通道 1。将飞机的(飞行)控制器连接到 Mission Planner。转到 配置 | 无线电校准 来查找遥控发射机上的可用频道及其相应的三档开关。在本教程中,我们将使用通道 7。(如果您决定使用其他频道,请在我们输入频道 7 的地方替换您的频道)。先不要断开(飞行)控制器。

在飞行之前,我们需要通过手动更改开关位置并观察结果来测试该通道与 CHDK 电缆之间的集成。为了允许手动控制该通道,我们需要更改Mission Planner地面站中的一个重要参数。在 配置 | 标准参数,向下滚动约 4/5,找到 伺服输出功能 每个通道的参数。找到与摄像机控制通道相对应的参数。对我们来说是 伺服输出功能(SERVO7_FUNCTION 或 RC7_FUNCTION).

备注

将该参数设置为 手册 当您想使用遥控发射器控制相机时,将其设置为 残疾 当您希望(飞行)控制器自动控制摄像机时。

由于我们要使用遥控发射机测试 CHDK 电缆,因此请设置 伺服输出功能手册.选择 写参数 在断开(飞行)控制器连接之前。

选择好摄像机控制通道后,您需要将 CHDK 电缆连接到(飞行)控制器的输出引脚。将 CHDK 线缆上的任一插针连接器连接到与摄像机控制通道相对应的(飞行)控制器输出插针上(黑色线缆在外侧)。例如,我们将 CHDK 电缆连接到(飞行)控制器的通道 7 输出引脚。确保该通道的(飞行)控制器未连接任何输入针脚。

对于 Pixhawk但是,该引脚只能输出 3.3V 电压,而触发 CHDK 需要 5V 电压。要转换为 5V 电压,需要集成一个升压转换器 (就像这里的 Sparkfun) 与电缆连线,以触发 CHDK。

添加脚本

配置好 CHDK 线缆后,我们将添加一个脚本,以便在(飞行)控制器发出指令时控制摄像机。让我们将 CHDK 线缆 UBASIC 脚本分成几个主要部分。

@ 参数 o 放大-
@default o 100
@ 参数 i 放大-装载
@default i 30
@ 参数 s 放大-萌发
@default s 10

本节定义了函数稍后将使用的参数。 @param 用变量和短语命名参数; @default 指定其值。这三个参数指定了缩放级别,因此如果您想更改缩放级别,只需在以下变量后输入一个新值,就能轻松实现 @default.

虽然 1

k = get_usb_power
直到 k>;0
如果 k <; 5  绪存根 "ch1up";
如果 k >; 4  k <; 8  绪存根 "ch1mid";
如果 k >; 7  k <; 11  绪存根 "ch1down";
如果 k >; 10  k <; 14  绪存根 "ch2up";
如果 k >; 13  k <; 17  绪存根 "ch2mid";
如果 k >; 16  k <; 20  绪存根 "ch2down";
如果 k >; 19  打印 "错误";
蜿蜒
最后

这是脚本的主体。它告诉 CHDK 从 USB 端口读取电源脉冲 (get_usb_power),并根据它所处的范围执行特定功能。这里的数值以毫秒为单位,因此与上表(5 毫秒 = 50 毫秒)有所不同。

:ch1up
打印 "Ch1Up-Shoot";; k
设置缩放 s
萌发
睡眠 1000
返回

:ch1mid
打印 "Ch1Mid-Stowed";; k
设置缩放 i
睡眠 1000
返回

:ch1down
打印 "Ch1Down-Extended";; k
设置缩放 o
睡眠 1000
返回

:ch2up
返回

:ch2mid
返回

:ch2down
返回

在这里,脚本定义了每个函数的功能。由于我们没有使用通道 2 选项、 ch2up, ch2midch2down 函数为空。函数 ch1up 函数会将缩放设置为变量 s 使用 设置缩放 命令并使用 萌发 指挥部。命令 ch1mid 功能使用 设置缩放 将镜头调到收起的位置,而 ch1down 功能可完全拉伸镜头。镜头 打印 命令将在摄像机显示屏上输出指定文本,同时输出 USB 电源脉冲的实际输出值 (k).

简而言之,上述脚本会导致以下行为:

当通道 7 设置为向上位置时,CHDK 会将变焦设置为 10 并拍照。

当通道 7 设置为中间位置时,CHDK 将把变焦设置为 30(收起位置)。

当通道 7 设置为向下位置时,CHDK 将把变焦设置为 100(扩展位置)。

单击此处查看上述脚本复制到文本编辑器中,并保存为 3DR_Shoot.bas.现在你已经熟悉了脚本的工作方式,可以轻松更改每个函数的命令。例如,您可以添加一个 萌发 命令 ch1down 或更改一个缩放级别参数。如果您正在使用通道二功能,则可以按照上图所示的相同格式轻松地为这些功能添加命令。

按照上一节所述,将脚本文件添加到 SD 卡。

测试 CHDK 电缆

测试 CHDK 电缆可确保我们的摄像机控制按预期执行,同时也是测试设备设置可能产生的噪音的绝佳机会。

./_images/USB_Remote_01.png

要让 CHDK 监听电缆,我们需要设置启用远程参数。在摄像机上访问 CHDK 菜单,选择 远程参数、 并选择 启用远程 如图所示。必须启用此设置才能与 CHDK 电缆通信。

将 CHDK 电缆连接到摄像机的 USB 端口,然后运行 3DR_Shoot.bas.测试每个开关位置的结果。结果应反映上一步中列出的行为。观察输出到摄像头显示屏的 USB 脉冲值,并将其与代码中显示的范围进行比较。如果遇到问题,请参阅 高级主题有关其他测试和故障排除信息,请参阅下面的章节。

在Mission Planner地面站中为摄像机控制编程

Mission Planner地面站允许您将伺服输出编程为航点事件。利用这一功能,我们可以添加一条命令,在飞机到达每个航点后输出 PWM 值(与开关位置和功能相对应)。

如下图所示在Mission Planner地面站中配置好航点后,选择第一个航点并点击 "添加以下内容"。

../_images/mp_add_command1.jpg

为新命令设置 指挥 类型为 DO_SET_SERVO.(这将告诉(飞行)控制器该命令意味着输出到伺服器)。 Ser No(伺服器编号)改为摄像机控制通道的编号(例如:"......"):7).(这就告诉了(飞行)控制器输出的位置:对于我们来说,伺服通道 7 就是 CHDK 电缆)。然后设置 PWM1900.(该值告诉(飞行)控制器输出什么:1,900 微秒的脉宽调制对应于拍摄命令所处的高位)。对每个要拍照的航点重复此过程。下面的屏幕显示了在三个航点正确应用的快门指令。

../_images/mp_configure_commands_1900.jpg

备注

航点表中的列根据当前选择的命令类型而具有不同的含义。这些列定义只有在选择命令时才会显示,因为不同的参数适用于不同类型的命令*。

由于我们使用(飞行)控制器来控制摄像机,因此需要设置 伺服输出功能(RC7_FUNCTION 或 SERVO7_FUNCTION) 参数改为 残疾 (在 标准参数).将航点和参数写入(飞行)控制器。

确保相机和(飞行)控制器连接正确。运行 3DR_Shoot.bas 发射前。按照标准做法和安全程序执行飞行任务。

创建合成图像

我们最喜欢的 CHDK 应用之一是通过将自动捕捉的图片拼接成合成图像来创建一个区域的地图。我们将使用相同的 3DR_Shoot.bas脚本。这个过程类似于在航点上设置快门触发器,只是为了确保拍摄到整个区域,我们需要更频繁、更有规律地设置航点。我们将使用Mission Planner地面站的 网格 V2 自动航点功能。

使用 GridV2 设置航点

首先在Mission Planner地面站中找到要绘制地图的区域。右键单击并选择 绘制多边形.添加多边形点,直到在要绘制地图的区域周围创建一个多边形。对多边形满意后,右键单击并选择 自动 WP | GridV2 如下图所示。

../_images/mp_auto_wp_select_gridv2.jpg

输入相对高度(如果不确定,100 英尺也可以)。输入线与线之间的距离;数字越大,航点就越少。出现提示时,输入每个航点之间的距离;同样的道理也适用于此。输入线条方向;下面的航点显示线条方向为 70。当提示添加摄像机触发器时,输入 "是"; 这将在每个航点后创建一个命令,但不会自动设置 CHDK 命令.我们建议您尝试使用这些设置,直到找到适合您任务的航点配置。如下图所示,您现在应该可以在多边形上映射出一个航点网格。

../_images/mp_gridv2.jpg

在这里,我们必须将自动功能转换为手动操作。GridV2 在每个航点后都创建了一个命令,命令类型为 DO_DIGICAM_CONTROL。但是,对于我们的 CHDK 设置,我们需要命令类型为 DO_SET_SERVO.对于每条 DO_DIGICAM_CONTROL 命令,将命令类型改为 DO_SET_SERVO,设置 Ser No7 (或您正在使用的频道),并设置 PWM1,100 (调用 3DR_Shoot.bas 函数拍摄照片)。

运行时,该任务会返回一组图像,这些图像可以拼接在一起,绘制出所选多边形的地图。

拼接图像

微软图像合成编辑器(ICE) 是一款很棒的免费工具,可将图像自动拼接成合成图像。只需上传图片,ICE 就会将它们拼接在一起。下面是我们的一个合成实例:

../_images/marina_stitch_medium.jpg

我们希望该解决方案能为您的任务提供一些增强功能,并扩展您的自主成像能力。如需了解更多信息,请查看下面的 "高级主题 "部分。

附录

相机设置

以下设置将有助于确保您从航空图像中获得最佳效果。图像设置可根据您的环境进行调整,但列出的值是一个很好的起点。佳能设置和 CHDK 设置因相机而异。

CHDK 设置往往不直观,而且会随机重置,因此请务必了解每个设置的作用,并在飞行前检查以确保它们未发生变化!

佳能设置

  • 闪光灯:关

  • 功能

    • 国际标准化组织: 载具

    • AWB: 日光

    • 图像大小 L

    • 图像质量 精细/超细

  • 菜单

    • 自动对焦框架: 中心

    • 数码变焦: 关闭

    • 自动对焦变焦: 关闭

    • 伺服自动对焦 关闭

    • 自动对焦辅助光束: 关闭

    • 闪光灯设置

      • 红眼修正 关闭

      • 红眼病灯 关闭

    • 日期戳记: 日期 & 时间

    • 节能...

      • 自动断电: 关闭

      • 显示关闭: 1 分钟

    • IS 设置...

      • IS 模式: 仅拍摄

      • Powered IS: 关闭

    • 全球定位系统: 关于

CHDK 设置

  • 功能

    • 自动启动:开启

    • 保存参数:开启

    • 远程参数:启用远程

  • 菜单

    • 额外的照片操作...

      • 禁用覆盖: 禁用

      • 覆盖快门速度: 1/1600

      • 价值因素: 1

      • 否决Dist V: 65535

      • 价值因素: 1

      • 自定义自动 ISO...

        • 启用自定义自动 ISO

        • 最小化: 1/1000

        • 清除覆盖值 @启动:禁用

高级主题

CHDK 电缆故障排除和测试

CHDK 电缆的工作原理是将(飞行)控制器输出的脉宽调制 (PWM) 转换为摄像机可以读取的 USB 电源脉冲。它的工作原理是确定向 USB 端口供电的时间范围(例如:40-80 毫秒),并将该范围分配给与通道开关位置(例如:通道中间)相对应的 PWM 值。下表显示了遥控发射机开关位置、(飞行)控制器 PWM 输出和摄像机 USB 电源之间的相应输出值。实际上,我们的 Spektrum DX 8 输出的是最右边一列中显示的值。

开关位置

PWM (µs)

USB 功率(毫秒)

Spektrum DX8 USB 功率读数(毫秒)

通道 1 向上

1,100

<50

30

通道 1 中部

1,500

>40和<80

50 或 60

通道 1 关闭

1,900

70和110

90

频道 2 向上

1,100

100 和 140

130

通道 2 中部

1,500

130 和 170

150 或 160

第 2 频道关闭

1,900

>160和<120

190

为了验证您的发射机是否有类似的行为,您可能需要进行一次测试,以确保每个开关位置都返回一个有效的 USB 功率值。查看 此处的 3DR CHDK 测试程序脚本.将内容复制到文本编辑器并保存为 3DRCHDKTester.bas.通过将文件复制到 脚本 文件夹(在 CHDK 文件夹)。

为测试配置 CHDK 电缆

在测试 CHDK 线缆之前,我们需要选择一个用于相机控制的通道并配置相应的输入。将飞机的(飞行)控制器连接到 Mission Planner。转到 配置 | 无线电校准 找到遥控发射机上的可用通道及其相应开关(我们将使用通道 7)。(我们将使用通道 7)检查通道上、中、下位置的 PWM 输出。将它们与上表进行比较。

在断开(飞行)控制器连接之前,我们需要更改一个您会经常使用的重要参数。在 配置 ->; 标准参数,向下滚动约 4/5,找到 伺服输出功能 每个通道的参数。找到与摄像机控制通道相对应的参数。对我们来说是 伺服输出功能(SERVO7_FUNCTION 或 RC7_FUNCTION).

*当您想使用遥控发射机控制摄像机时,将此参数设置为手动;当您想让(飞行)控制器自动控制摄像机时,将此参数设置为禁用。

由于我们要使用遥控发射机测试 CHDK 电缆,因此请设置 伺服输出功能手册.在断开(飞行)控制器连接之前选择 "写入参数"。

选择好摄像机控制通道后,您需要将 CHDK 电缆连接到(飞行)控制器的输出引脚。将 CHDK 线缆上的任一插针连接器连接到与摄像机控制通道相对应的(飞行)控制器输出插针上(黑色线缆在外侧)。例如,我们将 CHDK 电缆连接到(飞行)控制器的通道 7 输出引脚。确保未连接该通道的输入针脚。

测试 CHDK 电缆

测试 CHDK 电缆可确保我们的摄像机控制按预期执行,同时也是测试设备设置可能产生的噪音的绝佳机会。

将 CHDK 电缆连接到摄像机的 USB 端口。打开摄像机电源,加载 3DRCHDKTester.bas 脚本(通过选择 从文件加载脚本 从 CHDK 主菜单),然后按下快门按钮运行测试脚本。

要执行测试,请在遥控发射机上设置每个相机控制通道的位置,并观察显示屏上的输出。确认这些输出在上表中可接受的 USB 功率范围内。如果遇到问题,可能需要屏蔽电缆以防止噪音。

屏蔽电缆

即将推出

地理标记图像

有关图像地理标记的更多信息,请访问 桑德罗-贝宁戈的分步指南。

故障排除

问题:测试程序脚本运行,但不在摄像机屏幕上显示任何输出。

原因 1:您是否设置了参数 SERVOx_FUNCTION=1 ir RCx_FUNCTION=1,用于手动覆盖正在使用的 RC 通道?您可以在 配置 | 故障触发保护机制 Mission Planner地面站中的屏幕。

原因 2:您的输出轨是否供电?即使您在摄像机控制通道上获得了正确的 PWM 信号,输出仍需要 5V 直流电。您可以使用 JP1 上的跳线为输出轨供电,如图所示,该跳线将输入电源桥接至输出,或者直接为输出供电。

原因 3:您是否在 CHDK 中启用了远程功能?在 CHDK 菜单中:远程参数 > 启用远程。其他远程设置保持不变。