- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Pointgrey Firefly MV(准确地说是 FFMV-03M2M/C),并希望在每次启动快门时触发一些外部设备。根据the datasheet ,相机支持 IIDC 1.31,还提供四个 GPIO 可用作触发器和/或频闪信号输出。如 IIDC standard 的第 4.11.3 节所述应该可以使用 IIDC 配置这些选通信号输出。
我的应用程序是用 C++ 实现的并使用 libdc1394访问和控制摄像机。到目前为止,一切都很好,但我无法配置选通信号输出。据我了解 libdc 和 IIDC,应该可以启用第一个输出,如下所示(camera
是指向有效 dc1394camera_t
的指针):
dc1394error_t err;
uint64_t strobe_offset = 0x200;
uint32_t strobe_settings = 0;
err = dc1394_get_strobe_register(camera, strobe_offset, &strobe_settings);
if (err == DC1394_SUCCESS) {
/* Set bits 6 (strobe on) and 7 (active-high level)
IIDC uses msb 0, so we need to shift by 25/24 instead of 6/7 */
strobe_settings = strobe_settings | (1 << 25) | (1 << 24);
err = dc1394_set_strobe_register(camera, strobe_offset, strobe_settings);
}
if (err != DC1394_SUCCESS) {
log(LOG_ERROR, "Failed to set strobe.");
}
这不会产生任何错误,但它也不会打开选通信号输出(即使相机正在捕获帧)。我还通过使用不同的偏移量(0x204、0x208 和 0x20C)尝试了所有其他输出,但无济于事。然后我检查了 Strobe_CTRL_Inq
和 Strobe_[0123]_Inq
的所有可用性查询字段,但它们都报告存在选通信号输出。但有趣的是,Strobe_[0123]_Inq
中的 On/Off_Inq
字段告诉我,当 Polarity_Inq
告诉我可以更改极性设置(实际上我不能,因为您只能在选通信号输出打开时更改设置)。我尝试使用 Pointgrey 提供的基于 Windows 的驱动程序实用程序配置输出,并且它可以正常工作。
知道我可能做错了什么吗?还是这款相机在这方面不兼容 IIDC?
更新:好的,我尝试了三种方法来启用选通输出:使用我的原始代码,使用答案中建议的绝对偏移量 0x1300 以及使用 PointGrey 寄存器引用手册中所写的偏移量 0x1110/0x1114。我还尝试设置延迟、持续时间和/或方向(尽管不要将 PIO 与频闪输出混淆)。到目前为止,寄存器和标志的组合都不起作用。也许这是 libdc1394 中的一个错误,或者 PointGrey 在他们的专有驱动程序中做了一些其他的魔法。现在我放弃了,将尝试寻找一种不同的解决方案来触发外部设备。
最佳答案
浏览(可访问,无法访问技术引用)相机文档,您似乎需要为 GPIO 设置一个方向,即它们是输入还是输出。该文档描述了 0x11F8 处的 PIO_DIRECTION 寄存器,其中低位有效位控制 IO 是输入 (0) 还是输出 (1)。或许你的问题是方向没定好?
http://ptgrey.com/support/downloads/documents/TAN2005002_Output_strobe_signal_pulse.pdf
将相机寄存器映射与标准进行比较,相机似乎应该支持这一点。我在 libdc1394 中找不到 get/set_strobe_register API 的任何文档。也许 get 或 set_register 使用相机记录的寄存器偏移量会更好。您是如何计算 0x200 作为偏移量的?
这http://www.cs.unc.edu/Research/stc/FAQs/Cameras_Lenses/PtGrey/DcamRegisterRefManual.pdf在 0x1300 记录你试图访问的寄存器,所以也许有一些固定的已知偏移量适用于访问“选通”寄存器?同样,也许使用 set_register 将允许直接访问所有相机寄存器,因此您可以使用记录的旧集。
还有一点就是需要给频闪设置延时和计数。
关于c++ - 使用 libdc1394 在 Pointgrey Firefly MV 上输出频闪信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4505342/
我是一名优秀的程序员,十分优秀!