当前位置: 首页 > news >正文

【ROS2】ROS2 与 ROS1 编码方式对比(Python实现)

目录

  • 一、初始化和关闭节点
  • 二、发布者
  • 三、订阅者
  • 四、服务端
  • 五、客户端
  • 六、参数管理
  • 七、日志记录
  • 八、生命周期管理

ROS2 在 Python 编程中引入了一些新的概念和 API,这些变化使得代码更加模块化和易于维护。特别是 rclpy 库提供了更丰富的功能和更好的错误处理机制,同时支持异步编程模型。如果你已经熟悉 ROS1 的 Python 编程,这些变化应该不会太难适应。

一、初始化和关闭节点

ROS1:

import rospydef main():rospy.init_node('my_node', anonymous=True)# 节点逻辑rospy.spin()if __name__ == '__main__':main()

ROS2:

import rclpy
from rclpy.node import Nodeclass MyNode(Node):def __init__(self):super().__init__('my_node')# 节点逻辑def main(args=None):rclpy.init(args=args)node = MyNode()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

二、发布者

ROS1:

import rospy
from std_msgs.msg import Stringdef talker():pub = rospy.Publisher('chatter', String, queue_size=10)rospy.init_node('talker', anonymous=True)rate = rospy.Rate(10)  # 10 Hzwhile not rospy.is_shutdown():hello_str = "hello world %s" % rospy.get_time()rospy.loginfo(hello_str)pub.publish(hello_str)rate.sleep()if __name__ == '__main__':try:talker()except rospy.ROSInterruptException:pass

ROS2:

import rclpy
from rclpy.node import Node
from std_msgs.msg import Stringclass Talker(Node):def __init__(self):super().__init__('talker')self.publisher_ = self.create_publisher(String, 'chatter', 10)timer_period = 1  # secondsself.timer = self.create_timer(timer_period, self.timer_callback)def timer_callback(self):msg = String()msg.data = f'Hello World {self.get_clock().now().nanoseconds // 1000000}'self.get_logger().info(f'Publishing: "{msg.data}"')self.publisher_.publish(msg)def main(args=None):rclpy.init(args=args)node = Talker()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

三、订阅者

ROS1:

import rospy
from std_msgs.msg import Stringdef callback(data):rospy.loginfo(rospy.get_caller_id() + " I heard %s", data.data)def listener():rospy.init_node('listener', anonymous=True)rospy.Subscriber('chatter', String, callback)rospy.spin()if __name__ == '__main__':listener()

ROS2:

import rclpy
from rclpy.node import Node
from std_msgs.msg import Stringclass Listener(Node):def __init__(self):super().__init__('listener')self.subscription = self.create_subscription(String, 'chatter', self.listener_callback, 10)self.subscription  # prevent unused variable warningdef listener_callback(self, msg):self.get_logger().info(f'I heard: "{msg.data}"')def main(args=None):rclpy.init(args=args)node = Listener()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

四、服务端

ROS1:

import rospy
from std_srvs.srv import AddTwoIntsdef handle_add_two_ints(req):rospy.loginfo(f"Returning [{req.a} + {req.b} = {req.a + req.b}]")return AddTwoIntsResponse(req.a + req.b)def add_two_ints_server():rospy.init_node('add_two_ints_server')s = rospy.Service('add_two_ints', AddTwoInts, handle_add_two_ints)rospy.spin()if __name__ == "__main__":add_two_ints_server()

ROS2:

import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoIntsclass AddTwoIntsService(Node):def __init__(self):super().__init__('add_two_ints_server')self.srv = self.create_service(AddTwoInts, 'add_two_ints', self.add_two_ints_callback)def add_two_ints_callback(self, request, response):response.sum = request.a + request.bself.get_logger().info(f'Returning [{request.a} + {request.b} = {response.sum}]')return responsedef main(args=None):rclpy.init(args=args)node = AddTwoIntsService()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

五、客户端

ROS1:

import rospy
from std_srvs.srv import AddTwoIntsdef add_two_ints_client(x, y):rospy.wait_for_service('add_two_ints')try:add_two_ints = rospy.ServiceProxy('add_two_ints', AddTwoInts)resp1 = add_two_ints(x, y)return resp1.sumexcept rospy.ServiceException as e:print(f"Service call failed: {e}")if __name__ == "__main__":rospy.init_node('add_two_ints_client')x = 1y = 2print(f"Requesting {x}+{y}")print(f"{x} + {y} = {add_two_ints_client(x, y)}")

ROS2:

import rclpy
from rclpy.node import Node
from example_interfaces.srv import AddTwoIntsclass AddTwoIntsClient(Node):def __init__(self):super().__init__('add_two_ints_client')self.cli = self.create_client(AddTwoInts, 'add_two_ints')while not self.cli.wait_for_service(timeout_sec=1.0):self.get_logger().info('service not available, waiting again...')self.req = AddTwoInts.Request()def send_request(self, a, b):self.req.a = aself.req.b = bself.future = self.cli.call_async(self.req)def main(args=None):rclpy.init(args=args)node = AddTwoIntsClient()node.send_request(16, 2)while rclpy.ok():rclpy.spin_once(node)if node.future.done():try:response = node.future.result()except Exception as e:node.get_logger().info(f'Service call failed {e}')else:node.get_logger().info(f'Result of add_two_ints: {response.sum}')breaknode.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

六、参数管理

ROS1:

在ROS1中,参数管理是通过全局参数服务器来实现的。

import rospydef main():rospy.init_node('my_node', anonymous=True)# 获取参数param_value = rospy.get_param('param_name', 'default_value')rospy.loginfo(f"Parameter value: {param_value}")# 设置参数rospy.set_param('param_name', 'new_value')if __name__ == '__main__':main()

ROS2:

在ROS2中,参数管理更加灵活,支持类型安全的参数接口和参数描述符。

import rclpy
from rclpy.node import Nodeclass MyNode(Node):def __init__(self):super().__init__('my_node')# 获取参数param_value = self.get_parameter('param_name').get_parameter_value().string_valueself.get_logger().info(f"Parameter value: {param_value}")# 设置参数self.set_parameters([rclpy.parameter.Parameter('param_name', rclpy.Parameter.Type.STRING, 'new_value')])def main(args=None):rclpy.init(args=args)node = MyNode()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

七、日志记录

ROS1:

在ROS1中,日志记录使用 rospy 提供的函数。

import rospydef main():rospy.init_node('my_node', anonymous=True)rospy.loginfo("This is an info message.")rospy.logwarn("This is a warning message.")rospy.logerr("This is an error message.")rospy.logfatal("This is a fatal message.") if __name__ == '__main__':main()

ROS2:

在ROS2中,日志记录使用 rclpy 提供的函数。

import rclpy
from rclpy.node import Nodeclass MyNode(Node):def __init__(self):super().__init__('my_node')self.get_logger().info("This is an info message.")self.get_logger().warning("This is a warning message.")self.get_logger().error("This is an error message.")self.get_logger().fatal("This is a fatal message.")def main(args=None):rclpy.init(args=args)node = MyNode()rclpy.spin(node)node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()

八、生命周期管理

ROS1:

ROS1没有内置的生命周期管理功能,通常需要开发者自己实现节点的生命周期管理。

ROS2:

ROS2引入了生命周期管理,允许更精细地控制节点的启动和停止过程。

import rclpy
from rclpy.lifecycle import Node, State, TransitionCallbackReturn
from rclpy.node import Node as BaseNodeclass LifecycleNode(Node):def __init__(self):super().__init__('lifecycle_node')def on_configure(self, state: State) -> TransitionCallbackReturn:self.get_logger().info('on_configure() is called.')return TransitionCallbackReturn.SUCCESSdef on_activate(self, state: State) -> TransitionCallbackReturn:self.get_logger().info('on_activate() is called.')return TransitionCallbackReturn.SUCCESSdef on_deactivate(self, state: State) -> TransitionCallbackReturn:self.get_logger().info('on_deactivate() is called.')return TransitionCallbackReturn.SUCCESSdef on_cleanup(self, state: State) -> TransitionCallbackReturn:self.get_logger().info('on_cleanup() is called.')return TransitionCallbackReturn.SUCCESSdef on_shutdown(self, state: State) -> TransitionCallbackReturn:self.get_logger().info('on_shutdown() is called.')return TransitionCallbackReturn.SUCCESSdef main(args=None):rclpy.init(args=args)node = LifecycleNode()executor = rclpy.executors.SingleThreadedExecutor()executor.add_node(node)try:executor.spin()except KeyboardInterrupt:passnode.on_shutdown(State(id=9, label='unconfigured'))node.destroy_node()rclpy.shutdown()if __name__ == '__main__':main()


欢迎大家加QQ群,一起讨论学习:894013891

相关文章:

【ROS2】ROS2 与 ROS1 编码方式对比(Python实现)

目录 一、初始化和关闭节点二、发布者三、订阅者四、服务端五、客户端六、参数管理七、日志记录八、生命周期管理 ROS2 在 Python 编程中引入了一些新的概念和 API,这些变化使得代码更加模块化和易于维护。特别是 rclpy 库提供了更丰富的功能和更好的错误处理机制&a…...

ElasticSearch的下载和基本使用(通过apifox)

1.概述 一个开源的高扩展的分布式全文检索引擎,近乎实时的存储,检索数据 2.安装路径 Elasticsearch 7.8.0 | Elastic 安装后启动elasticsearch-7.8.0\bin里的elasticsearch.bat文件, 启动后就可以访问本地的es库http://localhost:9200/ …...

城市轨道交通运营控制指挥中心设计方案

为某城市轨道交通运营控制指挥中心(OCC)的设计提供方案时,我们需要考虑到多个方面的需求,包括系统架构、设备选择、功能实现、数据流与监控、通信管理等。以下是一个综合性的设计方案,涉及系统硬件和软件的选择、布局规划、安全性等方面,以确保指挥中心的高效运作、实时监…...

多目标优化算法:多目标河马优化算法(MOHOA)求解ZDT1、ZDT2、ZDT3、ZDT4、ZDT6,提供完整MATLAB代码

一、河马优化算法 河马优化算法(Hippopotamus optimization algorithm,HO)由Amiri等人于2024年提出的一种模拟自然界中河马觅食行为的新型群体智能优化算法。该算法由Mohammad Hussein Amiri等人于2024年2月发表在Nature旗下子刊《Scientifi…...

线程与进程的个人理解

进程(Process): 一个程序在执行时,操作系统为其分配的资源(如内存、CPU 时间等)构成了一个进程。每个进程都有自己的独立的地址空间、堆栈和局部变量,它们之间不共享内存(除非通过特…...

vscode的项目给gitlab上传

目录 一.创建gitlab帐号 二.在gitlab创建项目仓库 三.Windows电脑安装Git 四.vscode项目git上传 一.创建gitlab帐号 二.在gitlab创建项目仓库 图来自:Git-Gitlab中如何创建项目、创建Repository、以及如何删除项目_gitlab新建项目-CSDN博客) 三.Windows电脑安…...

企业微信定位打卡

废话少说:定位修改软件链接奉上 一、定位打卡原理 GPS定位:企业微信可以利用手机的GPS功能进行定位,这是一种基于卫星的定位技术,能够提供相对精确的位置信息,通常精确度在20米以内。这种方式耗电较大,且在…...

libaom 源码分析:码率控制介绍

码率控制 命令行码率控制选项:可以看到码率控制包括丢帧、resize、超分、码控模式、目标码率、目标上限下限(类似 x264、x265 中的 VBV)、码控偏置、GOP 码率等。Rate Control Options:--drop-frame=<arg> Temporal resampling threshold (buf %)--resize-mo…...

RK3568平台开发系列讲解(DMA篇)DMA engine使用

🚀返回专栏总目录 文章目录 一、申请DMA channel二、配置DMA channel的参数三、获取传输描述(tx descriptor)四、启动传输沉淀、分享、成长,让自己和他人都能有所收获!😄 📢DMA子系统下有一个帮助测试的测试驱动(drivers/dma/dmatest.c), 从这个测试驱动入手我们了解…...

C++中的函数对象

C 中函数对象的定义和特点 定义&#xff1a;函数对象&#xff08;Function Object&#xff09;也叫仿函数&#xff08;Functor&#xff09;&#xff0c;是一个类&#xff0c;这个类重载了函数调用运算符()。当创建这个类的对象后&#xff0c;可以像使用函数一样使用这个对象&am…...

Linux指标之平均负载(The Average load of Linux Metrics)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…...

盛最多水的容器

本节将数组与坐标轴共同组成一个容器,通过改变容器的两个端点使容器装的水最多,容器两个端点不断移动可以通过左右指针算法解决. 问题描述: 给定两个非负整数k1,k2...km每个数代表坐标中的一个点(i,ki).在坐标内绘制m条垂线,垂直线i的两个端点分别为(i,k1)和(i,0)找出其中的两…...

光伏功率预测!Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型时序预测

目录 预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Transformer-LSTM、Transformer、CNN-LSTM、LSTM、CNN五模型多变量时序光伏功率预测 (Matlab2023b 多输入单输出) 1.程序已经调试好&#xff0c;替换数据集后&#xff0c;仅运行一个main即可运行&#xff0c;数据格式…...

java全栈day10--后端Web基础(基础知识)

引言&#xff1a;只要能通过浏览器访问的网站全是B/S架构&#xff0c;其中最常用的服务器就是Tomcat 在浏览器与服务器交互的时候采用的协议是HTTP协议 一、Tomcat服务器 1.1介绍 官网地址&#xff1a;Apache Tomcat - Welcome! 1.2基本使用(网上有安装教程&#xff0c;建议…...

使用爬虫时,如何确保数据的准确性?

在数字化时代&#xff0c;数据的准确性对于决策和分析至关重要。本文将探讨如何在使用Python爬虫时确保数据的准确性&#xff0c;并提供代码示例。 1. 数据清洗 数据清洗是确保数据准确性的首要步骤。在爬取数据后&#xff0c;需要对数据进行清洗&#xff0c;去除重复、无效和…...

Burp入门(4)-扫描功能介绍

声明&#xff1a;学习视频来自b站up主 泷羽sec&#xff0c;如涉及侵权马上删除文章 感谢泷羽sec 团队的教学 视频地址&#xff1a;burp功能介绍&#xff08;1&#xff09;_哔哩哔哩_bilibili 本文介绍burp的主动扫描和被动扫描功能。 一、主动扫描 工作原理&#xff1a; 主动…...

Tourtally:颠覆传统的AI智能旅行规划革命

# Tourtally&#xff1a;颠覆传统的AI智能旅行规划革命 在快速变化的旅行科技世界里&#xff0c;一个划时代的平台正在重新定义我们探索世界的方式。让我们一起认识 Tourtally&#xff0c;这个由人工智能驱动的旅行规划助手&#xff0c;正在彻底改变旅行体验。 ## 旅行规划的…...

chrome允许http网站打开摄像头和麦克风

第一步 chrome://flags/#unsafely-treat-insecure-origin-as-secure 第二步 填入网址&#xff0c;点击启用 第三步 重启 Chrome&#xff1a;设置完成后&#xff0c;点击页面底部的 “Relaunch” 按钮&#xff0c;重新启动 Chrome 浏览器&#xff0c;使更改生效。...

视觉经典神经网络与复现:深入解析与实践指南

目录 引言 经典视觉神经网络模型详解 1. LeNet-5&#xff1a;卷积神经网络的先驱 LeNet-5的关键特点&#xff1a; 2. AlexNet&#xff1a;深度学习的突破 AlexNet的关键特点&#xff1a; 3. VGGNet&#xff1a;深度与简洁的平衡 VGGNet的关键特点&#xff1a; 4. ResNe…...

ByConity ELT 测试体验

在实际业务中&#xff0c;用户会基于不同的产品分别构建实时数仓和离线数仓。其中&#xff0c;实时数仓强调数据能够快速入库&#xff0c;且在入库的第一时间就可以进行分析&#xff0c;低时延的返回分析结果。而离线数仓强调复杂任务能够稳定的执行完&#xff0c;需要更好的内…...

Zotero插件Ethereal Style:打造高效文献管理新体验

Zotero插件Ethereal Style&#xff1a;打造高效文献管理新体验 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件&#xff0c;提供了一系列功能来增强 Zotero 的用户体验&#xff0c;如阅读进度可视化和标签管理&#xff0c;适合研究人员和学者。 项目地址: ht…...

巨有科技:银发文旅风口来了!康养旅游这样做才赚

随着老龄化社会加深与全民健康意识提升&#xff0c;康养旅游成为2026年文旅行业最具潜力的风口赛道&#xff0c;银发旅游群体持续壮大&#xff0c;成为文旅市场核心增量。但当下康养旅游普遍存在产品单一、服务不专业、运营不规范、适配性不足等问题&#xff0c;传统观光式旅游…...

从‘调不出来’到‘一次过流片’:折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧

从‘调不出来’到‘一次过流片’&#xff1a;折叠共源共栅放大器设计中那些没人告诉你的‘坑’与调试技巧 在模拟电路设计的江湖里&#xff0c;折叠共源共栅&#xff08;Folded Cascode&#xff09;放大器就像一位身怀绝技却性格古怪的武林高手——性能强悍但极难驯服。许多工…...

小白程序员必看:收藏这份上下文工程指南,轻松玩转大模型!

本文深入浅出地介绍了上下文工程在大语言模型中的重要性&#xff0c;阐述了指令、示例、知识、记忆、工具和安全护栏等六种上下文类型。文章详细解析了上下文工程的四个基本阶段&#xff1a;撰写上下文、选择上下文、压缩上下文和隔离上下文&#xff0c;并强调了上下文窗口的作…...

新手友好:在快马平台用mc、jc相关案例轻松上手前端开发

作为一个刚接触前端开发的新手&#xff0c;我最近在InsCode(快马)平台尝试做了一个特别适合练手的小工具——代码行数统计器。这个项目用最基础的HTML、CSS和JavaScript实现&#xff0c;但包含了前端开发的几个核心概念&#xff0c;特别适合想通过实际案例学习的朋友。 项目功能…...

PFC3D模拟含纤维混凝土材料单轴压缩破坏

PFC3D含纤维混凝土材料单轴压缩破坏模拟去年在实验室折腾PFC3D模拟含纤维混凝土压缩破坏的时候&#xff0c;发现这玩意儿真是让人又爱又恨。纤维像调皮的孩子&#xff0c;在混凝土基体里各种"搞事情"&#xff0c;今天就跟大家唠唠这个"微观破坏现场"的观察…...

陶瓷淬火时“啪“一声裂开的瞬间,背后藏着相场模型里的连续损伤演化。今天咱们用Matlab玩个热应力场+相场断裂的耦合计算,看看脆性材料怎么被温度场玩坏

matlab相场热力耦合断裂问题&#xff0c;陶瓷淬火算例&#xff0c;paraview可视化先上主菜——相场控制方程。核心是温度场T与相场d的相爱相杀&#xff1a; % 热传导方程残差计算 function R_T calc_heat_residual(T, d, dt)kappa 1e-5; % 热扩散系数grad_T gradient(T);R_T…...

拯救大模型“幻觉”?Python RAG九大架构全解析

别让你的AI助手&#xff0c;从“得力员工”变成“职场骗子” 你是否也曾被大模型的“一本正经胡说八道”气到无语&#xff1f; 你精心部署的客服机器人&#xff0c;自信地告诉客户&#xff1a;“我们的退货政策是90天&#xff01;”——而实际上&#xff0c;公司的规定是30天…...

GLM-OCR开发者实操手册:Gradio client调用+批量图片识别脚本示例

GLM-OCR开发者实操手册&#xff1a;Gradio client调用批量图片识别脚本示例 你是不是也遇到过这样的场景&#xff1a;手头有一堆发票、合同或者产品说明书图片&#xff0c;需要把里面的文字、表格甚至公式都提取出来&#xff1f;一张张手动录入或者用传统OCR工具&#xff0c;不…...

基于PLC1200的水箱液位解耦控制系统(过程控制课程设计) #笔记学习资料 内含: 1

基于PLC1200的水箱液位解耦控制系统&#xff08;过程控制课程设计&#xff09; #笔记学习资料 内含&#xff1a; 1.PLC控制程序&#xff08;博图V18&#xff09; 2.设计报告&#xff08;pdf版本&#xff0c;详细介绍整个项目设计方案、Simulink仿真模型结构图、仿真结果、PLC梯…...