В чем разница между областью действия функции и класса - PullRequest
0 голосов
/ 29 марта 2019

Я использовал ros и пытался ввести определения подписчиков и серверов в действие снаружи.Тогда обратный вызов не запустился.Функция spin() не работает.Но я часто вижу, как другие помещают определения серверов в класс, и обратный вызов будет работать.Так в чем же разница между двумя сценами?

Это будет работать

int main(int argc, char **argv) 
{

  ros::init(argc, argv, "cood_tran");
  ros::NodeHandle nh;

    std::cout << "coodTran" << std::endl;
  target_obj = "None";
  ros::param::get("target", target_obj);

  ros::Subscriber ros_coord_pixel_sub =
  nh.subscribe("/darknet_ros/bounding_boxes", 1, darknetCallback);

  ros::Subscriber point_cloud_sub =
  nh.subscribe("camera/depth_registered/points", 1, pointCouldCallback);///camera/depth_registered/points  /camera/depth_registered/points<->color_optical

  ros::ServiceServer location_server =
  nh.advertiseService("location_srv", location);


  ros::spin();
  return 0;
}

Это не будет работать

int main(int argc, char **argv) 
{

  ros::init(argc, argv, "cood_tran");
  ros::NodeHandle nh;

  coodTran(nh);


  ros::spin();
  return 0;
}

void coodTran(ros::NodeHandle nh)
{

  std::cout << "coodTran" << std::endl;
  target_obj = "None";
  ros::param::get("target", target_obj);

  ros::Subscriber ros_coord_pixel_sub =
  nh.subscribe("/darknet_ros/bounding_boxes", 1, darknetCallback);

  ros::Subscriber point_cloud_sub =
  nh.subscribe("camera/depth_registered/points", 1, pointCouldCallback);///camera/depth_registered/points  /camera/depth_registered/points<->color_optical

  ros::ServiceServer location_server =
  nh.advertiseService("location_srv", location);

}

Это будет работать:

#include <darknet_ros/YoloObjectDetector.hpp>
#include <ros/ros.h>

int main(int argc, char** argv) {
  ros::init(argc, argv, "darknet_ros");
  ros::NodeHandle nodeHandle("~");

  darknet_ros::YoloObjectDetector yoloObjectDetector(nodeHandle);

  ros::spin();
  return 0;
}

1 Ответ

0 голосов
/ 29 марта 2019

Во втором фрагменте вы передаете NodeHandle по значению. Итак, в coodTran вы меняете копию оригинала. Попробуйте передать его по ссылке так:

    void coodTran(ros::NodeHandle& nh) {
       nh.sunscribe();
    }

Или передать указатель на исходный объект:

    void coodTran(ros::NodeHandle* nh) {
       nh->sunscribe();
    }

Или создать узел в функции и вернуть дескриптор:

    ros::NodeHandle coodTran() {
        ros::NodeHandle nh;
        nh->sunscribe();
        return nh;
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...