rclcpp::Rate
是ROS 2中用于控制循环执行速度的工具。它允许你指定一个循环应该以多快的频率执行,通常用于控制循环的更新率或发布率。rclcpp::Rate
对象在每次迭代结束时调用其 sleep()
方法,以确保循环以设定的频率运行。
用法
-
创建
rclcpp::Rate
对象:- 你可以创建一个
rclcpp::Rate
对象,并为其构造函数提供一个频率(以赫兹为单位)。例如,rclcpp::Rate(1.0)
表示每秒1次,rclcpp::Rate(10.0)
表示每秒10次。
- 你可以创建一个
-
在循环中使用
sleep()
方法:- 在循环体的末尾调用
sleep()
方法,该方法将使当前线程休眠直到达到下一个循环迭代的时间点。
- 在循环体的末尾调用
示例代码
以下是一个使用 rclcpp::Rate
控制循环频率的简单示例:
#include "rclcpp/rclcpp.hpp"
class MyNode : public rclcpp::Node
{
public:
MyNode() : Node("my_node"), count_(0) {}
void run()
{
// 创建一个每秒10次的Rate对象
rclcpp::Rate rate(10);
while (rclcpp::ok() && count_ < 10)
{
RCLCPP_INFO(this->get_logger(), "count: %d", count_++);
// 调用sleep()以保持10Hz的循环频率
rate.sleep();
}
}
private:
int count_;
};
int main(int argc, char ** argv)
{
rclcpp::init(argc, argv);
auto node = std::make_shared<MyNode>();
node->run();
rclcpp::shutdown();
return 0;
}
在这个例子中,MyNode
类有一个 run
方法,它创建了一个 rclcpp::Rate(10)
对象,用于控制循环的频率为每秒10次。在循环中,每次迭代都会打印计数器的值,然后调用 rate.sleep()
来暂停当前线程,直到下一个10Hz的时间点。
注意事项
-
确保循环工作量与频率匹配:
- 循环中的工作量应该在指定的频率内完成。如果工作量太大,导致循环迭代时间超过了设定的频率间隔,
sleep()
方法将不会休眠,这可能导致实际的循环频率高于预期。
- 循环中的工作量应该在指定的频率内完成。如果工作量太大,导致循环迭代时间超过了设定的频率间隔,
-
处理异常情况:
- 在某些情况下,如异常或长时间操作,可能需要更精细的控制。在这些情况下,可能需要手动计算休眠时间,而不是依赖
rclcpp::Rate
。
- 在某些情况下,如异常或长时间操作,可能需要更精细的控制。在这些情况下,可能需要手动计算休眠时间,而不是依赖
-
线程安全:
rclcpp::Rate
本身是线程安全的,但在多线程环境中使用时,确保循环中的操作也是线程安全的。
rclcpp::Rate
是一个简单而强大的工具,用于在ROS 2中控制循环的执行频率,非常适合用于定时任务和周期性操作。