ROS2时间同步(python)
最近1周一直研究ROS2的时间同步,翻越很多博客,很少有人使用ROS2进行时间同步的代码,无奈不断尝试与源码阅读,终于将其搞定,
为此,本博客将介绍基于python的ROS2的时间同步方法。
本博客内容结构为话题发布代码,话题订阅与时间同步代码,代码文件夹结构及结果显示图片。本博客假设2个publisher和一个scribe,同步是在scibe中完成。
一.话题发布代码
发布1为第二个发布者,可理解为某传感器
publisher1代码如下:
- #!/usr/bin/env python3
- import rclpy
- from rclpy.node import Node
- from std_msgs.msg import String,Float32,Int32
- import cv2
- # from std_msgs.msg import Header
- import time
- class NodePublisher(Node):
- def __init__(self,name):
- super().__init__(name)
- self.get_logger().info("大家好,我是%s!" % name)
- self.num=0
- self.command_publisher1 = self.create_publisher(Int32,"command1", 10)
- self.timer = self.create_timer(0.4, self.timer_callback) #
- # self.inputdata1()
- def inputdata1(self):
- msg = Int32() #String()
- period=0.5
- print("publisher1-周期",period)
- self.get_logger().info(f'发布了指令:{msg.data}') #打印一下发布的数据
- num=0
- while True:
- num=num+1
- msg.data = num #str(num)
- self.command_publisher_.publish(msg)
- # time.sleep(period)
- self.get_logger().info(f'发布了指令:{msg.data}') #打印一下发布的数据
- def timer_callback(self):
- msg = Int32() #String()
- self.num+=1
- msg.data = self.num #str(num)
- self.command_publisher1.publish(msg)
- self.get_logger().info(f'发布了指令:{msg.data}') #打印一下发布的数据
- def main(args=None):
- rclpy.init(args=args) # 初始化rclpy
- node = NodePublisher("topic_publisher1") # 新建一个节点
- rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
- rclpy.shutdown() # 关闭rclpy
发布2为第二个发布者,可理解为某传感器
publisher2代码如下:
- #!/usr/bin/env python3
- import rclpy
- from rclpy.node import Node
- from std_msgs.msg import String,Float32,Int32
- import time
- class NodePublisher(Node):
- def __init__(self,name):
- super().__init__(name)
- self.get_logger().info("大家好,我是%s!" % name)
- self.num=0
- self.command_publisher2= self.create_publisher(Int32,"command2", 10)
- self.timer = self.create_timer(0.2, self.timer_callback) #
- def timer_callback(self):
- msg = Int32() #String()
- self.num+=1
- msg.data = self.num #str(num)
- self.command_publisher2.publish(msg)
- self.get_logger().info(f'发布了指令:{msg.data}') #打印一下发布的数据
- def main(args=None):
- rclpy.init(args=args) # 初始化rclpy
- node = NodePublisher("topic_publisher2") # 新建一个节点
- rclpy.spin(node) # 保持节点运行,检测是否收到退出指令(Ctrl+C)
- rclpy.shutdown() # 关闭rclpy
二.话题订阅及时间同步代码
订阅发布者信息,并将其同步,可理解为同步不同传感器
scriabe代码如下:
- #!/usr/bin/env python3
- import rclpy
- from rclpy.node import Node
- import message_filters
- from std_msgs.msg import String,Float32,Int32
- import message_filters
- from sensor_msgs.msg import Image, CameraInfo
- def callback(image_sub,info_sub):
- res=int(info_sub.data)-int(image_sub.data)
- print("publisher1:\t{}\tpubsher2:\t{}\t{}".format(str(image_sub.data),str(info_sub.data),res))
- def main(args=None):
- rclpy.init(args=args) # 初始化rclpy
- scribe_node=Node('scribe_time')
- image_sub = message_filters.Subscriber(scribe_node, Int32,'command1')
- info_sub = message_filters.Subscriber(scribe_node, Int32,'command2')
- ts = message_filters.ApproximateTimeSynchronizer([image_sub, info_sub], 10, 0.1, allow_headerless=True) # allow_headerless=True,可以不使用时间戳
- # ts = message_filters.TimeSynchronizer([image_sub, info_sub], 10) # 这个需要时间戳才可调用
- ts.registerCallback(callback)
- rclpy.spin(scribe_node)
- rospy.spin()
三.参数配置及文件格式
setup.py设置如下:
- from setuptools import setup
- package_name = 'topic_time'
- setup(
- name=package_name,
- version='0.0.0',
- packages=[package_name],
- data_files=[
- ('share/ament_index/resource_index/packages',
- ['resource/' + package_name]),
- ('share/' + package_name, ['package.xml']),
- ],
- install_requires=['setuptools'],
- zip_safe=True,
- maintainer='root',
- maintainer_email='root@todo.todo',
- description='TODO: Package description',
- license='TODO: License declaration',
- tests_require=['pytest'],
- entry_points={
- 'console_scripts': [
- "publisher1_node = topic_time.publisher1:main",
- "publisher2_node = topic_time.publisher2:main",
- "subscribe_node = topic_time.subscribe:main",
- "subscribe2_node = topic_time.subscribe2:main"
- ],
- },
- )
文件格式如下:
通过以上代码将可看到同步的scribe中发布1时间无间隔,发布2时间间隔为4,恰好与设置周期同等,结果显示如下:
ROS2时间同步(python)的更多相关文章
- python windows时间同步工具
由于某种原因(BIOS电池没电),电脑的系统时间会与我们的北京时间不同步,将会导致如下问题: 1. 抢火车票的时候已经过时间了 2.别的同事都走了,你还以为没下班 …… 规避问题的方法:同步系统时间 ...
- ros2中创建一个python package
完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...
- 树莓派3b添加python时间同步脚本
树莓派没有电池,因此断电后系统时间会停止,直到你开机后又继续计时,所以会造成系统时间和实际时间有很大的误差. 因为项目需要用到本地时间,精度要求不高不想折腾(如果需要高精度,需要安装ntp),所以考虑 ...
- python 入门1
python的历史 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Per ...
- python网络进阶篇
并发编程 进程 操作系统的历史 # 手工操作 —— 穿孔卡片 # 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数 ...
- 大数据项目之_15_帮助文档_NTP 配置时间服务器+Linux 集群服务群起脚本+CentOS6.8 升级到 python 到 2.7
一.NTP 配置时间服务器1.1.检查当前系统时区1.2.同步时间1.3.检查软件包1.4.修改 ntp 配置文件1.5.重启 ntp 服务1.6.设置定时同步任务二.Linux 集群服务群起脚本2. ...
- python并发_线程
关于进程的复习: # 管道 # 数据的共享 Manager dict list # 进程池 # cpu个数+1 # ret = map(func,iterable) # 异步 自带close和join ...
- [转] ROS2源码编译和安装
机器人开源操作系统软件ROS在10年后, 终于推出全新架构的ROS2,代号“ardent”.中文意思为“热心的美洲鳖”,看来ROS2要从ROS1的“海龟”变成“土鳖”系列了. 与此同时,ROS2的编译 ...
- python 全栈开发,Day34(基于UDP协议的socket)
昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...
随机推荐
- git submodule 实战
1.git submodule指什么 关于git submodule是什么,可以看下面这个链接. https://www.cnblogs.com/hwx0000/p/14146838.html 2.g ...
- UOJ#XX A+B Problem (罔烙硫)
题面 背景 题目描述 从前有个 n n n 个方格排成一行,从左至右依此编号为 1 , 2 , ⋯ , n 1,2,⋯,n 1,2,⋯,n. 有一天思考熊想给这 n n n 个方格染上黑白两色. 第 ...
- Jenkins+SpringCloud(多模块)+Vue项目详细配置
一.Jenkins安装及所需插件安装 安装过程略. 我这用到工具包括JDK.Git.Maven.NodeJS:可以选择自行在服务器安装,也可以通过Jenkins自动安装,位置在系统管理 >全局工 ...
- HTTP2指纹识别(一种相对不为人知的网络指纹识别方法)
这是关于网络指纹识别的两部分系列的第二部分 上一部分我介绍了有关TLS 指纹识别方法(以及在不同客户端的指纹有何区别): https://mp.weixin.qq.com/s/BvotXrFXwYvG ...
- KingbaseES rownum 与 limit 的 执行计划区别
数据准备 --创建基础数据表100W行 create table test07 as select * from (select generate_series(1, 1000000) id, (ra ...
- Toast 部分记录丢失问题处理
在日常数据库运维过程中,我们可能会遇到类似以下的错误.该错误信息是由于部分tuple的 toast 字段丢失,导致数据无法访问.需要通过游标方式,将可以访问的数据备份出来. test=# create ...
- Mac_VM_CentOS固定IP总结
参考链接 参考链接 亲测可用
- [Python]-json模块-处理字典数据的存取
import json 函数 json.dumps() json.dumps()函数是将字典转化为字符串 json.loads() json.loads()函数是将字符串转化为字典 注意: 从json ...
- day03-代码实现02
多用户即时通讯系统03 4.编码实现02 4.2功能实现-拉取在线用户 4.2.1思路分析 客户端想要知道在线用户列表,就要向服务器发送请求(Message),因为只有服务器端保持着所有与客户端相连接 ...
- Confluence预览中文附件出现乱码
转载自:https://blog.51cto.com/u_13776519/5329428 背景介绍: 1.使用docker方式安装运行的Confluence 2.进行了破解,使用外置数据库 3.do ...