1 如果非要使用 ros::Time::now()
ros::Time now = ros::Time::now();
listener.waitForTransform("/turtle2", "/turtle1", now, ros::Duration(3.0));
listener.lookupTransform("/turtle2", "/turtle1", now, transform);
- waitForTransform() 包含四个参数:
1)Wait for the transform from this frame…
2)… to this frame, 变换目标坐标系
3)此时now
4)timeout超时设置:等待最大时间 don’t wait for longer than this maximum duration - 所以waitforTransform()实际上会一直block阻塞,直到两个海龟之间的转换可用(这通常需要几毫秒),或者—如果转换不可用—直到超时。
2 使用历史的tf-tf time travel
- 现在,不要让第二只乌龟去第一只乌龟现在所在的地方,而是让第二只乌龟去第一只乌龟5秒钟前所在的地方:
1)错误写法
try{
ros::Time past = ros::Time::now() - ros::Duration(5.0);
listener.waitForTransform("/turtle2", "/turtle1",
past, ros::Duration(1.0));
listener.lookupTransform("/turtle2", "/turtle1",
past, transform);
- 结果turtle2失控地四处乱跑,因为我们问tf的是,“5秒前/turtle1相对于5秒前/turtle2的姿势是什么?”这意味着我们正在根据第二只乌龟5秒钟前的位置以及第一只乌龟5秒钟前的位置来控制它。我们真正想问的是,“现在的turtle2相对5s前的turtle1的位置是什么?”.
2)正确写法
try{
ros::Time now = ros::Time::now();
ros::Time past = now - ros::Duration(5.0);
listener.waitForTransform("/turtle2", now,
"/turtle1", past,
"/world", ros::Duration(1.0));
listener.lookupTransform("/turtle2", now,
"/turtle1", past,
"/world", transform);
- 只有3个报错,是因为tf保存到缓冲需要一定时间,而此时listener接收不到/turtle2后,接受到后不再报错,不影响后续操作.