0


ROS中定时器的基本使用

文章目录


前言

ROS中有一个功能叫做定时器,这次我们来了解一下,使用定时器实现每秒在终端输出一次数字,且每次输出后值就递增一次


1、创建src功能包

在工作空间下的src目录上右键,点击create catkin package,在上方的框中输入创建的功能包名,比如timer_using,回车,再输入依赖:roscpp rospy std_msgs,再回车,功能包就创建完成了。
在这里插入图片描述

2、新建cpp文件实现定时器功能

在功能包下面的src目录下右键新建文件,命名随意,这里为timer.cpp,就生成了一个cpp文件。然后编写代码,本文利用定时器实现每秒在终端输出一次递增的数字,主要有节点初始化,添加节点句柄,设置定时器,回旋函数和回调函数几个部分

(1)主函数

intmain(int argc,char*argv[]){
    ros::init(argc,argv,"timer_use");//节点初始化
    ros::NodeHandle nh;//添加节点句柄
    ros::Timer timer= nh.createTimer(ros::Duration(1),callback1);//定时器
    ros::spin();//回旋函数return0;}

首先对节点进行初始化,节点名称可以随意取,然后添加节点句柄,使用其中的createTimer函数创建定时器,频率Duration设置为1s,使用回调函数callback1准备输出信息,然后利用回旋函数的特性使得回到函数可以一直执行而不会结束

(2)回调函数

int count=0;voidcallback1(const ros::TimerEvent& event){//回调函数ROS_INFO("%d",count);
    count++;}

callback1函数传入了一个参数TimerEvent是时间事件,对应主函数中的1s,然后函数中用ROS_INFO打印count的值,每输出完一次count就自增一次。

完整代码

#include"ros/ros.h"int count=0;voidcallback1(const ros::TimerEvent& event){//回调函数ROS_INFO("%d",count);
    count++;}intmain(int argc,char*argv[]){
    ros::init(argc,argv,"timer_use");//节点初始化
    ros::NodeHandle nh;//添加节点句柄
    ros::Timer timer= nh.createTimer(ros::Duration(1),callback1);//定时器
    ros::spin();//回旋函数return0;}

3、修改配置文件并运行

(1)修改CMakeLists.txt

打开CMakeLists.txt文件,在136行和149行找到add_executable和target_link_libraries去掉注释,改为

add_executable(timer src/timer.cpp)

target_link_libraries(timer
  ${catkin_LIBRARIES}
)

这里的${PROJECT_NAME}_node对应创建的cpp文件名,前面命名为timer.cpp所以修改为以上形式
在这里插入图片描述

(2)编译运行

按Ctrl+shift+B进行编译,编译完成后点击终端旁边的“+号”新建一个终端,输入roscore启动ROS master,再新增一个终端,输入

source ./devel/setup.bash
rosrun timer_using timer

以上是设置环境变量并运行,结果如下
在这里插入图片描述

4、定时器createTimer函数参数

把鼠标放置在createTimer函数上,可以看到它的形式是这样:

ros::Timer ros::NodeHandle::createTimer(ros::Duration period, const ros::TimerCallback &callback, bool oneshot = false, bool autostart = true)。

前两个参数是时间周期和回调函数已经介绍过,bool oneshot = false, bool autostart = true表示是否只执行一次定时器函数,是否自启动定时器函数,默认情况下不需要在函数中填写后两个参数
当bool oneshot设置为true时,运行cpp文件将只会输出一次消息,ros::Timer timer= nh.createTimer(ros::Duration(1),callback1,true);
在这里插入图片描述
在这里插入图片描述


本文转载自: https://blog.csdn.net/qq_45950023/article/details/127496321
版权归原作者 舟同学的博客 所有, 如有侵权,请联系我们删除。

“ROS中定时器的基本使用”的评论:

还没有评论