相机事件配置与事件回调函数注册

void __stdcall EventCallBack(MV_EVENT_OUT_INFO * pEventInfo, void* pUser)
{
    if (pEventInfo)
    {
        int64_t nBlockId = pEventInfo->nBlockIdHigh;
        nBlockId = (nBlockId << 32) + pEventInfo->nBlockIdLow;
        int64_t nTimestamp = pEventInfo->nTimestampHigh;
        nTimestamp = (nTimestamp << 32) + pEventInfo->nTimestampLow;
		printf("EventName[%s],Timestamp[" "%" PRIu64 "]\n",pEventInfo->EventName,nTimestamp);
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

事件回调函数内部处理

  1. 图像时间戳
void __stdcall ImageCallBackEx(unsigned char * pData, MV_FRAME_OUT_INFO_EX* pFrameInfo, void* pUser)
{
	uint64_t m_DevTimeStamp=0;//设备产生图像的时间
	int64_t  m_HostTimeStamp =0;//图像头包到达主机时间
    if (pFrameInfo)
    {
		m_DevTimeStamp = pFrameInfo->nDevTimeStampHigh;
		m_DevTimeStamp = (m_DevTimeStamp << 32)+pFrameInfo->nDevTimeStampLow;
		m_HostTimeStamp=pFrameInfo->nHostTimeStamp;
		printf("GetOneFrame, Width[%d], Height[%d], nFrameNum[%d],nDevTimeStamp[" "%" PRIu64 "],nHostTimeStamp[" "%" PRIu64 "]\n",
		pFrameInfo->nWidth, pFrameInfo->nHeight, pFrameInfo->nFrameNum,m_DevTimeStamp,m_HostTimeStamp);
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

通过回调函数取流并通过帧信息结构体中获取nDevTimeStamp、nHoststamp
3. 相机参数时间戳获取

//获取相机当前时间戳
//仅网口相机支持
MVCC_INTVALUE_EX nGevTimestampValue;
nRet = MV_CC_SetCommandValue(handle, "GevTimestampControlLatch");
if (MV_OK != nRet)
{
	printf("Gev TimestampControlLatch fail! nRet [%x]\n", nRet);
	//break; 
}else
{
	nRet = MV_CC_GetIntValueEx(handle,"GevTimestampValue",&nGevTimestampValue);
	if (MV_OK == nRet)
	{
		printf("Get GevTimestampValue =  [%lld] Success!\n",(long long)nGevTimestampValue.nCurValue);
	}
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}"> class="hide-preCode-box">

四、通过PTPD实现主机与相机系统时钟同步

4.1 ptpd服务部署

参考文章:ptpd安装部署
ptpd开源链接:github
ptpd通常指的是实现Precision Time Protocol (PTP) 协议的守护进程,用于在计算机网络中提供高精度的时间同步服务;

  1. 查看网卡与ip
1|sudo apt-get install net-tools
2|ifconfig
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

2、查看网卡支持项

1|sudo apt-get install ethtool
2|sudo ethtool -T ens33
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述
软件时间戳需要包括参数

SOF_TIMESTAMPING_SOFTWARE
SOF_TIMESTAMPING_TX_SOFTWARE
SOF_TIMESTAMPING_RX_SOFTWARE
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

硬件时间戳需要包括参数

SOF_TIMESTAMPING_RAW_HARDWARE
SOF_TIMESTAMPING_TX_HARDWARE
SOF_TIMESTAMPING_RX_HARDWARE
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 查看NTP(网络时间同步)状态,并关闭
timedatectl  status
sudo timedatectl set-ntp false
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述

  1. ptpd安装部署
sudo apt-get install ptpd
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 选定主机网卡ens33,开启ptpd作为主时钟master
sudo ptpd -M -i ens33
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

开启ptpd后,可在进程中发现ptpd相关进程
在这里插入图片描述

  1. 主机作为从时钟(相机或其他设备作为主设备)
sudo ptpd -g -i ens33
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
注:步骤4和5加入-C参数的话,会在前台运行,并打印输出,如在主时钟端:
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

例:sudo ptpd -M -C -i ens33

在这里插入图片描述
7. 关闭进程
测试结束时,可直接使用kill命令,结束进程中的ptpd,恢复NTP服务

sudo pkill ptpd
sudo timedatectl set-ntp true
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

4.2 PTP时钟同步测试

PTP时钟同步,可以搭配不同的硬件有多种Master、Slave组合,如下表所示

class="table-box">
MasterSlave
电脑主机工业相机、硬件同步设备、电脑主机
工业相机电脑主机、工业相机、硬件同步设备
硬件同步设备(GPS等)工业相机、电脑主机、硬件同步设备

本文主要基于PTPD介绍表格中第一种情况,即Ubuntu主机,作为Master、工业相机作为Slave模式
测试方法:

  1. Ubuntu开启Master模式
sudo ptpd -M -i ens33
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
  1. 工业相机开启1588模式
    在这里插入图片描述
  2. 使用工业相机时间戳,测试同步效果如下
    在这里插入图片描述
    按照时间维度,对时间戳进行排序与计算
class="table-box">
时间戳类型时间戳ID时间戳时间差us(100MHz)ns说明
EventLine0RisingEdge1716878696804977842///
EventFrameStart171687869680499002212.1812180FrameStart- Line0RisingEdge
ImagenDevTimeStamp17168786968049900820.0660nDevTimeStamp- FrameStart
EventExposureStart17168786968049911821.11100ExposureStart- nDevTimeStamp
EventExposureEnd17168786968106586225667.445667440ExposureEnd- ExposureStart
HostnHostTimeStamp1716878696811341.378341378nHostTimeStamp- ExposureEnd
EventFrameEnd171687869683618655225186.55225186552FrameEnd- nHostTimeStamp

HostTimeStamp与相机的各种时间戳时间单位基本一致
关闭ptpd进程服务,相机断电重新测试

sudo pkill ptpd
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

在这里插入图片描述

class="table-box">
时间戳类型时间戳ID时间戳时间差us(100MHz)ns说明
EventLine0RisingEdge32279293504138///
EventFrameStart322792935092385.15100FrameStart- Line0RisingEdge
ImagenDevTimeStamp322792935092980.0660nDevTimeStamp- FrameStart
EventExposureStart322792935103981.11100ExposureStart- nDevTimeStamp
EventExposureEnd322792991779705667.5725667572ExposureEnd- ExposureStart
HostnHostTimeStamp1716872579325///
EventFrameEnd3227932470638125528.4125528411FrameEnd- ExposureEnd

关闭ptpd服务后,主机时间nHostTimeStamp不与相机时间同步

其他:

  1. 如需实现工业相机与工业相机之间PTP同步,只需要选定一台相机做master,先开启1588参数使能接口,其他相机后开启,会自动协商成slave模式;如需实现1588触发同步功能,建议参考海康工业相机ActionCommand功能
  2. 如需在windows上实现ptpd等类似功能,需要找能够在windows上运行的ptp开源项目;或者使用硬件设备作为master,相机只需要作为slave在windows上面运行
    测试代码基于ubuntu 系统,海康工业相机示例程序Grab_ImageCallback修改,可自行下载测试
data-report-view="{"mod":"1585297308_001","spm":"1001.2101.3001.6548","dest":"https://blog.csdn.net/qq_23107577/article/details/139293914","extend1":"pc","ab":"new"}">>
注:本文转载自blog.csdn.net的青山笑我依旧在的文章"https://blog.csdn.net/qq_23107577/article/details/139293914"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!