时间同步
概述
时间同步是一个用于同步负载设备时间和无人机时间的功能,PSDK 通过 PPS 或者 NTP 方式同步负载设备和具有 RTK 功能的无人机的时间。具有“时间同步”功能的负载设备,能够方便用户顺利地使用日志排查无人机飞行过程中的各类故障、分析传感器采样的数据以及获取精准的定位信息等功能。
本文所指
- 无人机时间:无人机系统的时间。
- 本地时间:负载设备上的时间。
时间同步
安装在无人机上的使用 PSDK 开发的负载设备在上电后,将初始化时间同步功能模块,消除负载设备和无人机的时钟差,同步负载设备和无人机的时间。
说明:
- 使用时间同步功能前,请通过移动端 App 确认无人机与 RTK 卫星间保持良好的通信状态;该移动端 App 可为 Autel Robotics 发布的 App,如Autel Enterprise,也可为基于 MSDK 开发的移动端 App。
- 将负载设备安装在无人机的云台上,在无人机上电后,使用 PSDK 开发的负载设备将接收到无人机发送的 PPS 硬件脉冲信号;
- 当负载设备检测到 PPS 信号的上升沿时,负载设备需要记录负载设备上的本地时间;
- PSDK 的底层处理程序将获取与 PPS 信号同步的无人机时间。
注意
- 请确保 PPS 信号上升沿到达负载至负载记录本地时间之间的延迟低于 1ms。
- 请使用硬件中断的形式实现 PPS 信号的响应。
- PSDK 的底层处理程序将计算负载设备的本地时间与无人机时间的时钟差,实现负载设备与无人机系统时间的同步。
- 负载设备通过
UAV_TimeSync_TransferToAircraftTime
接口将负载设备的本地时间转换为无人机时间。
使用时间同步功能
1. 时间同步功能模块初始化
使用时间同步功能,需要初始化时间同步模块。
uavStat = UAV_TimeSync_Init();
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("time synchronization module init error.");
return uavStat;
}
uavStat = UAV_TimeSync_SetType(UAV_TIME_SYNC_TYPE_PPS_CLOCK)
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("time set sync type error.");
return uavStat;
}
uavStat = UAV_TimeSync_SetType(UAV_TIME_SYNC_TYPE_NTP);
if(uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
{
UAV_LOG_ERROR("UAV_TimeSync_SetType failed");
return UAV_ERROR_SYSTEM_MODULE_CODE_UNKNOWN;
}
2. 开发并注册获取负载设备上本地时间的函数
基于 PSDK 开发的负载设备在使用时间同步功能时,需要以硬件中断的方式响应无人机推送的 PPS 时间同步信号;当最新的 PPS 信号被触发时,基于 PSDK 开发的负载设备控制程序,需要获取到负载设备的本地时间。
- 开发并注册硬件中断处理函数 开发者需要实现硬件中断处理功能,并将处理硬件中断的函数注册到指定的接口中,当负载设备接收到 PPS 信号的上升沿时,硬件中断处理函数能够处理 PPS 时间同步信号。
void UAV_TimeSync_PpsIrqHandler(void)
{
T_UAVReturnCode psdkStat;
uint32_t timeMs = 0;
/* EXTI line interrupt detected */
if (__HAL_GPIO_EXTI_GET_IT(PPS_PIN) != RESET) {
__HAL_GPIO_EXTI_CLEAR_IT(PPS_PIN);
psdkStat = Osal_GetTimeMs(&timeMs);
if (psdkStat == UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
s_ppsNewestTriggerLocalTimeMs = timeMs;
}
}
- 获取 PPS 信号被触发时负载设备的本地时间 开发者需要实现获取 PPS 信号被触发时负载设备上的本地时间的功能,并将该功能的函数注册到指定的接口中。当负载设备接收到 PPS 信号的上升沿时,基于 PSDK 开发的负载设备控制程序能够记录 PPS 信号被触发时负载设备上的本地时间。
T_UAVReturnCode UAV_TimeSync_GetNewestPpsTriggerLocalTimeUs(uint64_t *localTimeUs)
{
if (localTimeUs == NULL) {
USER_LOG_ERROR("input pointer is null.");
return UAV_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
}
if (s_ppsNewestTriggerLocalTimeMs == 0) {
USER_LOG_WARN("pps have not been triggered.");
return UAV_ERROR_SYSTEM_MODULE_CODE_BUSY;
}
*localTimeUs = (uint64_t) (s_ppsNewestTriggerLocalTimeMs * 1000);
return 0;
}
- 注册获取 PPS 信号被触发时负载设备的本地时间的函数 注册获取 PPS 信号被触发时负载设备的本地时间的功能函数后,需要将该函数注册到负载设备控制程序中,当负载设备接收到 PPS 信号的上升沿时,基于 PSDK 开发的负载设备控制程序,能够记录 PPS 信号被触发时负载设备的本地时间。
// users must register getNewestPpsTriggerTime callback function
uavStat = UAV_TimeSync_RegGetNewestPpsTriggerTimeCallback(s_timeSyncHandler.GetNewestPpsTriggerLocalTimeUs);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("register GetNewestPpsTriggerLocalTimeUsCallback error.");
return uavStat;
}
3. 时间同步
使用 PSDK 开发的负载设备控制程序通过 GetTimeMs
获取负载设备上的本地时间,并将负载设备的本地时间转换为无人机时间。
- 获取负载设备的本地时间
uavStat = GetTimeMs(¤tTimeMs);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get current time error: 0x%08llX.", uavStat);
continue;
}
uavStat = GetTimeUs(¤tTimeMs);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("get current time error: 0x%08llX.", uavStat);
continue;
}
- 时间转换 将负载设备的本地时间转换为无人机时间。
uavStat = UAV_TimeSync_TransferToAircraftTime(currentTimeUs, &aircraftTime);
if (uavStat != UAV_ERROR_SYSTEM_MODULE_CODE_SUCCESS) {
USER_LOG_ERROR("transfer to aircraft time error: 0x%08llX.", uavStat);
continue;
}
USER_LOG_DEBUG("current aircraft time is %d.%d.%d %d:%d %d %d.", aircraftTime.year, aircraftTime.month, aircraftTime.day, aircraftTime.hour, aircraftTime.minute, aircraftTime.second, aircraftTime.microsecond);