为什么NodeHandle会挂起?

时间:2017-02-15 01:51:53

标签: ros

我在尝试在Indigo中创建订阅者时遇到问题。我在类中有一个shared_ptr来保存NodeHandle对象。我这样做是为了让NodeHandle可以在其他类成员中使用。问题是当线程启动时,它似乎挂在对MyClass构造函数中的NodeHandle对象的make_shared调用上,因为它永远不会到达下一行。

class MyClass
{
    private:
        std::shared_ptr<ros::NodeHandle> nh;
        std::map<std::string, std::string> remap;
    // ...
};

MyClass::MyClass()
{
    // remap is empty
    ros::init(remap, "my_node");  

    nh = make_shared<ros::NodeHandle>();

    cout << "does not reach this line" << endl;
} 

int MyClass::run()
{
    // ...
}

我启动线程所以......

{
    // ...
    myobj = make_shared<MyClass>();
    my_thread = thread(&MyClass::run, myobj);
    // ...
}

思想?

2 个答案:

答案 0 :(得分:2)

看来问题是由于我自己的升压记录系统到位而没有使用ROS记录器(因为它看起来与ros :: NodeHandle无关,但可能在下面),因此很难找到它。 。我会注释掉我的整个代码库并开始添加以查看ros :: NodeHandle何时运行,并且在删除我的记录器并将其添加回来时,我会看到它在运行和挂起之间的区别。

答案 1 :(得分:0)

嗯,这是一个使用Boost :: make_shared作为nodehandle的例子。 请注意,它使用ros::NodeHandlePtr,一个已经存在的Boost共享指针,不使用“std :: make_shared”。

这可能并没有真正回答这个问题,但我建议采用另一种方式来使用升级库。

#include <ros/ros.h>
#include <std_msgs/Empty.h>
#include <boost/thread/thread.hpp>

void do_stuff(int* publish_rate)
{
  ros::NodeHandlePtr node = boost::make_shared<ros::NodeHandle>();
  ros::Publisher pub_b = node->advertise<std_msgs::Empty>("topic_b", 10);

  ros::Rate loop_rate(*publish_rate);
  while (ros::ok())
  {
    std_msgs::Empty msg;
    pub_b.publish(msg);
    loop_rate.sleep();
  }
}

int main(int argc, char** argv)
{
  int rate_b = 1; // 1 Hz

  ros::init(argc, argv, "mt_node");

  // spawn another thread
  boost::thread thread_b(do_stuff, &rate_b);

  ros::NodeHandlePtr node = boost::make_shared<ros::NodeHandle>();
  ros::Publisher pub_a = node->advertise<std_msgs::Empty>("topic_a", 10);

  ros::Rate loop_rate(10); // 10 Hz
  while (ros::ok())
  {
    std_msgs::Empty msg;
    pub_a.publish(msg);
    loop_rate.sleep();

    // process any incoming messages in this thread
    ros::spinOnce();
  }

  // wait the second thread to finish
  thread_b.join();

  return 0;
} 

如果您遇到CMakeLists的问题,请点击:

cmake_minimum_required(VERSION 2.8.3)
project(test_thread)

find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
)

find_package(Boost COMPONENTS thread REQUIRED)
include_directories(${Boost_INCLUDE_DIR})

catkin_package(CATKIN_DEPENDS roscpp rospy std_msgs)
include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(thread src/thread_test.cpp)
target_link_libraries(thread ${catkin_LIBRARIES} ${BOOST_LIBRARIES})

希望有所帮助!

干杯,