使用nmea+pps为激光雷达做授时,输出的时间戳差不多比ros时间戳,也就是unix时间快19s,然后使用gtimu协议中的周和周内秒计算imu数据的时间戳,得到的时间戳比ros时间戳快18s,同样来自gps时间,到底imu和雷达的时间戳相差了1s,到底哪个是对的呢?gps时间和utc时间之间的闰秒到底是相差18s还是19秒呢?
imu时间戳计算代码和各个时间戳的比较 :


使用nmea+pps为激光雷达做授时,输出的时间戳差不多比ros时间戳,也就是unix时间快19s,然后使用gtimu协议中的周和周内秒计算imu数据的时间戳,得到的时间戳比ros时间戳快18s,同样来自gps时间,到底imu和雷达的时间戳相差了1s,到底哪个是对的呢?gps时间和utc时间之间的闰秒到底是相差18s还是19秒呢?
imu时间戳计算代码和各个时间戳的比较 :


以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:
您想要解决的问题: 您想要解决的问题是关于使用NMEA+PPS为激光雷达授时,并使用GTIMU协议计算IMU数据的时间戳时,发现IMU和激光雷达的时间戳存在1秒的差异。您需要确定哪个时间戳是正确的,并理解GPS时间和UTC时间之间闰秒的差异。
图片内容:
问题出现原因: 问题出现的原因是在授时过程中,可能存在同步误差或者计算误差。由于IMU和激光雷达的时间戳都来源于GPS时间,但与ROS时间戳相比存在差异,这可能意味着在时间戳的计算或者同步过程中有误差发生。
问题解决方案:
提供代码: 由于我无法直接修改图片中的代码,我将提供一个概念性的解决方案,您可以根据这个解决方案调整您的代码。
// 假设gps_weeks, sec_in_week, le9已经正确获取
// 假设pps_offset是PPS信号的偏移量(可能需要根据实际情况调整)
int pps_offset = 19; // 假设PPS信号比ROS时间快19秒
// 计算IMU时间戳
imu_msg.header.stamp.sec = gps_weeks * 604800 + (int)sec_in_week + 315964800 - pps_offset;
imu_msg.header.stamp.nsec = (sec_in_week - (int)sec_in_week) * 1e9;
// 校准激光雷达时间戳(如果需要)
// lidar_msg.header.stamp.sec = ...;
// lidar_msg.header.stamp.nsec = ...;
代码运行方式:
代码预期运行结果: 如果代码正确运行,IMU和激光雷达的时间戳应该与ROS时间戳同步,误差应该在可接受的范围内。
推荐相关链接: