linuxptp时间同步
让不同机器上的时间保持一致就是时间同步。多台机器下的任务需要在一个时间基准下工作就需要时间同步。本文讨论的时间同步协议是PTP。时间同步在自动驾驶领域是至关重要的核心技术其重要性不亚于传感器硬件和算法本身。它如同整个系统的“神经系统时钟”确保各个部分协调一致地工作。多传感器数据融合的基础自动驾驶汽车依赖激光雷达、摄像头、毫米波雷达、惯性导航单元等多种传感器。这些传感器以不同的频率如10Hz、50Hz、100Hz采集数据。问题如果没有精确到毫秒甚至微秒级的时间同步一个“看到”障碍物的摄像头帧和一个“检测到”物体的激光雷达点云就无法准确对应到同一时刻的同一物体。后果会导致融合算法产生“鬼影”或位置错乱严重降低感知精度。高精度时间同步如基于PTP或GPS PPS为所有数据打上统一的时间戳是生成准确、一致的“世界模型”的前提。决策与控制的时效性和一致性从感知到规划再到控制执行是一个严密的因果链条。问题规划模块基于“过去某个时刻”的感知结果做决策而车辆状态速度、位置却在实时变化。如果各模块间的处理时间戳不一致规划出的轨迹可能基于过时或超前的信息。后果导致控制指令转向、刹车不准确、不平稳甚至产生危险。同步的时间戳确保了整个信号链的时序逻辑正确。1PTP1.1示意时间同步通过主时钟和从时钟之间的报文交互来完成。主时钟时钟源发布时间其它从时钟都要和主时钟的时间进行同步从时钟与主时钟的时间保持同步t1:Sync报文离开主时钟时的时间戳t2:从时钟接收到Sync报文时的时间戳t3:从时钟发送Delay_Req报文时的时间戳t4:主时钟接收到Delay_Req报文时的时间戳从时钟要基于t1、t2、t3、t4进行计算计算的核心目标是计算出此时主时钟的真实时间。t1和t4都是主时钟的真实时间但是当从时钟收到Delay_Resp报文时t4已经发生了一段时间主要是经过了Delay_Resp在网络上传输的时间。t2 t1 delay offsett4 t3 delay - offset通过上边两个公式计算得出delay ((t2 - t1) (t4 - t3))/2offset ((t2 - t1) - (t4 - t3))/2delay和offset分别表示什么意思为什么要计算这两个值呢delay表示报文在链路上的传输延时PTP协议假设主时钟-从时钟以及从时钟-主时钟的链路是对称的也就是说双向的链路延时是相同的。offset表示从时钟相对于主时钟的偏移。在某一时刻比如在t1时刻主时钟的时间是t1那么此时从时钟的时间不一定是t1如果每一时刻两者的时间都是相同那么便不需要时间同步从时钟的时间和主时钟的时间肯定在每时每刻都有一个差值这个差值就是offset。时间同步就是将offset收敛到目标精度之内比如1μs以内。1.2ptp在协议栈第几层之上以太网、udpptp协议可以工作在以太网之上也可以工作在udp一个链路层一个传输层。使用ptp4l命令可以-2指定使用以太网-4使用udp。1.2.1udp:320和3191、Announce、Follow-Up、Delay_Resp报文使用端口320;Sync、Delay_Req使用端口3192、使用目标ip地址224.0.1.1291.2.2以太网以太网的ptp协议号是0x88f7。1.3时钟类型Master主时钟时钟源Slave从时钟同步主时钟的时间Boundary边界时钟边界时钟包含一个Slave和MasterSlave从上游的Master同步时间Master向下游的Slave同步时间那么下游的Slave就只认识Boundary中的Master不认识上游的Master了。跟一种路由协议很相似有工作在边界上的有工作在边界内部的IGP和BGP。Transparent:同透明时钟只做转发。为了简单本文只讨论Master和Slave之间存在透明时钟的情况。1.4延时测量机制E2E和P2P在PTP中测量延时是非常重要的工作延时测量的精确与否是影响时间同步是否精确的重要因素。延时测量机制有两种E2E和P2P。E2E假设双向链路对称如果实际不对称则计算结果不精确;P2P消除了双向链路对称的假设依赖。E2E适用场景网络拓扑简单、稳定的线性或星型网络。不需要极高精度亚微秒级的应用例如企业网、某些音视频流媒体系统。网络设备较旧或仅支持普通二层/三层交换无法部署P2P透明时钟。主从时钟之间跳数较少。P2P适用场景对同步精度要求较高的应用。大规模多跳的复杂网络。E2E和P2P都会计算在节点上的驻留时间以及节点之间的传输时间。E2E通过Pdeley_req和Pdelay_resp计算整体延时整体延时就包含了驻留时间和链路时间。P2P会将链路时间和驻留时间放在correctionField中不需要专门的报文来测量延时。1.4.1E2E端到端slave发送Delay_Req报文到MasterMaster发送Delay_Resp报文到slave。Delay_Req离开slave的时刻是t3Delay_Req到达Master的时刻是t4。1.4.2P2Ppeer to peer不是测量slave和master之间的delay所有peer之间的延时。每个节点都会测量和上游peer的链路延时然后加到correctioField中。1.4.3correctionField在E2E场景下Transparent1和Transparent2会将报文在本节点中的驻留时间加到correctionField中。对于Sync报文、Follow_up报文和Delay_Resp报文均会做这样的操作。当接收到Follow_up报文时也就得到了t1和t2两个值t1会用correction进行纠正后边计算delay或者offset均使用纠正后的t1即t1c。这里有个疑问为什么t1要使用sync和follow up报文中的correction进行修正两个correction不会重复吗在如下代码中透明时钟转发sync和follow up报文的时候都加上了correction。在函数tc_complete_syfup中可以看到correction只是加到了follow up中的correction field中并没有加到sync的correction field中。static void tc_complete(struct port *q, struct port *p,struct ptp_message *msg, tmv_t residence){switch (msg_type(msg)) {case SYNC:case FOLLOW_UP:tc_complete_syfup(q, p, msg, residence);break;case DELAY_REQ:tc_complete_request(q, p, msg, residence);break;case DELAY_RESP:tc_complete_response(q, p, msg, residence);break;}}收到Delay_Resp报文时t4会用Delay_Resp的correction field进行修正。在P2P模式下correctionField已经包含了所有链路的延时和每个透明时钟的驻留时间但是缺少slave和它的peer的链路延时这个延时由slave和它的peer通过Pdelay_Req、Pdelay_Resp、Pdelay_Resp_Fup来完成。在如下的计算offset的代码中兼容E2E和P2P两种模式。int tsproc_update_offset(struct tsproc *tsp, tmv_t *offset, double *weight){.../* offset t2 - t1 - delay */*offset tmv_sub(tmv_sub(tsp-t2, tsp-t1), delay);}在E2E模式下t2是Slave接收到Sync报文的时间t1是修正后的Master发送Sync的时间两者相见再减去delay就是offset。在E2E模式下delay是path delay。在P2P模式下t2是与E2E模式下意思相同t1也是修正后的时间但是修正t1的时间是包含了所有的驻留时间和链路延时缺少Slave也它额peer的链路延时。这里的delay是Slave和它的peer的链路延时。correction计算源correction驻留时间链路delaystatic void tc_complete_syfup(struct port *q, struct port *p, struct ptp_message *msg, tmv_t residence) { ... c1 net2host64(fup-header.correction); c2 c1 tmv_to_TimeInterval(residence); c2 tmv_to_TimeInterval(q-peer_delay); c2 q-asymmetry; fup-header.correction host2net64(c2); ... }1.4.4目的mac如果工作在以太网协议上。1.5一步模式和两步模式一步模式下t1包含在Sync报文中没脱Follow_up报文两步模式t1在Follow_up中。1.2ptp4l测试结果如下是slave侧的打印信息master offset:slave相对于master的偏移相位同步freq:slave相对于master的频率偏移频率同步ptp4l[541.135]: port 1 (ens33): INITIALIZING to LISTENING on INIT_COMPLETEptp4l[541.135]: port 0 (/var/run/ptp/ptp4l): INITIALIZING to LISTENING on INIT_COMPLETEptp4l[541.136]: port 0 (/var/run/ptp/ptp4lro): INITIALIZING to LISTENING on INIT_COMPLETEptp4l[547.144]: selected local clock 000c29.fffe.092928 as best masterptp4l[562.962]: port 1 (ens33): new foreign master 000c29.fffe.a13faa-1ptp4l[566.963]: selected best master clock 000c29.fffe.a13faaptp4l[566.963]: foreign master not using PTP timescaleptp4l[566.963]: port 1 (ens33): LISTENING to UNCALIBRATED on RS_SLAVEptp4l[567.963]: master offset 18513043 s0 freq 81 path delay 236121ptp4l[568.964]: master offset 18510264 s0 freq 81 path delay 227600ptp4l[569.965]: master offset 18731866 s0 freq 81 path delay 221137ptp4l[570.965]: master offset 19175564 s0 freq 81 path delay 197590ptp4l[571.967]: master offset 18936113 s0 freq 81 path delay 197590ptp4l[572.967]: master offset 18910735 s0 freq 81 path delay 199041ptp4l[573.967]: master offset 19049961 s0 freq 81 path delay 199041ptp4l[574.967]: master offset 19078099 s0 freq 81 path delay 208858ptp4l[575.968]: master offset 19214035 s0 freq 81 path delay 192378ptp4l[576.968]: master offset 19471511 s0 freq 81 path delay 181110ptp4l[577.968]: master offset 19382949 s0 freq 81 path delay 192378ptp4l[578.970]: master offset 19503267 s0 freq 81 path delay 192378ptp4l[579.970]: master offset 19451555 s0 freq 81 path delay 192378ptp4l[580.971]: master offset 19594674 s0 freq 81 path delay 192378ptp4l[581.971]: master offset 19627512 s0 freq 81 path delay 178572ptp4l[582.972]: master offset 19730776 s0 freq 81 path delay 171225ptp4l[583.974]: master offset 19781335 s1 freq 79299 path delay 167683ptp4l[584.976]: clockcheck: clock frequency changed unexpectedly!ptp4l[584.976]: master offset 1668894 s2 freq 247858 path delay 167683ptp4l[584.976]: port 1 (ens33): UNCALIBRATED to SLAVE on MASTER_CLOCK_SELECTEDptp4l[585.979]: master offset 3541232 s2 freq 438633 path delay 171225ptp4l[586.980]: master offset 4889923 s2 freq 578392 path delay 189939ptp4l[587.984]: master offset 5915394 s2 freq 686854 path delay 189939ptp4l[588.984]: master offset 6695837 s2 freq 771594 path delay 189939ptp4l[589.986]: master offset 7138014 s2 freq 822950 path delay 194640ptp4l[590.986]: master offset 7464812 s2 freq 863095 path delay 194640ptp4l[591.987]: master offset 7529117 s2 freq 877054 path delay 194640ptp4l[592.987]: master offset 7564216 s2 freq 888129 path delay 194640ptp4l[593.988]: master offset 7680397 s2 freq 907427 path delay 212139ptp4l[594.988]: master offset 7409660 s2 freq 887763 path delay 212929ptp4l[595.988]: master offset 6931089 s2 freq 846837 path delay 195431ptp4l[596.988]: master offset 6864990 s2 freq 847092 path delay 195431ptp4l[597.988]: master offset 6283599 s2 freq 795237 path delay 179609ptp4l[598.988]: master offset 5964667 s2 freq 769308 path delay 179609ptp4l[599.988]: master offset 5558496 s2 freq 734249 path delay 175563ptp4l[600.989]: master offset 5146096 s2 freq 698155 path delay 191385s0、s1、s2:代表从时钟的伺服状态其实还有s4但是测试环境达不到同步精度所以没有打印出来。/*** Defines the caller visible states of a clock servo.*/enum servo_state {/*** The servo is not yet ready to track the master clock.*/SERVO_UNLOCKED,/*** The servo is ready to track and requests a clock jump to* immediately correct the estimated offset.*/SERVO_JUMP,/*** The servo is tracking the master clock.*/SERVO_LOCKED,/*** The Servo has stabilized. The last servo_num_offset_values values* of the estimated threshold are less than servo_offset_threshold.*/SERVO_LOCKED_STABLE,};1. SERVO_UNLOCKED未锁定初始状态或失步状态伺服器尚未准备好跟踪主时钟通常发生在刚启动时失去主时钟连接时同步质量太差无法跟踪时2. SERVO_JUMP跳变状态过渡状态准备开始跟踪检测到时间偏移过大需要立即校正伺服器请求时钟跳变clock jump来快速纠正时间差跳变后进入锁定状态3. SERVO_LOCKED已锁定正常跟踪状态伺服器正在调整本地时钟频率来跟踪主时钟使用PI比例-积分控制算法进行微调时间同步已建立但可能还不够稳定4. SERVO_LOCKED_STABLE稳定锁定最佳工作状态满足两个条件最近servo_num_offset_values个偏移测量值都小于servo_offset_threshold阈值表明时钟同步已经稳定可靠2gPTPgPTP是在ptp协议上做了更具体的要求删除一些灵活的配置是TSN网络工作的基础。在TSN网络中gPTP协议硬具有最高的优先级。1只使用以太网进行传输不使用udp进行传输减少协议栈引入的抖动2delay测量方式只使用P2PP2P协议有自己专用的目的MAC地址.TP.B ptp_dst_macThe MAC address to which PTP messages should be sent.Relevant only with L2 transport. The default is 01:1B:19:00:00:00..TP.B p2p_dst_macThe MAC address to which peer delay messages should be sent.Relevant only with L2 transport. The default is 01:80:C2:00:00:0E.3只能工作在局域网内