首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程和ros::ok()在ROS中不工作

线程和ros::ok()在ROS中不工作
EN

Stack Overflow用户
提问于 2022-07-07 15:17:31
回答 1查看 86关注 0票数 1

我有一个由std::线程执行的函数。我希望它能够工作,直到用户通过按Ctrl+C关闭运行roscore的终端为止。

代码语言:javascript
复制
void publish_camera_on_topic(std::vector<Camera> cameras, const std::vector<ros::Publisher> publishers, const int camera_index)
{ 
  
  int frameSize;
  BYTE *imagePtr;

  // frame id
  int frame_id = 0;

  cv_bridge::CvImage img_bridge;
  sensor_msgs::Image img_msg;

  while (ros::ok()) {
    // Grab and display a single image from each camera
    
    imagePtr = cameras[camera_index].getRawImage();

    frameSize = cameras[camera_index].getFrameSize();

    cameras[camera_index].createRGBImage(imagePtr,frameSize);

    unsigned char* pImage = cameras[camera_index].getImage();
    if (NULL != pImage) {

      Mat image(cameras[camera_index].getMatSize(), CV_8UC3, pImage, Mat::AUTO_STEP);

      // release asap
      cameras[camera_index].releaseImage(); 

      //cvtColor(image, image, CV_BGR2RGB,3);

      // publish on ROS topic
      std_msgs::Header header; // empty header
      header.seq = frame_id; // user defined counter
      header.stamp = ros::Time::now(); // time
      img_bridge = cv_bridge::CvImage(header, sensor_msgs::image_encodings::RGB8, image);
      img_bridge.toImageMsg(img_msg); // from cv_bridge to sensor_msgs::Image
      publishers[camera_index].publish(img_msg); // ros::Publisher pub_img = node.advertise<sensor_msgs::Image>("topic", queuesize);

    }

    // increase frame Id
    frame_id = frame_id + 1;
  }

  std::cout << "ROS closing for thread of camera " << camera_index << " recieved." << std::endl;

}

此外,我创建这样的线程:

代码语言:javascript
复制
 // image publisher 
  // for each camera create an publisher
  std::vector<ros::Publisher> publishers;
  for (size_t i = 0; i < cameras.size(); i++) {
    char topic_name[200];
    sprintf(topic_name, "/lumenera_camera_package/%d", i + 1);
    publishers.push_back(nh.advertise<sensor_msgs::Image>(topic_name, 10));
  }
  
  // work with each camera on a seprate thread
  std::vector<std::thread> thread_vector;
  for(size_t i=0; i < cameras.size(); i++) {
    thread_vector.push_back(std::thread(publish_camera_on_topic, cameras, publishers, i));
  }

  ros::spin();

  std::for_each(thread_vector.begin(), thread_vector.end(), [](std::thread &t){t.join(); });

  for(size_t i=0; i < cameras.size(); i++) {
    cameras[i].stopStreaming();
  }

  ROS_INFO("Node: [lumenera_camera_node] has been Ended.");

但是,当我在终端中按Ctrl+C并停止roscore时,线程将继续运行,并且ros::ok()的值不会改变。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-07 16:20:02

问题解决了。问题是ros::ok()不检查ROS母版。而不是这一行:

while (ros::ok()) { //do sth}

应使用这一行:

while (ros::ok() && ros::master::check()) { // do sth}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72900372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档