Я пишу узел ros с c++ и вам нужно задержать один вызов метода в определенное время. Каков хороший способ сделать это, не блокируя узел для этой задержки?
sehe использовал подход C++, вместо этого существуют два способа сделать это в ROS.
Первый - проще реализовать метод - это использовать класс Rate
. В разделе 2 этого руководства разъясняется, как его использовать. Однако, как вы можете видеть, это не лучший выбор.
Примечание. Обычно рекомендуется использовать таймеры вместо Rate.
Timers
- это правильный способ подождать некоторое время, выполняя другие действия. В этом простом учебнике объясняется, как их использовать.
ros::Timer ros::NodeHandle::createTimer(ros::Duration period, <callback>, bool oneshot = false);
В вашем случае, если вы хотите выполнить метод только один раз, установите для параметра oneshot
bool значение true.
У вас есть два варианта:
у вас есть другие потоки или процессы, которые могут прогрессировать. Просто скройте свою нить немного:
std::this_thread::sleep_for(std::chrono::milliseconds(150));
у вас есть другие задачи, которые необходимо продвигать в одном потоке. Посмотрите на асинхронное выполнение, например, с Boost Asio