ros当中的时钟

Table of Contents

1.time和duration

2.sleep

3.timer定时器

4.参考


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.

猜你喜欢

转载自blog.csdn.net/u013528298/article/details/88421670
ROS