ROS2中怎样在循环中使用rate.sleep()
时间: 2024-11-15 14:34:08 浏览: 73
在Robot Operating System (ROS) 2中,`rate.sleep()`是一个函数,用于控制节点的执行速率。当你在一个无限循环中想要以特定频率(Hz)运行任务时,可以使用`rclcpp::Rate`类来实现这个功能。以下是一个简单的例子:
```cpp
#include <rclcpp/rclcpp.hpp>
#include <rclcpp/time/time.hpp>
class MyNode : public rclcpp::Node
{
public:
explicit MyNode(std::string node_name)
: Node(node_name),
rate_(1.0) // 设置循环周期为1 Hz
{
}
private:
void spin_once()
{
auto now = this->get_clock()->now();
auto future = now + this->rate_.to_traits<double>() * rclcpp::Duration::nanoseconds(1);
while (this->get_clock()->now() < future)
{
// 这里放置你需要循环执行的任务
std::this_thread::sleep_for(std::chrono::seconds(1));
RCLCPP_INFO(get_logger(), "Task executed");
}
}
rclcpp::Rate rate_;
};
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = MyNode("my_node");
while (rclcpp::ok()) // 结束前一直保持循环
{
node.spin_once();
}
rclcpp::shutdown();
return 0;
}
```
在这个例子中,`spin_once`函数会在指定的时间间隔后唤醒并执行一次。如果任务处理得比预定时间短,`sleep_for`会等待剩余的时间。这样就可以保证每个`rate.sleep()`周期内执行一次循环内的任务。
阅读全文