文章目录
- 一、问题描述
- 二、修改方法
- 补充
- 1. 时间类型
- 2. 时间数据使用方法
一、问题描述
因项目需要,需要"ros::Time::now()" 改成获取机器开机时间,此处针对rospy的机器时间修改。
二、修改方法
修改ros源码的文件 /opt/ros/noetic/lib/python3/dist-packages/rospy/rostime.py
修改如下:
定位到 get_rostime() ,并将 float_secs = time.time()
改为 float_secs = time.monotonic()
def get_rostime():"""Get the current time as a L{Time} object @return: current time as a L{rospy.Time} object@rtype: L{Time}"""if not _rostime_initialized:raise rospy.exceptions.ROSInitException("time is not initialized. Have you called init_node()?")if _rostime_current is not None:# initialize with sim timereturn _rostime_currentelse:# initialize with wallclockfloat_secs = time.monotonic() # float_secs = time.time()secs = int(float_secs)nsecs = int((float_secs - secs) * 1000000000)return Time(secs, nsecs)
修改后重启机器,时间戳打印如下:
补充
补充一下关于时间的知识点:
ros::Time ros_time;
ros::Time org_time;
ros::SteadyTime steady_time;ros_time = ros::Time();
org_time = ros::Time::now();
steady_time = ros::SteadyTime::now();ROS_INFO("&&& ros_time sec:%d nsec:%d", ros_time.sec, ros_time.nsec);
ROS_INFO("$$$ org_time sec:%d nsec:%d", org_time.sec, org_time.nsec);
ROS_INFO("*** steady_time sec:%d nsec:%d", steady_time.sec, steady_time.nsec);
ROS_INFO("*** steady_time 2sec:%.3f 2nsec:%.3f", steady_time.toSec(), steady_time.toNSec());
执行结果如下图:
1. 时间类型
- ros::Time():默认构造函数。初始化为初始值0.0;
- ros::SteadyTime::now():获取ROS稳定时间(Steady Time),即系统运行时间;
- ros::Time::now(): 获取ROS系统时间(Wall-Clock Time),即自1970年1月1日以来的实际时间,也称获取"墙上时间";
2. 时间数据使用方法
- time.sec : 以整数形式获取时间的秒数;
- time.nsec:以整数形式获取时间的纳秒数;
- time.toSec():以小数形式获取时间(含秒数及纳秒数);
- time.toNSec():以小数形式获取时间(只获取纳秒数)