Как переиздать одометрию в другом кадре?

есть навигация Odometry, но ее как-то нет в корпусе робота. Одометрия публикуется в мировом фрейме, так что это неверно. Поэтому мне нужно преобразовать его в раму тела робота так, как должно быть. Итак, я попытался повторно опубликовать линейную скорость по оси x в раме тела робота, просто чтобы проверить, что Im на правильном пути, но код не работает. Вот узел ROS

      #include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>

float linear_x;
ros::Publisher odom_pub;

void poseCallback(const nav_msgs::OdometryConstPtr& msg){

    linear_x = (msg->twist.twist.linear.x );
    nav_msgs::Odometry pose_gt_frame;

        pose_gt_frame.header.frame_id = "world";

    //set the velocity
    pose_gt_frame.child_frame_id = "rexrov2/base_link";
    pose_gt_frame.twist.twist.linear.x = linear_x;

    //publish the message
    odom_pub.publish(pose_gt_frame);

}

int main(int argc, char** argv){
  ros::init(argc, argv, "my_tf_broadcaster");

  ros::NodeHandle node;
  ros::Subscriber sub = node.subscribe("/rexrov2/pose_gt", 10, &poseCallback);
  ros::spin();
  return 0;
};

При запуске кода я получил ошибку

      [FATAL] [1635340917.678039503, 15.652000000]: ASSERTION FAILED
    file = /opt/ros/melodic/include/ros/publisher.h
    line = 106
    cond = false
    message = 
[FATAL] [1635340917.680256176, 15.654000000]: Call to publish() on an invalid Publisher
[FATAL] [1635340917.680299807, 15.654000000]:

А еще статический фрейм в файле запуска не помог. Что может быть не так? Любая помощь? Спасибо

1 ответ

Вы получаете сообщение об ошибке, потому что, хотя вы объявили переменную издателя, вы еще не инициализировали ее.

      int main(int argc, char** argv){
  ros::init(argc, argv, "my_tf_broadcaster");

  ros::NodeHandle node;
  odom_pub = node.advertise<nav_msgs::Odometry>("some_odom_topic", 5);
  ros::Subscriber sub = node.subscribe("/rexrov2/pose_gt", 10, &poseCallback);
  ros::spin();
  return 0;
};
Другие вопросы по тегам