如何强制ROS在单线程模式下运行

时间:2019-03-06 20:38:40

标签: c++ gdb ros

我正在尝试在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;
}

如何解决此问题?我在想应该将节点设置为单线程版本并对其进行调试,我应该怎么做?

1 个答案:

答案 0 :(得分:0)

有两种谈论ROS中的多线程的方法。

  1. 整个节点
  2. callbackQueue。

在第一种情况下,当您使用时:

ros::NodeHandle nodeHandle("~");
ros::ok()
...

它向ROS主机发出一些请求。使用roscpp可以通过多线程处理网络通信。没有办法改变它。如果单线程对您非常重要,则应尝试 rospy rosnodejs 或其他。

  

roscpp不会尝试为您的应用程序指定线程模型。这意味着,尽管roscpp可能会在后台使用线程进行网络管理,调度等,但它永远不会将其线程公开给您的应用程序。

在第二种情况下,我们讨论使用多线程处理主题,服务和操作。默认情况下,主题是通过一个线程处理的。但是,如果发送更多的数据供节点处理,则可以使用多线程。

  

roscpp确实允许,如果需要的话,可以从任意数量的线程中调用回调。

有关模式的详细信息,请参见: http://wiki.ros.org/roscpp/Overview/Callbacks%20and%20Spinning