ROS tf.transform 找不到实际存在的帧(可以用rosrun tf tf_echo 跟踪)
ROS tf.transform cannot find a frame which actually exists (can be traced with rosrun tf tf_echo)
有人在使用 ROS 时遇到过以下行为吗:tf.lookupTransform("map", "base_link", ros::Time(0), transform);
怎么可能
告诉你:"base_link" passed to lookupTransform argument target_frame does not exist
但如果我输入:
rosrun tf tf_echo base_link map
At time 1549633095.937
- Translation: [-0.005, 0.020, -0.129]
- Rotation: in Quaternion [0.033, 0.063, 0.002, 0.997]
in RPY (radian) [0.066, 0.127, 0.009]
我可以看到框架不仅存在,而且在 map
和 base_link
之间存在有效的转换?
我对这种奇怪的行为一无所知。任何帮助都将非常受欢迎。事实上,该程序可以在我的笔记本电脑上运行,但不能在英特尔 NUC 上运行。
下面给出了完整的代码(实际上我在创建 costmap_2d::costmap2DROS 时遇到了分段错误,看起来是因为 tf.transform 失败了):
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <costmap_2d/costmap_2d_ros.h>
int main(int argc, char **argv) {
ros::init(argc, argv, "hector_exploration_node");
ros::NodeHandle nh;
tf::TransformListener tf;
tf::StampedTransform transform;
try{
tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
std::cout << "transform exist\n";
}
catch (tf::TransformException ex){
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
}
std::cout << "before costmap\n";
costmap_2d::Costmap2DROS costmap("global_costmap", tf);
costmap.start();
ros::Rate rate(10);
while (ros::ok())
ros::spin();
return 0;
}
您尝试在创建 tf 侦听器后立即执行转换,这通常是一种不好的做法,原因如下:承载有关最近转换的所有信息的侦听器缓冲区实际上是空的。因此,查找缓冲区的任何转换都找不到它需要的帧。最好在创建侦听器后等待一段时间,以便缓冲区可以填满。但是 tf 不只是休眠,它有自己的实现来等待您要求的帧:waitForTransform. It can be used as explained here。因此,您只需按如下方式扩展 try
块:
try{
tf.waitForTransform("/base_link", "/map", ros::Time(0), ros::Duration(3.0));
tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
std::cout << "transform exist\n";
}
有人在使用 ROS 时遇到过以下行为吗:tf.lookupTransform("map", "base_link", ros::Time(0), transform);
告诉你:"base_link" passed to lookupTransform argument target_frame does not exist
但如果我输入:
rosrun tf tf_echo base_link map
At time 1549633095.937
- Translation: [-0.005, 0.020, -0.129]
- Rotation: in Quaternion [0.033, 0.063, 0.002, 0.997]
in RPY (radian) [0.066, 0.127, 0.009]
我可以看到框架不仅存在,而且在 map
和 base_link
之间存在有效的转换?
我对这种奇怪的行为一无所知。任何帮助都将非常受欢迎。事实上,该程序可以在我的笔记本电脑上运行,但不能在英特尔 NUC 上运行。
下面给出了完整的代码(实际上我在创建 costmap_2d::costmap2DROS 时遇到了分段错误,看起来是因为 tf.transform 失败了):
#include <ros/ros.h>
#include <tf/transform_listener.h>
#include <costmap_2d/costmap_2d_ros.h>
int main(int argc, char **argv) {
ros::init(argc, argv, "hector_exploration_node");
ros::NodeHandle nh;
tf::TransformListener tf;
tf::StampedTransform transform;
try{
tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
std::cout << "transform exist\n";
}
catch (tf::TransformException ex){
ROS_ERROR("%s",ex.what());
ros::Duration(1.0).sleep();
}
std::cout << "before costmap\n";
costmap_2d::Costmap2DROS costmap("global_costmap", tf);
costmap.start();
ros::Rate rate(10);
while (ros::ok())
ros::spin();
return 0;
}
您尝试在创建 tf 侦听器后立即执行转换,这通常是一种不好的做法,原因如下:承载有关最近转换的所有信息的侦听器缓冲区实际上是空的。因此,查找缓冲区的任何转换都找不到它需要的帧。最好在创建侦听器后等待一段时间,以便缓冲区可以填满。但是 tf 不只是休眠,它有自己的实现来等待您要求的帧:waitForTransform. It can be used as explained here。因此,您只需按如下方式扩展 try
块:
try{
tf.waitForTransform("/base_link", "/map", ros::Time(0), ros::Duration(3.0));
tf.lookupTransform("/base_link", "/map", ros::Time(0), transform);
std::cout << "transform exist\n";
}