相机触发设置
触发
在机器视觉、工业相机或科学成像领域,"触发"(Trigger) 是指控制相机何时开始采集图像的机制。它让相机不再连续拍摄(自由运行模式),而是根据外部信号或内部条件精确地在特定时刻曝光和采集图像,从而实现与运动物体、其他设备(如光源、PLC、机械臂)的高精度同步。
为什么需要触发?
- 避免运动模糊:在传送带上抓拍高速移动的物体。
- 节省带宽/存储:只在有目标时拍照。
- 多相机同步:多个相机同时拍摄同一事件。
- 与光源同步:闪光灯亮起瞬间曝光。
- 提高系统确定性:确保图像采集时机可预测。
相机触发的主要类型
硬件触发(Hardware Trigger) ✅(最常用、最可靠)
原理:通过相机的 GPIO 接口(如 Hirose、M12 等) 接收一个电平信号(TTL/RS422/LVTTL 等)来启动曝光。
信号类型:
- 上升沿触发(Rising Edge):信号从低→高跳变时触发。
- 下降沿触发(Falling Edge):信号从高→低跳变时触发。
- 高电平触发 / 低电平触发:持续电平有效期间可多次触发(较少用)。
优点:延迟低(微秒级)、抖动小、抗干扰强。
典型应用:工业流水线、机器人引导、激光同步。
示例:光电传感器检测到产品到达 → 发出 TTL 高电平 → 相机立即曝光。
软件触发(Software Trigger)
- 原理:通过上位机软件(如 Halcon、OpenCV、厂商 SDK)发送指令触发相机拍照。
- 实现方式:调用 API 函数(如 AcquisitionStart + 触发命令)。
- 优点:无需额外接线,调试方便。
- 缺点:受操作系统调度影响,延迟高且不稳定(毫秒级抖动),不适合高速或高精度场景。
- 适用场景:实验室调试、低速检测、无硬件触发接口的相机。
自由运行(Free Running) ❌(严格来说不是"触发",但常作为对比)
- 相机以最大帧率连续采集,不依赖外部信号。
- 适用于静态场景或对同步无要求的应用。
编码器触发(Encoder Trigger)(高级硬件触发)
- 原理:相机连接旋转编码器,根据物体移动的距离(而非时间)触发拍照。
- 特点:实现"等距采样",即使传送带速度变化,图像间距仍一致。
- 应用:印刷检测、长幅材料检测(如布料、金属卷材)。
多相机同步触发
- 主从模式(Master-Slave):
- 一台相机作为"主",发出同步信号;
- 其他相机作为"从",接收该信号同时曝光。
- 使用硬件线路(如 Sync Out / Sync In) 或 PTP(Precision Time Protocol) 实现纳秒级同步。
- 应用:3D 重建、多视角检测。
- 曝光信号输出(Strobe / Flash Trigger)
- 虽然不是"输入触发",但密切相关:
- 相机在曝光开始时,通过 GPIO 输出一个闪光信号(Strobe Out),用于触发外部光源。
- 确保只有曝光期间灯亮,节能且避免过曝。
触发相关的关键参数(在相机配置中常见)
| 参数 | 说明 |
|---|---|
| Trigger Mode | On / Off(是否启用触发) |
| Trigger Source | Line0, Line1, Software, Action0(选择触发源) |
| Trigger Activation | RisingEdge, FallingEdge, AnyEdge |
| Trigger Delay | 触发后延迟多少微秒再曝光(用于补偿机械/光路延迟) |
| Exposure Mode | TriggerWidth(曝光时间由触发脉冲宽度决定)或 Timed(固定曝光时间) |
下面是一个相机的示例:
<Enumeration Name="TriggerSelector">
<ToolTip>Selects the type of trigger to configure.</ToolTip>
<Description>Selects the type of trigger to configure.</Description>
<DisplayName>Trigger Selector</DisplayName>
<Visibility>Beginner</Visibility>
<pIsLocked>IsRunning</pIsLocked>
<EnumEntry Name="FrameStart">
<Value>0x0</Value>
</EnumEntry>
<EnumEntry Name="FrameBurstStart">
<Value>0x1</Value>
</EnumEntry>
<pValue>TriggerSelectorReg</pValue>
</Enumeration>
<IntReg Name="TriggerSelectorReg">
<Address>0x8900</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<Endianess>BigEndian</Endianess>
</IntReg>
<Enumeration Name="TriggerMode">
<ToolTip>Controls if the selected trigger is active. </ToolTip>
<Description>Controls if the selected trigger is active. </Description>
<Visibility>Beginner</Visibility>
<pIsLocked>IsRunning</pIsLocked>
<EnumEntry Name="On">
<Value>0x1</Value>
</EnumEntry>
<EnumEntry Name="Off">
<Value>0x0</Value>
</EnumEntry>
<pValue>TriggerModeReg</pValue>
</Enumeration>
<IntReg Name="TriggerModeReg">
<Address>0x8904</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<pInvalidator>TriggerSelectorReg</pInvalidator>
<pInvalidator>UserSetLoadReg</pInvalidator>
<Endianess>BigEndian</Endianess>
</IntReg>
<Enumeration Name="TriggerSource">
<ToolTip>This feature defines the source of the trigger signal.</ToolTip>
<Description>This feature defines the source of the trigger signal.</Description>
<DisplayName>Trigger Source</DisplayName>
<Visibility>Beginner</Visibility>
<pIsLocked>IsRunning</pIsLocked>
<EnumEntry Name="Software">
<DisplayName>Software Trigger</DisplayName>
<Value>0x0</Value>
</EnumEntry>
<EnumEntry Name="CXPTrigger">
<DisplayName>CXP Trigger</DisplayName>
<Value>0x4</Value>
</EnumEntry>
<EnumEntry Name="Line0">
<DisplayName>Line Trigger 0</DisplayName>
<pIsImplemented>DIN1ConnectorType</pIsImplemented>
<Value>0x8</Value>
</EnumEntry>
<EnumEntry Name="Line1">
<DisplayName>Line Trigger 1</DisplayName>
<pIsImplemented>DIN1ConnectorType</pIsImplemented>
<Value>0x9</Value>
</EnumEntry>
<pValue>TriggerSourceReg</pValue>
</Enumeration>
<IntReg Name="TriggerSourceReg">
<Address>0x8908</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<pInvalidator>TriggerSelectorReg</pInvalidator>
<pInvalidator>UserSetLoadReg</pInvalidator>
<Endianess>BigEndian</Endianess>
</IntReg>
<Enumeration Name="TriggerActivation">
<ToolTip>This feature defines the activation mode of the trigger signal.</ToolTip>
<Description>This feature defines the activation mode of the trigger signal.</Description>
<DisplayName>Trigger Activation</DisplayName>
<Visibility>Beginner</Visibility>
<pIsLocked>IsRunning</pIsLocked>
<EnumEntry Name="RisingEdge">
<DisplayName>Rising Edge</DisplayName>
<Value>0x4</Value>
</EnumEntry>
<EnumEntry Name="FallingEdge">
<DisplayName>Falling Edge</DisplayName>
<Value>0x5</Value>
</EnumEntry>
<EnumEntry Name="AnyEdge">
<DisplayName>Any Edge</DisplayName>
<Value>0x6</Value>
</EnumEntry>
<pValue>TriggerActivationReg</pValue>
</Enumeration>
<IntReg Name="TriggerActivationReg">
<Address>0x890C</Address>
<Length>4</Length>
<AccessMode>RW</AccessMode>
<pPort>Device</pPort>
<pInvalidator>TriggerSelectorReg</pInvalidator>
<pInvalidator>UserSetLoadReg</pInvalidator>
<Endianess>BigEndian</Endianess>
</IntReg>
<Command Name="TriggerSoftware">
<ToolTip>Generates an internal trigger. TriggerSource must be set to Software.</ToolTip>
<Description>Generates an internal trigger. TriggerSource must be set to Software.</Description>
<DisplayName>Software Trigger</DisplayName>
<Visibility>Beginner</Visibility>
<pValue>TriggerSoftwareReg</pValue>
<CommandValue>0</CommandValue>
</Command>
<IntReg Name="TriggerSoftwareReg">
<Address>0x8910</Address>
<Length>4</Length>
<AccessMode>WO</AccessMode>
<pPort>Device</pPort>
<Endianess>BigEndian</Endianess>
</IntReg>
CoaXPress 独有的触发
CXP设备除了上述提到的触发外,还支持通过Low Speed Up connection 发送触发信号,这个触发通常是指由HOST发送到Device。
我们来看一个示例,下面是EoSens 25CXP+ 系列相机的触发源选项:
<Enumeration Name="TriggerSource">
<ToolTip>This feature defines the source of the trigger signal.</ToolTip>
<Description>This feature defines the source of the trigger signal.</Description>
<DisplayName>Trigger Source</DisplayName>
<Visibility>Beginner</Visibility>
<pIsLocked>IsRunning</pIsLocked>
<EnumEntry Name="Software">
<DisplayName>Software Trigger</DisplayName>
<Value>0x0</Value>
</EnumEntry>
<EnumEntry Name="CXPTrigger">
<DisplayName>CXP Trigger</DisplayName>
<Value>0x4</Value>
</EnumEntry>
<EnumEntry Name="Line0">
<DisplayName>Line Trigger 0</DisplayName>
<pIsImplemented>DIN1ConnectorType</pIsImplemented>
<Value>0x8</Value>
</EnumEntry>
<EnumEntry Name="Line1">
<DisplayName>Line Trigger 1</DisplayName>
<pIsImplemented>DIN1ConnectorType</pIsImplemented>
<Value>0x9</Value>
</EnumEntry>
<pValue>TriggerSourceReg</pValue>
这里面的Software 是指HOST 写DEVICE 寄存器完成单次触发,CXPTrigger是指HOST 可以插入数据包向DEVICE 发送触发,Line0/1是相机上的硬件IO端口,典型是12PIN输入端口。其中很显然,触发精度、时延准确度依次为Software、CXPTrigger、Line0/1

下面重点说明CXPTrigger的使用。
HOST 端 如何发送CXP Trigger
下面内容节选自IP手册,最终解释权归星测电子所有。
Trigger触发接口
用于Device和Host互相发送、接收触发信号(目前没有厂商支持Device向HOST发送)。相机的触发来源通常有3个:
- CoaXPress 软件触发,通过Host向Device设备写寄存器实现;
- CoaXPress 协议触发,通过Host LINK层触发输入信号实现,相对于软件触发实时性强,实际应用中使用较多,无需为相机连接额外的触发接线;
- CoaXPress 相机外部硬件触发,通过相机的外部硬件接线实现,实时性最强,触发信号发出到相机收到触发信号的延迟可以忽略不计,但是需要额外接触发信号线
本章节描述通过Host IP Link层向CoaXPress Device设备发送触发信号的接口。
表 2‑1 trigger接口
|---------------------------|-----------|------------------------------------------------------------------------------------------------------------|
| 信号名称 | 输入/输出 | 描述说明 |
| trigger_clk | 输入 | 可选trigger时钟输入。当TRIGGER_CLK_SYNC使能后,被用来对trigger 信号进行同步。默认disable,使用125M时钟输入。 |
| trigger_clrn | 输入 | 可选trigger复位输入。当TRIGGER_CLK_SYNC使能后,被用来复位同步逻辑。 |
| trigger_in | 输入 | trigger边沿选择。trigger_inn指示link n。0代表下降沿发送trigger,1代表上升沿发送trigger。 |
| trigger_in_chg | 输入 | Host向Device发送的trigger脉冲。trigger_in_chgn指示link n。 |
| trigger_ack | 输出 | device trigger响应信号,指示device是否收到了host发送的触发指令。trigger_ackn指示link n。 |
| trigger_out | 输出 | Device到Host下行链路trigger输出。trigger_outn\*3:n 指示link n。实际应用中,下行链路trigger 很少使用,绝大多数厂商不进行支持,在后续CXP协议中会考虑移除。 |
| trigger_delay_out | 输出 | 下行链路trigger延迟值。trigger_ackn\*7:n 指示link n。 |
| trigger_out_chg | 输出 | trigger_out有效指示信号。trigger_out_chgn指示link n。 |
| missed_triggers_count_out | 输出 | trigger丢失计数器输出,每个link 32bit。 |
| sent_triggers_count_out | 输出 | 发送trigger计数器输出,每个link 32bit。 |
| in_chg_triggers_count_out | 输出 | 有效trigger接收计数器,每个link 32bit。 |
| ack_triggers_count_out | 输出 | trigger响应计数器,每个link 32bit。 |

图 2‑1 uplink trigger timing,Host to Device
DEVICE 端如何接收CXP Trigger
下面内容节选自IP手册,最终解释权归星测电子所有。
Trigger触发接口
用于Device和Host互相发送、接收触发信号(目前没有厂商支持Device向HOST发送)。
表 2‑2 trigger接口
|-------------------|-----------|--------|-----------------------------------------------------------|
| 信号名称 | 输入/输出 | 位宽 | 描述说明 |
| trigger_in | 输入 | 4 | 触发输入,一个介于0和15之间的数字N,用于定义触发,对应于LinkTrigger0到LinkTrigger15。 |
| trigger_in_chg | 输入 | 1 | 此信号的上升沿触发并启动触发数据包,标志着触发信号有效标志。 |
| trigger_ack | 输出 | 1 | Trigger响应标志,表面HOST已经收到触发并给出了响应。 |
| trigger_out | 输出 | 1 | uplink上行触发输出,在从HOST接收到触发数据包时发生变化。 |
| trigger_delay_out | 输出 | 9 | uplink上行链路trigger延迟值。 |
| trigger_out_chg | 输出 | 1 | trigger_out_chg 信号表示触发输出已经发生变化并且有效。 |
uplink触发 HOST->Device:
在接收到uplink触发数据包时,IP分别在 trigger_out 和 trigger_delay_out 端口上输出接收到的触发电平和触发延迟。在 trigger_out_chg 端口上拉高一个单时钟周期的脉冲表示相关触发已到达。IP会自动向主机生成接收到的触发数据包的回应命令。下图表显示了uplink低速触发接口的时序图。

图 2‑2 uplink trigger timing, Host to Device