ROS时间函数API2

我们已经学过一些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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值