1. 初始化
rospy.init_node( );
#2.初始化ROS节点;
"""
作用:ROS节点初始化
参数:
name ----设置节点名称
argv = None ----封装节点调用时传递的参数
anonymous = False ----可以为节点名称生成随机后缀,可以解决重名问题
使用:
1.argv使用
可以安照ROS中指定的语法格式传参,ROS可以解析并加以使用
2.anonymous使用
可以设置为True,节点名称可以后缀随机数
原: rospy.init_node("sanDai") ----不可以重复执行发布数据的命令
改: rospy.init_node("sanDai",anonymous = True) ----可以重复发布
"""
2. 话题与服务相关对象
"""
内容:latch
bool 值, 默认是 False
作用:
如果设置为 True, 可以将发布的最后一条数据保存,且后续当新的订阅对象连接时,会将该数据发布给订阅者
使用:
latch = True
原:pub = rospy.Publisher("che",String,queue_size=10)
改:pub = rospy.Publisher("che",String,queue_size=10,latch=True)
"""
注:修改后,发送结束时会保存最后一条数据并通过echo输出
课程:https://www.bilibili.com/video/BV1Ci4y1L7ZZ?p=136&spm_id_from=pageDriver
3. 时刻
#! /usr/bin/env python
import rospy
"""
需求1: 演示时间相关操作(获取当前时刻 + 设置指定时刻)
需求2: 程序执行中停顿5秒
需求3: 获取程序开始执行的时刻, 且已知程序运行的时间,计算程序结束的时刻
需求4: 创建定时器,实现类似于 ros::Rate 的功能(隔某个时间间隔执行某种操作)
"""
def doMsg(event): #需求4:定时器需要的内嵌循环
rospy.loginfo("+++++++++++++++++++++++++++++++++")
#注:event可以获取时刻
rospy.loginfo("调用回调函数的时刻:%.2f",event.current_real.to_sec())
if __name__ == "__main__":
rospy.init_node("hello_time")
rospy.loginfo("*********************需求1.时间相关操作*********************")
#需求1: 演示时间相关操作(获取当前时刻 + 设置指定时刻)
#获取时刻
right_now = rospy.Time.now() #将当前时刻(1.now函数被调用执行的那一刻 2.1970年01月01日 00:00:00)获取并封装成对象
rospy.loginfo("当前时刻:%.2f",right_now.to_sec()) #浮点型
rospy.loginfo("当前时刻:%d",right_now.secs) #整型
#设置指定
time1 = rospy.Time(100.5) #将时间(1970年01月01日 00:00:00 逝去100.5秒)封装进 Time 对象
time2 = rospy.Time(100.312456875)
rospy.loginfo("指定时刻1:%.2f",time1.to_sec())
rospy.loginfo("指定时刻2:%.2f",time2.to_sec())
#从某个时间值获取时间对象
time3 = rospy.Time.from_sec(210.12)
rospy.loginfo("指定时刻3:%.2f",time3.to_sec())
rospy.loginfo("*********************需求2.程序执行中停顿*********************")
# 需求2: 程序执行中停顿5秒
rospy.loginfo("休眠前-----------------------------------------")
# 1.封装一个持续时间对象(5秒)
du = rospy.Duration(5)
#2.再将持续时间休眠
rospy.sleep(du) #执行需求2不注释,需求3需要注释掉,会影响需求3的操作
rospy.loginfo("休眠后-----------------------------------------")
rospy.loginfo("*********************需求3.计算程序结束的时刻*****************")
# 需求3: 获取程序开始执行的时刻, 且已知程序运行的时间,计算程序结束的时刻
# 1.获取一个时刻 t1
t1 = rospy.Time.now()
# 2.设置一个持续时间 du1
du1 = rospy.Duration(5)
# 3.结束时刻 t2 = t1 + du1
t2 = t1 + du1
rospy.loginfo("开始时刻:%.2f",t1.to_sec())
rospy.loginfo("结束时刻:%.2f",t2.to_sec())
du2 = du + du1
rospy.loginfo("持续时间相加:%.2f",du2.to_sec())
# t2 = right_now + t1 //会抛出异常
rospy.loginfo("*********************需求4.创建定时器********************")
# 创建定时器,实现类似于 ros::Rate 的功能(隔某个时间间隔执行某种操作)
"""
@param period: desired period between callbacks
@type period: rospy.Duration
@param callback: callback to be called
@type callback: function taking rospy.TimerEvent
@param oneshot: if True, fire only once, otherwise fire continuously until shutdown is called [default: False]
@type oneshot: bool
@param reset: if True, timer is reset when rostime moved backward. [default: False]
@type reset: bool
"""
#创建一个定时器对象
timer = rospy.Timer(rospy.Duration(2),doMsg) #每隔2s输出一次
# timer = rospy.Timer(rospy.Duration(2),doMsg,True) #只输出一次,一次性的
rospy.spin()
输出:
“休眠前”与“休眠后”停顿了5秒
4. 其他函数
4.1 节点状态判断
def is_shutdown():
"""
@return: True 如果节点已经被关闭
@rtype: bool
"""
4.2 节点关闭函数
def signal_shutdown(reason):
"""
关闭节点
@param reason: 节点关闭的原因,是一个字符串
@type reason: str
"""
def on_shutdown(h):
"""
节点被关闭时调用的函数
@param h: 关闭时调用的回调函数,此函数无参
@type h: fn()
"""
关闭函数:https://www.bilibili.com/video/BV1Ci4y1L7ZZ?p=141&spm_id_from=pageDriver
4.3 日志函数
#! /usr/bin/env python
import rospy
if __name__ == "__main__":
#演示日志函数
rospy.init_node("hello_log")
rospy.logdebug("DEBUG消息...")
rospy.loginfo("INFO消息.....")
rospy.logwarn("WARN消息.....")
rospy.logerr("ERROR消息.....")
rospy.logfatal("FATAL消息...")
輸出: