ros2时间管理-Rate和Timer

16 篇文章 1 订阅
13 篇文章 7 订阅

ROS2编程的时间处理包括如ros1的rate睡眠,当然在ros2中你会经常用到Timer计时器系统,类似于单片机的定时器中断一类的软件计时器。

Rate:
这个我们并不陌生,不管是在前面章节还是在ros1中都大量使用,可以让我们在程序中进行睡眠。但是ros2函数API有一点改变:

int main(int argc, char** argv){
    rclcpp::init(argc, argv);
    //...

	//创建一个10HZ的睡眠延时
    rclcpp::WallRate loop_rate(10.0);
    while (rclcpp::ok())
    {
        /* you code */

        loop_rate.sleep();
    }
}

我们可以看出并没有太大的变化,故不再讲解。
Timer:
1.执行定时处理
2.被实现为节点功能,主要用于定期处理节点
第二点呢,我也并没有太明白,详细请看rclcppAPI
反正就把他当做和单片机定时器一样的软件定时器中断来用就行了。!
下面我们就使用ros2 :Timer进行编程来计算系统时间:
首先进入工作空间src文件夹下创建功能包:

ln@ln-pctogo:~/ros2_ws/src$ ros2 pkg create tutorials_timer --build-type ament_cmake --dependencies rclcpp std_msgs

然后进入功能包src文件夹创建time_piece.cpp文件,代码如下:

#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include <time.h>
#include <sstream>

using namespace std;

stringstream ss;
int tim1[3]={0};
rclcpp::Publisher<std_msgs::msg::String>::SharedPtr pub1;
rclcpp::Node::SharedPtr node_handle = nullptr;

//timer1回调处理函数
//功能:在初始时间基础上进行计算,将计算所得的时间pub到话题“time1”上
void timer1_callback()
{
	static int i = 0;
	auto message = std_msgs::msg::String();
	i++;
	//250ms中断四次加一秒
	if(i>=4){
		i=0;
		tim1[2]++;
		if(tim1[2]>=60){
			tim1[2]=0;
			tim1[1]++;
			if(tim1[1]>=60){
				tim1[1]=0;
				tim1[0]++;
				if(tim1[0]>=24)tim1[0]=0;
			}
		}
	}else{

	}
	ss.str("");
	ss.clear();
	ss<<"timer1   - "<<tim1[0]<<":"<<tim1[1]<<":"<<tim1[2];
	message.data = ss.str();
	//pub
	pub1->publish(message);
}
//timer2回调处理函数
//功能:获取系统时间并将其打印到终端。
void timer2_callback()
{
	//取得系统时间
	time_t tt;
	time( &tt );
	tt = tt + 8*3600;  // transform the time zone
	tm* t= gmtime( &tt );
	//打印到终端上
	cout<<"current time   - "<<t->tm_hour<<":"<<t->tm_min<<":"<<t->tm_sec<<endl;
}

int main(int argc, char *argv[])
{
    rclcpp::init(argc, argv);
	//初始化函数
	node_handle = rclcpp::Node::make_shared("time_piece");
	//发布者发布“time1”话题
	pub1= node_handle->create_publisher<std_msgs::msg::String>("time1",10);

	//时间及处理
	time_t tt;
    time( &tt );
    tt = tt + 8*3600;  // transform the time zone
    tm* t= gmtime( &tt );
	ss<<"current time   - "<<t->tm_hour<<":"<<t->tm_min<<":"<<t->tm_sec;
	cout<< ss.str() <<endl;
	ss.str("");
	ss.clear();
	//存储开始时间
	tim1[0]=t->tm_hour;
	tim1[1]=t->tm_min;
	tim1[2]=t->tm_sec;

	//创建两个定时器
	rclcpp::TimerBase::SharedPtr timer1,timer2;

	//定时器timer1初始化,250ms中断,回调函数timer1_callback
    timer1 = node_handle->create_wall_timer(250ms,timer1_callback);
	//定时器timer2初始化,100ms中断,回调函数timer2_callback
    timer2 = node_handle->create_wall_timer(100ms,timer2_callback);

	//回调处理函数
    rclcpp::spin(node_handle);
	//关闭节点
	rclcpp::shutdown();
	return 0;
}

代码中最重要的就是:

	//创建两个定时器
	rclcpp::TimerBase::SharedPtr timer1,timer2;
	//定时器timer1初始化,250ms中断,回调函数为timer1_callback
    timer1 = node_handle->create_wall_timer(250ms,timer1_callback);
	//定时器timer2初始化,100ms中断,回调函数为timer2_callback
    timer2 = node_handle->create_wall_timer(100ms,timer2_callback);

然后在cmake文件添加编译规则:

add_executable(time_piece src/time_piece.cpp)
ament_target_dependencies(time_piece rclcpp std_msgs)

    install(TARGETS
    time_piece
    EXPORT export_${PROJECT_NAME}
    DESTINATION lib/${PROJECT_NAME})

同样的colcon build编译source一下。
现在就可以运行我们的钟表节点

ln@ln-pctogo:~$ ros2 run tutorials_timer time_piece 
current time   - 16:43:53
current time   - 16:43:53
current time   - 16:43:53
current time   - 16:43:53
current time   - 16:43:53
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:54
current time   - 16:43:55
current time   - 16:43:55

我们看一下话题/time1的信息

ln@ln-pctogo:~$ ros2 topic echo /time1 
data: timer1   - 16:44:8
---
data: timer1   - 16:44:8
---
data: timer1   - 16:44:8
---
data: timer1   - 16:44:9
---
data: timer1   - 16:44:9
---
data: timer1   - 16:44:9
---
data: timer1   - 16:44:9
---
data: timer1   - 16:44:10

由于开启时间不同所以打印有所偏差,我们可以看一下截图虽然我们计算的时间还是有一点点延迟(主要是获取初始系统时间并不是正好在整秒)在这里插入图片描述

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值