Table of Contents
1.time和duration
roscpp里有两种时间的表示方法, 一种是时刻( ros::Time) , 一种是时长( ros::Duration) 。 无论是Time还是Duration都具有相同的表示方法.Time/Duration都由秒和纳秒组成。 一般来说第一个参数是秒,第二个参数是纳秒.要使用Time和Duration, 需要 #include<ros/time.h> 和 #include<ros/duration.h>
Time和Duration表示的概念并不相同, Time指的是某个时刻, 而Duration指的是某个时段, 尽管他们的数据结构都相同, 但是用在不同的场景下。
ROS为用户重再了Time和Duration之间的加减法运算,但是要注意的是,没有Time+Time的做法.
程序举例:
//ROS头文件
#include <ros/ros.h>
//测试timer
#include<ros/time.h>
#include<ros/duration.h>
int main(int argc, char **argv)
{
//用于解析ROS参数,第三个参数为本节点名 不允许同时存在相同名称的节点
ros::init(argc, argv, "timer");
//实例化句柄,初始化node
//创建 ros::NodeHandle 对象, 也就是节点的句柄, 它可以用来创建Publisher、 Subscriber 以及做其他事情。
ros::NodeHandle n;
//################################################################################3
//获取当前时间
ros::Time begin = ros::Time::now();
//5是秒 20000000是纳秒 at_some_time1 和at_some_time2是两个重载的构造函数
ros::Time at_some_time1(5,200000000); //5.2s
ros::Time at_some_time2(5.2) ;//同上, 重载了float类型和两个uint类型的构造函数
//one_hour(,)第一个参数单位是秒 第二个参数是纳秒
ros::Duration one_hour(60*60,0); //1h
double secs1 = at_some_time1.toSec();//将Time转为double型时间
double secs3 = at_some_time2.toSec();
double secs2 = one_hour.toSec();//将Duration转为double型时间
ROS_INFO("secs1 is %f ",secs1);
ROS_INFO("secs2 is %f ",secs2);
ROS_INFO("secs3 is %f ",secs3);
//t1是5.5s前的时刻, Time加减Duration返回都是Time
ros::Time t1 = begin - ros::Duration(5.5);
//t2是当前时刻往后推3.3s的时刻
ros::Time t2 = begin + ros::Duration(3.3);
//从t1到t2的时长, 两个Time相减返回Duration类型
ros::Duration d1 = t2 - t1;//
//两个Duration相减, 还是Duration
ros::Duration d2 = d1 -ros::Duration(0,300);
ROS_INFO("d2 is %f ",d2);
//################################################################################
//定义发布的频率 每隔1秒更新一次
ros::Rate loop_rate(1.0);
//循环发布msg
//一旦发生异常ros::ok()就会返回false,跳出循环.
while (ros::ok())
{
//ROS_INFO 用来打印消息 类似 Print()/cout函数
ROS_INFO("this is a test ");
//以1Hz的频th
//根据前面定义的频率, sleep 1s
loop_rate.sleep();//根据前面的定义的loop_rate,设置1s的暂停
}
return 0;
}
2.sleep
通常在机器人任务执行中可能有需要等待的场景, 这时就要用到sleep功能, roscpp中提供了两种sleep的方法:
1.通过loop_rate对象调用sleep()方法
//定义发布的频率 每隔1秒更新一次
ros::Rate loop_rate(1.0);
//循环发布msg
//一旦发生异常ros::ok()就会返回false,跳出循环.
while (ros::ok())
{
//ROS_INFO 用来打印消息 类似 Print()/cout函数
ROS_INFO("this is a test ");
//以1Hz的频th
//根据前面定义的频率, sleep 1s
loop_rate.sleep();//根据前面的定义的loop_rate,设置1s的暂停
}
return 0;
}
2..放在循环当中
while (ros::ok())
{
//每隔1秒更新一次
ROS_INFO("this is a test ");
//2.第二种方法
ros::Duration(1.0).sleep();
}
3.timer定时器
Rate的功能是指定一个频率, 让某些动作按照这个频率来循环执行。 与之类似的是ROS中的定时器Timer, 它是通过设定回调函数和触发时间来实现某些动作的反复执行, 创建方法和topic中的subscriber很像.
//使用timer来完成定时器的功能 取代rate
#include<ros/ros.h>
void callback1(const ros::TimerEvent&)
{
ROS_INFO("callback1 triggered ");
}
void callback2(const ros::TimerEvent&)
{
ROS_INFO("callback2 triggered ");
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "timer2");
ros::NodeHandle n;
//理论上观察到的现象就是callback1触发的次数是callback2的两倍
//timer1 每1秒触发一次
ros::Timer timer1=n.createTimer(ros::Duration(1.0),callback1);
//timer2 每2秒触发一次
ros::Timer timer2=n.createTimer(ros::Duration(2.0),callback2);
//ros::spin() 一定要加 不然没法触发回调函数
ros::spin();
return 0;
}
4.参考
1..MOOC 机器人操作系统入门
2.自己实现的关于time的ros功能包是topic_com.