ROS中定时器的基本使用


前言

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


1、创建src功能包

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

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所以修改为以上形式
在这里插入图片描述

(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);
在这里插入图片描述
在这里插入图片描述

  • 39
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值