Как заставить ROS работать в однопоточном режиме

#c #gdb #ros

#c #gdb #ros

Вопрос:

Я пытаюсь отладить свой ros-код в gdb, однако, когда я запускаю узел в 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. Ознакомьтесь с документацией: wiki.ros.org/roscpp/Overview/Callbacks and Spinning — ваш код уже однопоточный.

2. Интересная проблема заключается в том, что он каким-то образом все еще переходит в многопоточный режим в gdb

Ответ №1:

Есть два способа поговорить о многопоточности в ROS.

  1. Весь узел
  2. Очередь обратного вызова.

В первом случае, когда вы используете:

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

Он выполняет некоторые запросы к ведущему ROS. А с roscpp сетевое взаимодействие обрабатывается с помощью многопоточности. Изменить это невозможно. Если для вас очень важна однопоточность, вам следует попробовать rospy, rosnodejs или другие.

«roscpp не пытается указать потоковую модель для вашего приложения. Это означает, что, хотя roscpp может использовать потоки за кулисами для управления сетью, планирования и т.д., он никогда не предоставит свои потоки вашему приложению.«

Во втором случае мы говорим об обработке тем, сервисов и действий с помощью многопоточности. По умолчанию тема обрабатывается одним потоком. Но если вы отправляете больше данных, чтобы ваш узел мог их обработать, вы можете использовать многопоточность.

«roscpp, однако, разрешает вызывать ваши обратные вызовы из любого количества потоков, если вы этого хотите.«

Подробности о режиме см.:http://wiki.ros.org/roscpp/Overview/Callbacks and Spinning

Комментарии:

1. Спасибо за ваш ответ, но я не чувствую, что вы отвечаете на мой вопрос.