我们已经学过一些ros的时间函数了,那我们接着拓展一下其他的函数。
1.持续时间:
首先,我们设置时间段,其类型为duration,设置纯纯的时间段方法为ros::Duration(1);,设置变量方式为ros::Duration du(5); ,然后我们引入一个新函数sleep(),其作用是暂时休眠,使用方法是先设置变量,然后格式为du.sleep();
休眠结束后会自动执行之后的程序。
2.时间计算:
首先要说的是,时间种子之间不可直接加减,但时间种子可以跟持续时间进行加减运算,持续时间也可以直接进行加减运算。
ros::Time begin=ros::Time::now();
ros::Duration dura(5);
ros::Time stop=begin+dura;
ROS_INFO("Beginning time: %.2f",begin.toSec());
ROS_INFO("Ending time: %.2f",stop.toSec());
ros::Duration sum=du+dura;
ROS_INFO("sum is %.2f",sum.toSec());
ros::Duration substra=du-dura;
ROS_INFO("sum is %.2f",substra.toSec());
效果自测。
3.循环频率
我们也可以调整循环频率,我们需要一个新的type ros::Rate ,格式如下:ros::Rate rate(5);其含义是设置一个类型为ros::Rate的变量rate,其数值为5,即一秒执行5次程序。
一般我们和while循环一起使用。
4.计时器函数
我们还可以设置定时器,首先再引入一个新type timer,然后需要注意的是我们在设置定时器变量之前,需要先设置程序的节点句柄ros::NodeHandle n;设置变量的格式是ros::Timer timer=n.createTimer(ros::Duration (1),cb,false,true);
createTimer函数有四个参数:参数1是持续时间Duration;参数2是Callback函数;参数3是bool类型,是设置这个定时器设定是否是一次性的参数,默认值为false;参数4是bool类型,是设置这个定时器是否是自动启动的参数,其默认值为true。
注意我们在这个之后需要和函数ros::spin();搭配使用,来调用我们的Callback函数(不可以用ros::spinOnce(),这样会无法启动Callback函数)。我们也可以利用计数器来控制。
如果我们将第四个参数设置为false,此时我们需要手动启动定时器,此时要调用函数start(),格式如下:ros::NodeHandle n; ros::Timer timer=n.createTimer(ros::Duration (1),cb,false,true); timer.start(); ros::spin();
--------------------------------------------------------------
此外再介绍一些别的函数。
ros::ok()用于判断节点是否存在,返回类型为bool,如果节点以及执行完毕,则会返回false,如果程序再中途退出(Ctrl C),就会返回false.
ros::shutdown();用于关闭节点,返回值为void。
接下来是一系列日志函数:
1.ROS_INFO();输出日志函数,直接在屏幕上输出,注意如果是字符和字符串需要使用.c_str()。
2.ROS_WARN();提醒一些异常情况,但程序仍可以正常执行。
3.ROS_ERROR();提示错误信息,这些错误会影响程序运行。
4.ROS_FATAL();提示严重错误信息,这些错误会阻止程序运行。
5.ROS_DEBUG();调试,消息不会输出到控制台。
下面附上时间函数的程序代码,可自行测试:
#include "ros/ros.h"
void cb(const ros::TimerEvent &event){
ROS_INFO("114514");
}
int main(int argc,char *argv[]){
setlocale(LC_ALL,"");
ros::init(argc,argv,"time");
ros::NodeHandle n;
ros::Time now_time=ros::Time::now();
ROS_INFO("Now time is:%.2f",now_time.toSec());
ROS_INFO("Now the second number is: %.2f",now_time.sec);
ros::Time t1(20,312345678);//since 1970.1.1.00:00 passed 20 seconds and 312345678 ns
ros::Time t2(100.66);//since 1970.1.1.00:00 passed 100.66 seconds
ROS_INFO("t1=%.2f",t1.toSec());
ROS_INFO("t1=%.2f",t2.toNSec());
ROS_INFO("----------Duration----------");
ros::Time start=ros::Time::now();
ROS_INFO("Start to sleep: %.2f",start.toSec());
ros::Duration du(4.5);
du.sleep();//sleep temporarily
ros::Time end=ros::Time::now();
ROS_INFO("Stop sleeping: %.2f",end.toSec());
ROS_INFO("----------Calculation----------");
ros::Time begin=ros::Time::now();
ros::Duration dura(5);
ros::Time stop=begin+dura;
ROS_INFO("Beginning time: %.2f",begin.toSec());
dura.sleep();
ROS_INFO("Ending time: %.2f",stop.toSec());
ros::Duration sum=du+dura;
ROS_INFO("sum is %.2f",sum.toSec());
ros::Duration substra=du-dura;
ROS_INFO("sum is %.2f",substra.toSec());
ros::Rate rate(5);//setting the loop frequency rate
int i=25;
while(i){
ROS_INFO("code %d",i);
i--;
rate.sleep();
}
ROS_INFO("----------Timing----------");
ros::Timer timer = n.createTimer(ros::Duration (1),cb,false,true);
ros::spin();
return 0;
}