参照文献:
https://www.ncnynl.com/archives/201702/1313.html
TF和Time
**1、在前面的教程中,我们了解了tf如何跟踪坐标系树。**
此树随时间变化,tf存储每个变换的时间快照(默认情况下最多为10秒)。
直到现在,我们使用lookupTransform()函数来获取该tf树中最新的可用变换,而不知道什么时候记录变换。
try{
listener.lookupTransform("/turtle2", “/turtle1”,
ros::Time(0), transform);
2、 改变获取当前时间的变换,即改为now(), 修改代码:
try{
listener.lookupTransform("/turtle2", “/turtle1”,
ros::Time::now(), transform);
lookupTransform()函数提示失败:
[ERROR] [1287871653.885277559]: You requested a transform that is 0.018 miliseconds in the past, but the most recent transform in the tf buffer is 7.681 miliseconds old.
When trying to transform between /turtle1 and /turtle2.
这是为什么? 每个监听器有一个缓冲区,它存储来自不同tf广播者的所有坐标变换。 当广播者发出变换时,变换进入缓冲区之前需要一些时间(通常是几个毫秒)。 因此,当您在时间“now”请求坐标系变换时,您应该等待几毫秒以获得该信息。
等待变换
tf提供了一个很好的工具,它将等待,直到变换可用。
修改代码为:
try{
ros::Time now = ros::Time::now();
listener.waitForTransform("/turtle2", “/turtle1”,
now, ros::Duration(3.0));
listener.lookupTransform("/turtle2", “/turtle1”,
now, transform);
waitForTransform() 四个参数:
1.需要等待变换从坐标系turtle2
2.到坐标系turtle1
3.在now时间
4.超时时间,不要等待超过此最大持续时间
注意:使用ros::Time::now()是为了这个例子。通常这将是希望被转换的数据的时间戳。
所以waitForTransform()实际上会阻塞直到两个海龟之间的变换可用(这通常需要几毫秒)