我在尝试在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);
// ...
}
思想?
答案 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})
希望有所帮助!
干杯,