导航

    蓝鲸ROS机器人论坛

    • 注册
    • 登录
    • 搜索
    • 版块
    • 话题
    • 热门
    ROS交流群
    ROS Group
    产品服务
    Product Service
    开源代码库
    Github
    官网
    Official website
    技术交流
    Technological exchanges
    激光雷达
    LIDAR
    ROS教程
    ROS Tourials
    深度学习
    Deep Learning
    机器视觉
    Computer Vision

    二维码摄像头和里程计的时间戳同步

    技术交流
    二维码 里程计 时间戳同步
    2
    2
    1301
    正在加载更多帖子
    • 从旧到新
    • 从新到旧
    • 最多赞同
    回复
    • 在新帖中回复
    登录后回复
    此主题已被删除。只有拥有主题管理权限的用户可以查看。
    • weijiz
      weijiz 最后由 编辑

      假设里程计时间戳和二维码摄像头的时间戳都是准确的(或者和真实时间都差了一个相同的固定值),那么同一时刻通过里程计计算的机器人移动的相对位姿应该和通过二维码计算的相对位资完全一样。因为两个传感器数据同一时刻对应的是同一个机器人位置。

      对于时间戳其真实值实际上对我们没有多大意义,更有意义的是不同传感器之间时间戳的偏差。通过这种方式我们可以用来校准这两个传感器的时间戳。我们可以以一个传感器的时间戳作为基准,其他传感器的时间戳对其到这个时间戳上。里程计时间戳就是一个很好的基准。

      我们控制机器人下方扫码摄像头在机器人正中央,保证机器人在原地旋转时二维码始终在自己的摄像头范围中央。同时录制摄像头和里程计数据。通过里程计数据可以计算出一个相对于初始位置的相对位姿,通过二维码数据也可以计算出一个相对位姿。机器人以固定速度原地旋转。很容易计算出这两个位姿的差就是 delta_theta = delta_t * w, 其中delta_t就是两个传感器的时间戳差别,w是机器人旋转的角速度。如果时间戳的差距是固定的,那么就应该有这个角度差也是固定的。

      通过实验我计算出 角度差均值是 -0.09949351795361913, 标准差是 0.014604546858801595
      可以看到这两个传感器的时间戳基本上确实是一个定值。机器人角速度为2rad/s,则计算出时间戳大概差50ms。把这个偏差加入到计算中相关精度有了明显的提升。

      小助理 1 条回复 最后回复 回复 引用 0
      • 小助理
        小助理 @weijiz 最后由 编辑

        根据你的描述,你已经通过实验计算出了二维码摄像头和里程计之间的时间戳差异,这是一个非常有效的做法。为了确保两个传感器的时间戳能够同步,可以将二维码摄像头的时间戳调整为与里程计的时间戳对齐。以下是一个简单的Python示例代码,展示了如何实现这一点:

        import numpy as np
        
        # 实验数据
        angle_diff_mean = -0.09949351795361913  # 角度差均值
        angle_diff_std = 0.014604546858801595   # 角度差标准差
        angular_velocity = 2.0  # 机器人旋转的角速度 (rad/s)
        
        # 计算时间戳差异
        timestamp_diff = angle_diff_mean / angular_velocity  # 单位:秒
        
        print(f"时间戳差异: {timestamp_diff * 1000:.2f} ms")
        
        # 假设我们有一个二维码摄像头的时间戳列表和里程计的时间戳列表
        qr_timestamps = [1629460000.0, 1629460000.1, 1629460000.2, 1629460000.3]
        odometry_timestamps = [1629460000.0, 1629460000.1, 1629460000.2, 1629460000.3]
        
        # 调整二维码摄像头的时间戳
        adjusted_qr_timestamps = [t + timestamp_diff for t in qr_timestamps]
        
        # 打印调整后的时间戳
        for original, adjusted in zip(qr_timestamps, adjusted_qr_timestamps):
            print(f"原始时间戳: {original:.6f}, 调整后时间戳: {adjusted:.6f}")
        
        # 假设我们有一个二维码数据和里程计数据的列表
        qr_data = [
            {"timestamp": 1629460000.0, "pose": {"x": 0.0, "y": 0.0, "theta": 0.0}},
            {"timestamp": 1629460000.1, "pose": {"x": 0.1, "y": 0.0, "theta": 0.1}},
            {"timestamp": 1629460000.2, "pose": {"x": 0.2, "y": 0.0, "theta": 0.2}},
            {"timestamp": 1629460000.3, "pose": {"x": 0.3, "y": 0.0, "theta": 0.3}}
        ]
        
        odometry_data = [
            {"timestamp": 1629460000.0, "pose": {"x": 0.0, "y": 0.0, "theta": 0.0}},
            {"timestamp": 1629460000.1, "pose": {"x": 0.1, "y": 0.0, "theta": 0.1}},
            {"timestamp": 1629460000.2, "pose": {"x": 0.2, "y": 0.0, "theta": 0.2}},
            {"timestamp": 1629460000.3, "pose": {"x": 0.3, "y": 0.0, "theta": 0.3}}
        ]
        
        # 调整二维码数据的时间戳
        for data in qr_data:
            data["timestamp"] += timestamp_diff
        
        # 打印调整后的二维码数据
        for data in qr_data:
            print(f"调整后二维码数据: 时间戳: {data['timestamp']:.6f}, 位姿: {data['pose']}")
        
        # 对比调整后的二维码数据和里程计数据
        for qr, odometry in zip(qr_data, odometry_data):
            print(f"二维码时间戳: {qr['timestamp']:.6f}, 里程计时间戳: {odometry['timestamp']:.6f}")
        

        解释

        1. 计算时间戳差异:通过实验得到的角度差均值和机器人旋转的角速度,计算出时间戳差异。
        2. 调整二维码摄像头的时间戳:将二维码摄像头的时间戳加上计算出的时间戳差异,使其与里程计的时间戳对齐。
        3. 打印调整后的时间戳:输出调整前后的二维码摄像头时间戳,以便验证调整效果。
        4. 调整二维码数据的时间戳:将二维码数据中的时间戳进行调整。
        5. 对比调整后的数据:输出调整后的二维码数据和里程计数据的时间戳,验证两者是否对齐。

        通过这种方法,你可以确保二维码摄像头和里程计的时间戳同步,从而提高系统的精度和可靠性。

        我是论坛智能小助理,回答的问题可能是错误的。对于一些可能影响设备的关键问题,请谨慎参考我的回答

        1 条回复 最后回复 回复 引用 0
        • 1 / 1
        • First post
          Last post
        Copyright © 2015-2023 BlueWhale community