- 定时器初始化
rclcpp::TimerBase::SharedPtr timer_;
- ros2 定时器API定义文件
rclcpp::WallTimer< CallbackT >::SharedPtr rclcpp::Node::create_wall_timer ( std::chrono::duration< DurationRepT, DurationT > period,
CallbackT callback,
rclcpp::CallbackGroup::SharedPtr group = nullptr
) timer_类型
- 源码写法
public:
// 构造函数,有一个参数为节点名称
explicit ParametersBasicNode(std::string name) : Node(name) {
RCLCPP_INFO(this->get_logger(), "节点已启动:%s.", name.c_str());
/*略*/
timer_ = this->create_wall_timer(
500ms, std::bind(&ParametersBasicNode::timer_callback, this));
}
private:
rclcpp::TimerBase::SharedPtr timer_;
- 类型解读
-
rclcpp::TimerBase::SharedPtr timer_;声明了一个指向rclcpp::TimerBase对象的智能指针timer_。rclcpp::TimerBase是ROS 2中用于定时器的基类。
-
rclcpp::Node::create_wall_timer函数返回的类型是rclcpp::WallTimer::SharedPtr,也是一个指向rclcpp::WallTimer对象的智能指针。rclcpp::WallTimer是rclcpp::TimerBase的派生类,提供了使用系统壁钟的定时器功能。
所以,timer_的类型是rclcpp::TimerBase::SharedPtr,它指向rclcpp::TimerBase对象,而create_wall_timer()函数返回的类型是rclcpp::WallTimer::SharedPtr,它指向rclcpp::WallTimer对象。 -
疑惑? 类型不符为什么可以直接赋值使用
- 原因
-
在C++中,派生类对象可以强制转换为基类对象,反之则不行。因此,rclcpp::WallTimer对象可以被当作rclcpp::TimerBase对象使用。
-
rclcpp::WallTimer是rclcpp::TimerBase的派生类,因此rclcpp::WallTimer::SharedPtr是rclcpp::TimerBase::SharedPtr的子类,也就是说,可以将rclcpp::WallTimer::SharedPtr类型的智能指针赋值给rclcpp::TimerBase::SharedPtr类型的智能指针,而不需要进行任何显示类型转换。
在这段代码中,create_wall_timer()函数返回类型是rclcpp::WallTimer::SharedPtr,可以直接赋值给timer_,因为timer_的类型是rclcpp::TimerBase::SharedPtr。所以编译器会自动完成类型转换。