学习常用API(应用程序编程接口)
初始化ROS节点
参数: name:设置节点名称
argv=None:封装节点调用时传入的参数
anonymous=False:为节点名称生成随机后缀以解决重名问题
在命令行rosrun xx xx.py 后加上_A:=10000就可以把节点名称赋值
如果不开name随机,同名的节点不允许同时存在,新的开了旧的会关掉
rospy.init_node("shengg",anonymous=True)
创建发布者对象中latch的使用,布尔类型,默认值False
如果设置为Ture,可以将发布的最后一条信息保存,当后续新的订阅对象连接时,会将该数据发给订阅者
这样就可以rostopic echo che来看最后一条是啥,比如以后创建的静态地图,就设置为只发送一次,新建一个连接再重新发一次
时间相关
时间原点:1970.1.1 0:00:00
可以将时间转换为距离时间原点多少秒
#! /usr/bin/env python
import rospy
if __name__=="__main__":
rospy.init_node("time")
right=rospy.Time.now()
rospy.loginfo("距离%.2f",right.to_sec())
rospy.loginfo("距离%d",right.secs)
time=rospy.Time(100)
意思是定义一个TIME距离原点100s
time2=rospy.Time(100,100)
这两个参数一个是s一个是ns
time3=rospy.Time.from_sec(200)
这也是一种定义的方法
程序执行中停五秒,先定义一个时间再sleep即可
du=rospy.Duration(5)
rospy.sleep(du)
计算下程序的结束时间
time4=rospy.Time.now()
du1=rospy.Duration(5)
time5=time4+du1
rospy.sleep(du1)
time6=rospy.Time.now()
rospy.loginfo("%.2f",time5.to_sec())
rospy.loginfo("%.2f",time6.to_sec())
time之间可以相减不能相加
接下来看定时器,本例实现隔某个时间执行某种操作
def my_timer1(event):
rospy.loginfo("777")
rospy.loginfo("%.2f",event.current_real.to_sec())
timer1=rospy.Timer(rospy.Duration(2),my_timer1,oneshot=False)
rospy.spin()
oneshot意思是是否只执行一次
节点操作函数
一般用于循环条件
while not rospy.is_shutdown():
rospy.on_shutdown(zuihou)
rospy.signal_shutdown("关闭节点")
on.shutdown是在关闭过程中执行一个回调函数
日志操作比较简单,DEBUG信息不在控制台显示
最后看下模块导入
这样写没法运行,因为rosrun跑的默认目录不是在scripts下面,而是我们的大文件夹demo03_ws
解决方法是设置临时环境变量
import sys
sys.path.insert(0,"/home/rosenoetic/demo03_ws/src/server_client/scripts")
import daoru1
if __name__=="__main__":
rospy.init_node("fule")
rospy.loginfo("www%d",daoru1.num1)
但这种写路径的肯定不是最优解决,不方便移植
import os
import sys
path=os.path.abspath(“.”)
sys.path.insert(0,path+"/src/server_client/scripts")