2015-05-04 1 views
1

Я имею небольшую проблему, используя tf::TransformListener следующего вызова метода:издательского местоположения с помощью ТФА широковещательного

listener.lookupTransform("/base_footprint", "/odom", ros::Time(0), transform); 

Я получаю эту ошибку:

[ERROR] [1430761593.614566598, 10.000000000]: "base_footprint" passed to lookupTransform argument target_frame does not exist. 

Я думал, что это было потому, что я не использовал tf broacaster, но даже с ним проблема все еще остается. Что я делаю не так?

Код для слушателя:

tf::TransformListener listener; 
ros::Rate rate(1.0); 
listener.waitForTransform("/base_footprint", "/odom", ros::Time(0), ros::Duration(10.0)); 
tf::StampedTransform transform; 
try 
{    
    listener.lookupTransform("/base_footprint", "/odom", ros::Time(0), transform); 
    double x = transform.getOrigin().x(); 
    double y = transform.getOrigin().y(); 
    ROS_INFO("Current position: (%f , %f)\n",x,y); 
} 
catch (tf::TransformException &ex) 
{ 
    ROS_ERROR("%s",ex.what()); 
} 

Код для вещательной:

ros::Time current_time, last_time; 
tf::TransformBroadcaster odom_broadcaster; 

double x = 0.0; 
double y = 0.0; 
double th = 0.0; 

double vx = 0.1; 
double vy = -0.1; 
double vth = 0.1; 

current_time = ros::Time::now(); 
double dt = (current_time - last_time).toSec(); 
double delta_x = (vx * cos(th) - vy * sin(th)) * dt; 
double delta_y = (vx * sin(th) + vy * cos(th)) * dt; 
double delta_th = vth * dt; 

x += delta_x; 
y += delta_y; 
th += delta_th; 

geometry_msgs::Quaternion odom_quat = tf::createQuaternionMsgFromYaw(th); 

geometry_msgs::TransformStamped odom_trans; 
odom_trans.header.stamp = current_time; 
odom_trans.header.frame_id = "odom"; 
odom_trans.child_frame_id = "base_link"; 

odom_trans.transform.translation.x = x; 
odom_trans.transform.translation.y = y; 
odom_trans.transform.translation.z = 0.0; 
odom_trans.transform.rotation = odom_quat; 

//send the transform 
odom_broadcaster.sendTransform(odom_trans); 

last_time = current_time; 

ответ

2

Если это единственный ТФ издатель вы используете (например, не joint_state_publisher или других издателей), я предложите посмотреть на tf tutorials. Особенно к этому: robot setup.

Как вы можете найти here, lookupTransform(std::string &W, std::string &A, ros::Time &time, StampedTransform &transform) магазины в transform преобразование, которое приведет вас от кадра к кадру A W.

В вашем примере вы Тринг, чтобы получить преобразование от "/odom" к "/base_footprint", в то время как издатель вещает преобразование между "/base_link" и "/odom" (то есть "/base_footprint" не указано). Должно быть хорошо использовать одно и то же имя (например, оба "/base_link" или "/base_footprint", если они представляют тот же фрейм, что и я).

Кроме того, следует помнить, что в вашем издателю вы вещание преобразования из"/base_link"к"/odom", а не наоборот (как вы, возможно, захотите).

EDIT: Если вы используете модель .urdf для своего робота, добавьте его в свой вопрос или разместите дерево tf.

1

Предлагаю запустить следующую команду на вашем терминале, чтобы убедиться, что ваши кадры правильные и что их транслируют. Когда мы запускаем вашего слушателя, вы должны иметь возможность графически видеть, как вы \ base_footprint преобразуетесь в \ odom:

rosrun rqt_tf_tree rqt_tf_tree 

 Смежные вопросы

  • Нет связанных вопросов^_^