首页 > 编程语言 >ROS2时间同步(python)

ROS2时间同步(python)

时间:2022-10-28 16:22:49浏览次数:63  
标签:node 同步 rclpy python self num msg import ROS2

最近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='[email protected]',
    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,恰好与设置周期同等,结果显示如下:

 

 

标签:node,同步,rclpy,python,self,num,msg,import,ROS2
From: https://www.cnblogs.com/tangjunjun/p/16803149.html

相关文章

  • Python 简易版贪食蛇(源代码)
    Python简易版贪食蛇简易版贪食蛇代码如下,直接运行即可。1.效果图2.源代码源代码如下:#!/usr/bin/envpython#-*-coding:utf-8-*-importpygameaspygameimp......
  • 使用python 绘制中国人口热气图
    使用pythonmatlib绘制热力图绘制世界地图点击查看代码importmatplotlib.pyplotaspltfrommpl_toolkits.basemapimportBasemapplt.figure(figsize=(16,8))m......
  • python-threading.Event()
    threading模块提供Event类实现线程之间的通信threading.Event可以使一个线程等待其他线程的通知。其内置了一个标志,初始值为False。线程通过wait()方法进入等待状态,直到另......
  • python 脚本实现XCode自动打包/上传蒲公英/钉钉机器人通知
    通常我们使用XCode打包要archive然后导出,然后上传到蒲公英,再然后拿到蒲公英的截图去打包群里通知打包完成,既然这些动作都是由一个个步骤完成,那么何不使用python写一个脚......
  • Linux配置NTP时间同步
    1、检查系统是否安装了NTP包(linux系统一般自带NTP4.2)没有安装我们直接使用yum命令在线安装:yuminstallntp2、NTP服务端配置文件编辑vim/etc/ntp.conf添加服务器NTP服务器......
  • 求大神解答:利用python爬取各县GDP结果为空,求大神看看我的代码问题在哪?
    目标url=红黑人口库代码importrequestsfromlxmlimportetreeimporttimeif__name__=='__main__':  url='https://pagead2.googlesyndication.com/getconfig/soda......
  • python3.9不支持win7
    安装:Anaconda3-2022.10-Windows-x86_64.exe会报错:FailedtocreateAnacondamenus详细信息:ErrorloadingPythonDLLxxxpython39.dll,LoadLibrary:PyInstaller:Forma......
  • python自学 简单的网站开发 1
     URL路由配置 1、先在PyCharm中创建个Django项目,然后在PyCharm中的终端窗口输入。pythonmanage.pystartappmyapp 创建一个名字为myapp的应用2、然后在终......
  • c# - mono - 调用 python 脚本 .py 文件
    c#-mono-调用python脚本.py文件一、定义命令行工具:在windows下是cmd.exe,在mac下使用bash。二、踩过的坑使用Process类,启动一个“命令行工具”,在通过向标准......
  • python - 字符串、日期时间转+格式化
    python-字符串、日期时间转+格式化 #!/usr/bin/envpython3#coding=utf-8importosimportsysimportargparseimportcodecsimporttime,datetimedeftest():#"24/......