我正在尝试在gdb中调试ros代码,但是,当我在gdb中启动节点时,它总是会给我:
Starting program: /home/uav/catkin_ws/devel/lib/my_package/my_node
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-
gnu/libthread_db.so.1".
[New Thread 0x7ffff13b9700 (LWP 28089)]
[New Thread 0x7ffff0bb8700 (LWP 28090)]
[New Thread 0x7fffebfff700 (LWP 28091)]
[New Thread 0x7fffeb7fe700 (LWP 28096)]
[New Thread 0x7fffeaffd700 (LWP 28098)]
[New Thread 0x7fffea7fc700 (LWP 28121)]
并永久挂起。我之前没有看到此问题,也不清楚为什么它总是以多线程模式启动。我的主要功能如下:
int main(int argc, char** argv)
{
ros::init(argc, argv, "my_node");
ros::NodeHandle nodeHandle("~");
ros::Rate rate(10);
while (ros::ok()) {
// Do Something
ros::spinOnce();
rate.sleep();
}
return 0;
}
如何解决此问题?我在想应该将节点设置为单线程版本并对其进行调试,我应该怎么做?
答案 0 :(得分:0)
有两种谈论ROS中的多线程的方法。
在第一种情况下,当您使用时:
ros::NodeHandle nodeHandle("~");
ros::ok()
...
它向ROS主机发出一些请求。使用roscpp可以通过多线程处理网络通信。没有办法改变它。如果单线程对您非常重要,则应尝试 rospy , rosnodejs 或其他。
“ roscpp不会尝试为您的应用程序指定线程模型。这意味着,尽管roscpp可能会在后台使用线程进行网络管理,调度等,但它永远不会将其线程公开给您的应用程序。 ”
在第二种情况下,我们讨论使用多线程处理主题,服务和操作。默认情况下,主题是通过一个线程处理的。但是,如果发送更多的数据供节点处理,则可以使用多线程。
“ roscpp确实允许,如果需要的话,可以从任意数量的线程中调用回调。”
有关模式的详细信息,请参见: http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning