最近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)的更多相关文章

  1. python windows时间同步工具

    由于某种原因(BIOS电池没电),电脑的系统时间会与我们的北京时间不同步,将会导致如下问题: 1. 抢火车票的时候已经过时间了 2.别的同事都走了,你还以为没下班 …… 规避问题的方法:同步系统时间 ...

  2. ros2中创建一个python package

    完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...

  3. 树莓派3b添加python时间同步脚本

    树莓派没有电池,因此断电后系统时间会停止,直到你开机后又继续计时,所以会造成系统时间和实际时间有很大的误差. 因为项目需要用到本地时间,精度要求不高不想折腾(如果需要高精度,需要安装ntp),所以考虑 ...

  4. python 入门1

    python的历史 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. 像Per ...

  5. python网络进阶篇

    并发编程 进程 操作系统的历史 # 手工操作 —— 穿孔卡片 # 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数 ...

  6. 大数据项目之_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. ...

  7. python并发_线程

    关于进程的复习: # 管道 # 数据的共享 Manager dict list # 进程池 # cpu个数+1 # ret = map(func,iterable) # 异步 自带close和join ...

  8. [转] ROS2源码编译和安装

    机器人开源操作系统软件ROS在10年后, 终于推出全新架构的ROS2,代号“ardent”.中文意思为“热心的美洲鳖”,看来ROS2要从ROS1的“海龟”变成“土鳖”系列了. 与此同时,ROS2的编译 ...

  9. python 全栈开发,Day34(基于UDP协议的socket)

    昨日内容回顾 网络的基础概念arp协议 :通过ip地址找到mac地址五层模型 : 应用层 传输层 网络层 数据链路层 物理层tcp协议 : 可靠的 面向连接 全双工 三次握手 四次挥手udp协议 : ...

随机推荐

  1. ubuntu 连不上网怎么办?

    [简洁版本] ctrl+alt+delete -> 任务管理器 ->"服务"选项卡 -> 运行"VMnet""VMware" ...

  2. Python自学教程12-类和对象怎么用

    Python是一门现代化的编程语言,也是一门面向对象的编程语言. 现代编程语言几乎都支持面向对象编程,面向对象编程是最有效的软件编写方法之一.你可以用类和对象来表示现实当中的任何的事物和行为. 编写类 ...

  3. rh358 003 ansible部署双网卡绑定 DNS原理 bind正向解析

    双网卡绑定 绑定多张网卡成为逻辑口,从而实现链路冗余,以及数据流量的负载均衡 1.创建team口 [root@servera ~]# nmcli connection add type team co ...

  4. KingbaseESV8R6临时表和全局临时表

    临时表概述 临时表用于存放只存在于事务或会话期间的数据.临时表中的数据对会话是私有的,每个会话只能看到和修改自己会话的数据. 您可以创建全局(global)临时表或本地(locall)临时表. 下表列 ...

  5. KingbaseES V8R3 由于修改系统时间导致sys_rman备份故障案例

    ​ 案例说明: 此案例,为复现"current time may be rewound"错误.对于数据库环境,在使用前必须保证系统时间的正确性.如果数据库创建后,再将系统时间修改为 ...

  6. Dart 2.18 正式发布

    互操作性增强.平台特定的网络组件.优化类型推断,以及空安全语言里程碑的近期更新 文/ Michael Thomsen, Google Flutter & Dart 产品经理 Dart 2.18 ...

  7. csrf跨站请求伪造、csrf相关装饰器、auth认证模块、基于django中间件设计项目功能

    目录 csrf跨站请求网站 什么是csrf跨站请求网站 经典例子-钓鱼网站 模拟 如何避免这种现象(预防) 如何在django中解决这个问题 form表单 ajax csrf相关装饰器 FBV CBV ...

  8. 萌新码农的第一篇:MarkDown的使用方法

    MarkDown的使用方法 使用的编辑软件Typora 1.标题的使用方法 输入''#''然后空格,输入标题名字即可生成标题. 随着''#''的增多,标题的大小会依次减小,最多到六级标题 2.排字 字 ...

  9. 【项目实战】自备相机+IMU跑通Vins-Mono记录

    前言 初次接触SLAM,公司要求用自己的设备来跑通vinsmono这个程序,虽然已经跑通了别人的数据包,但是真正自己上手来运行这个程序,发现真的是困难重重,特意在此记载下来整个过程,以供大家参考. 我 ...

  10. harbor官方关于创建https的有关命令

    官方地址:https://goharbor.io/docs/2.0.0/install-config/configure-https/ 命令总结: openssl genrsa -out ca.key ...