目录
一、当前时刻与指定时刻
创建time_p.py
time_p.py?
添加可执行权限
编译+运行节点
二、持续时间
三、持续时间与时刻计算
四、定时器
五、总结
参考学习资料:B站赵虚左的课程
一、当前时刻与指定时刻
创建time_p.py
我放入到了之前话题通信的功能包中。
time_p.py?
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import rospy
if __name__ == "__main__":
# 初始化节点
rospy.init_node("time_p")
# 调用rospy库中的Time类中的now()函数.查询当前时间,参考系为1970年1月1日00:00.
# @return: L{Time} instance for current time,返回当前时间的实例.
time_now = rospy.Time.now()
# 打印当前时间,利用to_sec()将得到的ros时间转化为浮点型.
rospy.loginfo("当前时间为:%.2f", time_now.to_sec())
# 指定时间,参考系为1970年1月1日00:00.
# 方法一:直接传入浮点数
time1 = rospy.Time(100.5)
# 方法二:传入秒与纳秒,通过逗号分隔.
time2 = rospy.Time(100,123456789)
# 打印两个方法指定的时刻.
rospy.loginfo("指定时刻1为:%.2f", time1.to_sec())
rospy.loginfo("指定时刻2为:%.2f", time2.to_sec())
添加可执行权限
chmod +x *.py
CMakeList.txt配置
catkin_install_python(PROGRAMS
scripts/time_p.py
DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
编译+运行节点
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time_p.py
[INFO] [1667358757.807380]: 当前时间为:1667358757.81
[INFO] [1667358757.808251]: 指定时刻1为:100.50
[INFO] [1667358757.808971]: 指定时刻2为:100.12
二、持续时间
增加持续时间部分
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import rospy
if __name__ == "__main__":
# 初始化节点
rospy.init_node("time_p")
# 调用rospy库中的Time类中的now()函数.查询当前时间,参考系为1970年1月1日00:00.
# @return: L{Time} instance for current time,返回当前时间的实例.
time_now = rospy.Time.now()
# 打印当前时间,利用to_sec()将得到的ros时间转化为浮点型.
rospy.loginfo("当前时间为:%.2f", time_now.to_sec())
# 指定时间,参考系为1970年1月1日00:00.
# 方法一:直接传入浮点数
time1 = rospy.Time(100.5)
# 方法二:传入秒与纳秒,通过逗号分隔.
time2 = rospy.Time(100,123456789)
# 打印两个方法指定的时刻.
rospy.loginfo("指定时刻1为:%.2f", time1.to_sec())
rospy.loginfo("指定时刻2为:%.2f", time2.to_sec())
# 持续时间部分
# 测试两种方式,一个是传入浮点数,一个是传入秒与纳秒用逗号分隔开.
du1 = rospy.Duration(5.1)
du2 = rospy.Duration(5, 100000000)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du1
rospy.sleep(du1)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du2
rospy.sleep(du2)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时5秒
rospy.sleep(5)
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
第一种
du1 = rospy.Duration(5.1)
rospy.sleep(du1)
第二种
du2 = rospy.Duration(5, 100000000)
rospy.sleep(du2)
第三种(常用)
rospy.sleep(5)
运行节点?
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time_p.py
[INFO] [1667460064.152594]: 当前时间为:1667460064.15
[INFO] [1667460064.153262]: 指定时刻1为:100.50
[INFO] [1667460064.153888]: 指定时刻2为:100.12
[INFO] [1667460064.154418]: 当前时刻为:1667460064.154
[INFO] [1667460069.263867]: 当前时刻为:1667460069.264
[INFO] [1667460074.377712]: 当前时刻为:1667460074.378
[INFO] [1667460079.388063]: 当前时刻为:1667460079.388
做差发现基本符合5.1秒的要求,在0.01秒出现误差,对比c++的实现,发现python性能是不如c++的。
(2条消息) 18.ROS编程:ROS中的时间c++_机械专业的计算机小白的博客-CSDN博客https://blog.csdn.net/wzfafabga/article/details/127609516?spm=1001.2014.3001.5501
三、持续时间与时刻计算
增加计算部分
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import rospy
if __name__ == "__main__":
# 初始化节点
rospy.init_node("time_p")
# 调用rospy库中的Time类中的now()函数.查询当前时间,参考系为1970年1月1日00:00.
# @return: L{Time} instance for current time,返回当前时间的实例.
time_now = rospy.Time.now()
# 打印当前时间,利用to_sec()将得到的ros时间转化为浮点型.
rospy.loginfo("当前时间为:%.2f", time_now.to_sec())
# 指定时间,参考系为1970年1月1日00:00.
# 方法一:直接传入浮点数
time1 = rospy.Time(100.5)
# 方法二:传入秒与纳秒,通过逗号分隔.
time2 = rospy.Time(100,123456789)
# 打印两个方法指定的时刻.
rospy.loginfo("指定时刻1为:%.2f", time1.to_sec())
rospy.loginfo("指定时刻2为:%.2f", time2.to_sec())
# 持续时间部分
# 测试两种方式,一个是传入浮点数,一个是传入秒与纳秒用逗号分隔开.
du1 = rospy.Duration(5.1)
du2 = rospy.Duration(5, 100000000)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du1
rospy.sleep(du1)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du2
rospy.sleep(du2)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时5秒
rospy.sleep(5)
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 运算部分
# 持续时间运算
du3 = du1 + du2
rospy.loginfo("持续时间du3:%.2f", du3.to_sec())
# 时刻与持续时间运算
# 加法
time3 = time1 + du1
# 减法
time4 = time1 - du1
rospy.loginfo("加法:%.2f,减法:%.2f", time3.to_sec(), time4.to_sec())
运行结果
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time_p.py
[INFO] [1667461232.350247]: 当前时间为:1667461232.35
[INFO] [1667461232.350882]: 指定时刻1为:100.50
[INFO] [1667461232.351696]: 指定时刻2为:100.12
[INFO] [1667461232.352490]: 当前时刻为:1667461232.352
[INFO] [1667461237.458726]: 当前时刻为:1667461237.459
[INFO] [1667461242.566056]: 当前时刻为:1667461242.566
[INFO] [1667461247.573198]: 当前时刻为:1667461247.573
[INFO] [1667461247.574506]: 持续时间du3:10.20
[INFO] [1667461247.575430]: 加法:105.60,减法:95.40
四、定时器
加入定时器部分
#! /usr/bin/env python3
# -*- coding: UTF-8 -*-
import rospy
def huidiao(event):
rospy.loginfo("--------")
rospy.loginfo("调用回调函数的时刻:%.2f", event.current_real.to_sec())
if __name__ == "__main__":
# 初始化节点
rospy.init_node("time_p")
# 调用rospy库中的Time类中的now()函数.查询当前时间,参考系为1970年1月1日00:00.
# @return: L{Time} instance for current time,返回当前时间的实例.
time_now = rospy.Time.now()
# 打印当前时间,利用to_sec()将得到的ros时间转化为浮点型.
rospy.loginfo("当前时间为:%.2f", time_now.to_sec())
# 指定时间,参考系为1970年1月1日00:00.
# 方法一:直接传入浮点数
time1 = rospy.Time(100.5)
# 方法二:传入秒与纳秒,通过逗号分隔.
time2 = rospy.Time(100,123456789)
# 打印两个方法指定的时刻.
rospy.loginfo("指定时刻1为:%.2f", time1.to_sec())
rospy.loginfo("指定时刻2为:%.2f", time2.to_sec())
# 持续时间部分
# 测试两种方式,一个是传入浮点数,一个是传入秒与纳秒用逗号分隔开.
du1 = rospy.Duration(5.1)
du2 = rospy.Duration(5, 100000000)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du1
rospy.sleep(du1)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时du2
rospy.sleep(du2)
# 打印当前时刻
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 延时5秒
rospy.sleep(5)
rospy.loginfo("当前时刻为:%.3f", rospy.Time.now().to_sec())
# 运算部分
# 持续时间运算
du3 = du1 + du2
rospy.loginfo("持续时间du3:%.2f", du3.to_sec())
# 时刻与持续时间运算
# 加法
time3 = time1 + du1
# 减法
time4 = time1 - du1
rospy.loginfo("加法:%.2f,减法:%.2f", time3.to_sec(), time4.to_sec())
# 定时器部分
rospy.Timer(period = rospy.Duration(1), callback = huidiao)
rospy.spin()
主要部分
def huidiao(event):
rospy.loginfo("--------")
rospy.loginfo("调用回调函数的时刻:%.2f", event.current_real.to_sec())
rospy.Timer(period = rospy.Duration(1), callback = huidiao)
rospy.spin()
通过Timer会给回调函数一个event事件,其中事件在class TimerEvent类中(通过ctrl查询Timer,再查询TimerEvent)。
@param last_expected: in a perfect world, this is when the previous callback should have happened
@type last_expected: rospy.Time
@param last_real: when the callback actually happened
@type last_real: rospy.Time
@param current_expected: in a perfect world, this is when the current callback should have been called
@type current_expected: rospy.Time
@param current_real: when the current callback is actually being called
(rospy.Time.now() as of immediately before calling the callback)
@type current_real: rospy.Time
@param last_duration: contains the duration of the last callback (end time minus start time) in seconds.
Note that this is always in wall-clock time.
@type last_duration: float
此程序用了事件下的current_real,这个函数返回值为当前时刻(rostime型数据),可以通过.to_sec()转化为浮点型,打印在控制台终端上。
注意:有回调函数就要有回头函数spin(),要不然不会跳入回调函数中循环。
运行节点
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time_p.py
[INFO] [1667464504.012976]: 当前时间为:1667464504.01
[INFO] [1667464504.013651]: 指定时刻1为:100.50
[INFO] [1667464504.014580]: 指定时刻2为:100.12
[INFO] [1667464504.015244]: 当前时刻为:1667464504.015
[INFO] [1667464509.120141]: 当前时刻为:1667464509.120
[INFO] [1667464514.229800]: 当前时刻为:1667464514.230
[INFO] [1667464519.236495]: 当前时刻为:1667464519.236
[INFO] [1667464519.238351]: 持续时间du3:10.20
[INFO] [1667464519.239330]: 加法:105.60,减法:95.40
[INFO] [1667464520.242976]: --------
[INFO] [1667464520.244635]: 调用回调函数的时刻:1667464520.24
[INFO] [1667464521.244617]: --------
[INFO] [1667464521.245944]: 调用回调函数的时刻:1667464521.24
[INFO] [1667464522.242715]: --------
[INFO] [1667464522.244112]: 调用回调函数的时刻:1667464522.24
[INFO] [1667464523.242828]: --------
[INFO] [1667464523.243979]: 调用回调函数的时刻:1667464523.24
[INFO] [1667464524.244025]: --------
[INFO] [1667464524.245623]: 调用回调函数的时刻:1667464524.24
要想只循环一次,修改,给oneshot形参赋布尔值。
rospy.Timer(period = rospy.Duration(1), callback = huidiao, oneshot=True)
运行节点
rosmelodic@rosmelodic-virtual-machine:~/catkin_ws$ rosrun sub_pub time_p.py
[INFO] [1667465155.348593]: 当前时间为:1667465155.35
[INFO] [1667465155.349332]: 指定时刻1为:100.50
[INFO] [1667465155.350237]: 指定时刻2为:100.12
[INFO] [1667465155.351194]: 当前时刻为:1667465155.351
[INFO] [1667465160.460058]: 当前时刻为:1667465160.460
[INFO] [1667465165.570954]: 当前时刻为:1667465165.571
[INFO] [1667465170.580149]: 当前时刻为:1667465170.580
[INFO] [1667465170.581464]: 持续时间du3:10.20
[INFO] [1667465170.582339]: 加法:105.60,减法:95.40
[INFO] [1667465171.586173]: --------
[INFO] [1667465171.587353]: 调用回调函数的时刻:1667465171.59
五、总结
对比于C++的实现,python更加简洁,同时查找形参的官方解释更加方便,官方在类中都有详细的解释。但是从持续时间部分可知,python的性能远远不如c++。
|