前言


1、创建src功能包

在工作空间下的src目录上右键,点击create catkin package,在上方的框中输入创建的功能包名,比如timer_using,回车,再输入依赖:roscpp rospy std_msgs,再回车,功能包就创建完成了。
ROS中定时器的基本使用-LMLPHP

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

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

(1)主函数

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

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

(2)回调函数

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

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

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

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所以修改为以上形式
ROS中定时器的基本使用-LMLPHP

(2)编译运行

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

source ./devel/setup.bash
rosrun timer_using timer

以上是设置环境变量并运行,结果如下
ROS中定时器的基本使用-LMLPHP

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);
ROS中定时器的基本使用-LMLPHP
ROS中定时器的基本使用-LMLPHP

10-25 10:39