21.ROS编程学习:ROS中的时间python

目录

一、当前时刻与指定时刻

创建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博客icon-default.png?t=M85Bhttps://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++。

猜你喜欢

转载自blog.csdn.net/wzfafabga/article/details/127647473