文章目录
前言
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);
版权归原作者 舟同学的博客 所有, 如有侵权,请联系我们删除。