Как заставить ROS работать в однопоточном режиме - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь отладить мой код 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 Ответ

0 голосов
/ 08 марта 2019

Существует два способа говорить о многопоточности в 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...