环境:
Autoware1.14
+ LGSVL
问题描述:
首先确保LGSVL和Autoware.ai之间能成功连接(分布式部署Autoware和LGSVL?有线|无线,环境搭建),SVL和Autoware之间可以互通数据。
在应用Autoware欧式聚类模块lidar_euclidean_cluster_detect
中,若将聚类点云簇输出到与velodyne
静态相连的其他坐标系(如base_link
)时没有问题,但输出到动态连接的其他坐标系时(如map
,world
,mobility
…),出现报错。
报错内容如下
[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
可以看到,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利用外部时间:
在启动Autoware后,在命令行输入 rosparam set /use_sim_time true
,这时可以看到ROS Time已经暂停了,只有启动LGSVL并且播放后,ROS Time才会走时。
此时所有的数据都会采用/clock
发布的时间,Enjoy
这下,所有的传感器数据,以及Autoware处理后的数据都会采用外部时间添加时间戳,欧式聚类模块lidar_euclidean_cluster_detect
将输出转到其他坐标系也不会报错。
总结:
建议在使用Autoware和仿真器连接时,若仿真器可以输出时钟,则将ros设置为使用外部时钟,避免时出现其他问题。