Autoware与LGSVL连接_时钟同步问题

环境:
Autoware1.14 + LGSVL

问题描述:
首先确保LGSVL和Autoware.ai之间能成功连接(分布式部署Autoware和LGSVL?有线|无线,环境搭建),SVL和Autoware之间可以互通数据。
在应用Autoware欧式聚类模块lidar_euclidean_cluster_detect中,若将聚类点云簇输出到与velodyne静态相连的其他坐标系(如base_link)时没有问题,但输出到动态连接的其他坐标系时(如map,world,mobility…),出现报错。
Autoware与LGSVL连接_时钟同步问题_第1张图片

报错内容如下

[ERROR] [1668845209.120346482]: publishCloudClusters: “map” passed to lookupTransform argument target_frame does not exist.
在这里插入图片描述

查找原因:
在欧式聚类的源码中查到,在寻找(target_frame到velodyne)坐标转换时出现的问题,报错部分为

tf::StampedTransform findTransform(const std::string &in_target_frame, const std::string &in_source_frame)
{
  tf::StampedTransform transform;

  try
  {
    // What time should we use?
    _vectormap_transform_listener->lookupTransform(in_target_frame, in_source_frame, ros::Time(0), transform);
  }
  catch (tf::TransformException ex)
  {
    ROS_ERROR("%s", ex.what());
    return transform;
  }

  return transform;
}

Autoware的创作者很有趣的在提示// What time should we use?,“我们应该用什么time?”
再利用rqt_tf_tree工具查看是哪里出了问题。
命令行输入rosrun rqt_tf_tree rqt_tf_tree
Autoware与LGSVL连接_时钟同步问题_第2张图片

可以看到,ndt_matching的时间戳和其他坐标转换发布之间的时间戳不同,这导致了lookupTransform函数在buffer内找不到相同时间戳下的坐标转换,所以报错了。
继续挖,发现是来自LGSVL的话题,如/point_raw, /image_raw, .....采用的是LGSVL的时间。
测试发现,当成功连接LGSVL与Autoware时,两者会对齐一次时间戳,但即便这样,可能由于SVL或者lgsvl_simulator_bridge有buffer缓冲区的设计,导致Autoware收到来自LGSVL的最新的传感器话题数据都会存在时差,时间戳刚好相差10s,导致报错。
并且,在运行过程中,若暂停LGSVL,会发现Autoware的时间继续走时,但是LGSVL的走时却停止了。

发现Gitlab中也有关于这个问题的讨论(LGSVL TimeStamp Issue)

解决办法:
看了大家的意见后,我们采用的办法是让ROS利用外部时间

  1. 在LGSVL中添加clock sensor,让SVL发布话题/clock或者使用UP配置的传感器
    Autoware与LGSVL连接_时钟同步问题_第3张图片

  2. 在启动Autoware后,在命令行输入 rosparam set /use_sim_time true,这时可以看到ROS Time已经暂停了,只有启动LGSVL并且播放后,ROS Time才会走时。

  3. 此时所有的数据都会采用/clock发布的时间,Enjoy

这下,所有的传感器数据,以及Autoware处理后的数据都会采用外部时间添加时间戳,欧式聚类模块lidar_euclidean_cluster_detect将输出转到其他坐标系也不会报错。
总结:
建议在使用Autoware和仿真器连接时,若仿真器可以输出时钟,则将ros设置为使用外部时钟,避免时出现其他问题。

你可能感兴趣的:(无人驾驶,人工智能,自动驾驶)