【ROS2】ROS2 C++版本 与 Python版本比较

ROS 系列学习教程(总目录)
ROS2 系列学习教程(总目录)
目录
- 一、功能包的构建方式
- 二、功能包组织结构
- 三、代码编写
- 四、性能与效率
- 五、兼容性
- 六、应用场景
目前ROS开发主要使用 C++ 和 Python 语言,这里会分别实现并讲解。
相较于ROS1,ROS2的 C++ 和 Python 版本相差比较大。
一、功能包的构建方式
C++:
- 构建系统:通常使用 CMake 或 ament_cmake 作为构建系统。
- 构建文件:需要编写 CMakeLists.txt 文件来描述如何构建C++代码。
- 构建命令:使用 colcon build 命令进行构建,可以指定构建类型(如Release或Debug)和选择构建哪些包。
Python:
- 构建系统:使用 ament_python 作为构建系统。
- 构建文件:需要编写 setup.py 文件来描述如何构建Python包。
- 构建命令:同样使用 colcon build 命令进行构建。
二、功能包组织结构
C++包:
- 描述构建与安装方式的文件(CMakeLists.txt)。
- 元信息文件(package.xml)。
- 公共头文件目录(include)。
- 源代码目录(src)。
- 测试目录(test,可选)

Python包:
- 描述构建与安装方式的文件(setup.py)。
- 元信息文件(package.xml)
- 源代码目录。
- 包的配置文件(setup.cfg,可选)
- 资源文件目录(resource,可选,用于存放特定资源)
- 测试目录(test,可选)

三、代码编写
C++:
- 节点创建:通常通过继承rclcpp::Node类的方式来创建节点对象,这有助于在一个进程内组织多个节点,提高节点间的通信效率。
- 代码组织:C++代码通常按照类的方式进行组织,注重代码的结构和封装。
- 编译要求:C++代码需要编译成可执行文件才能运行。
Python:
- 节点创建:虽然也可以通过实例化rclcpp.Node类的方式来创建节点对象,但更推荐的做法是定义一个Python类并继承rclcpp.Node类。
- 代码组织:Python代码注重简洁和易读性,通常使用函数和类来组织代码。
- 解释执行:Python代码是解释执行的,不需要编译成可执行文件。
四、性能与效率
C++提供了高性能和低层级控制,适合编写复杂的算法和底层系统。而Python则以其简洁和易读性著称,但在性能上可能不如C++。Python的开发效率通常高于C++,因为Python代码更容易编写和调试。然而,这也取决于开发者的个人偏好和熟练程度。
C++:
- 高效性能:C++是一种编译型语言,具有高效性能和低内存占用的特点。在ROS2中使用C++可以充分发挥硬件的性能优势,实现实时控制和高速通信。
- 底层控制:C++提供了对底层硬件和操作系统的直接访问,适合编写需要高性能和低延迟的算法和系统。
Python:
- 简洁性:Python语言简洁易读,易于学习和使用。
- 动态性:Python是一种解释型语言,无需编译,适合快速开发和原型设计。
- 性能提升:Python 3相对于Python 2在性能上有一定的提升,但在实时性和低延迟方面仍不如C++。
五、兼容性
-
C++:因为ROS2的许多核心组件和库都是用C++编写的,C++在ROS2中具有很好的兼容性。这使得C++在ROS2中的使用更加广泛和深入。
-
Python:ROS2 主要采用 Python3 作为其默认的Python版本。由于 Python3 与 Python2 在某些方面存在一些不兼容的变化,因此在迁移到ROS2时,需要重新编写或调整现有的Python编写的ROS1代码。然而,ROS2提供了针对Python的完整的API,包括用于创建ROS节点、发布和订阅消息、调用和提供服务等功能,这大大降低了迁移的难度。
六、应用场景
C++:
- 实时控制:C++适合编写需要实时控制和高速通信的机器人系统,如自动驾驶汽车、工业机器人等。
- 底层系统:C++适合编写底层系统,如操作系统、驱动程序等。
Python:
- 快速原型设计:Python适合用于快速原型设计和算法验证,因为其易于上手和学习的特点可以缩短开发周期。
- 数据处理与分析:Python拥有丰富的数据处理和分析库,适合用于机器人系统中的数据处理和分析任务。
相关文章:
【ROS2】ROS2 C++版本 与 Python版本比较
ROS 系列学习教程(总目录) ROS2 系列学习教程(总目录) 目录 一、功能包的构建方式二、功能包组织结构三、代码编写四、性能与效率五、兼容性六、应用场景 目前ROS开发主要使用 C 和 Python 语言,这里会分别实现并讲解。 相较于ROS1,ROS2的 C 和 Python …...
物联网射频识别和RFID开发(一):RFID基础—概念、应用
一、RFID的发展历史 二、RFID与物联网 (一)物联网与RFID的关系 物联网的基本思想是美国麻省理工学院在1999年提出的,其核心思想是为全球每个物品提供唯一的电子标识符。这种电子标识符就是现在经常提到的“电子产品编码(Electronic Product …...
JVM:即时编译器,C2 Compiler,堆外内存排查
1,即时编译器 1.1,基本概念 常见的编译型语言如C,通常会把代码直接编译成CPU所能理解的机器码来运行。而Java为了实现“一次编译,处处运行”的特性,把编译的过程分成两部分,首先它会先由javac编译成通用的…...
webpack5 的五大核心配置(二)
webpack主要构成部分: entry 入口output 出口loaders 转化器plugins 插件mode 模式devServer 开发服务器 webpack.config.js 配置文件基本格式 module.exports{//入口文件entry:{},//出口文件output:{},//module rules loadersmodule{};//插件plugins:[],//开发…...
【查询基础】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
git push使用
推送指定分支 将当前分支推送远程 git push origin HEAD:<branch-name> 这里的 HEAD 是一个特殊的指针,它指向当前分支的最新提交。这条命令会将当前分支的更改推送到远程的 master 分支。 示例 git push origin HEAD:main 当前分支是test,远…...
【iOS】多线程基础
【iOS】多线程基础 文章目录 【iOS】多线程基础前言进程与线程进程进程的状态进程的一个控制结构进程的上下文切换 线程为什么要用线程什么是线程线程和进程的关系线程的上下文切换 线程和进程的优缺点 小结 前言 笔者由于对于GCD不是很了解,导致了项目中网络请求哪…...
常用网站网址
目录 1.docker hub2.csdn 1.docker hub https://image.cgdcgd.cc/ 2.csdn https://www.csdn.net/ ...
go语言切片
切片 切片是一种数据结构,这种数据结构便于使用和管理数据集合。切片是围绕动态数组的概念构建的,可以按需自动增长和缩小。切片的动态增长是通过内置函数 append 来实现的。这个函数可以快速且高效地增长切片。还可以通过对切片再次切片来缩小一个切片的…...
鸿蒙NEXT元服务:利用App Linking实现无缝跳转与二维码拉起
【效果】 元服务链接格式(API>12适用):https://hoas.drcn.agconnect.link/ggMRM 【参考网址】 使用App Linking实现元服务跳转:文档中心 草料二维码:草料二维码生成器 【引言】 本文将详细介绍如何使用App Lin…...
网络药理学之薛定谔Schrödinge Maestro:6、分子对接(Glide、Ligand docking)和可视化
本人是win11,薛定谔版本是12.9。 官网:https://www.schrodinger.com/ 本篇文章的示例大分子蛋白PDB ID为4KNN,小分子配体的MOL ID为MOL004004。 本文部分图源来自知乎https://zhuanlan.zhihu.com/p/416698194,推荐为原作者贡献阅读…...
已解决ModuleNotFoundError: No module named ‘selenium‘
1. 错误提示 ModuleNotFoundError: No module named selenium,这意味着你试图导入一个名为 selenium 的模块,但Python找不到这个模块 2. 解决方案 安装缺失的模块: 如果你确定模块名称正确但仍然收到这个错误,那么可能是你没有安装这个模块…...
【Maven】依赖冲突如何解决?
准备工作 1、创建一个空工程 maven_dependency_conflict_demo,在 maven_dependency_conflict_demo 创建不同的 Maven 工程模块,用于演示本文的一些点。 什么是依赖冲突? 当引入同一个依赖的多个不同版本时,就会发生依赖冲突。…...
什么是EMS
EMS是能量管理系统(Energy Management System)的缩写,是一种集成的技术解决方案,旨在帮助企业和组织更有效地管理和优化其能源使用。EMS通过收集、分析和报告能源数据来识别节能机会,并提供工具以实施改进措施。 主要…...
26页PDF | 数据中台能力框架及评估体系解读(限免下载)
一、前言 这份报告详细解读了数据中台的发展历程、核心概念、能力框架及成熟度评估体系。它从阿里巴巴的“大中台,小前台”战略出发,探讨了数据中台如何通过整合企业内部的数据资源和能力,加速业务迭代、降低成本,并推动业务增长…...
【Vue3】【Naive UI】< a >标签
【Vue3】【Naive UI】< a >标签 超链接及相关属性其他属性 【VUE3】【Naive UI】<NCard> 标签 【VUE3】【Naive UI】<n-button> 标签 【VUE3】【Naive UI】<a> 标签 <a> 标签HTML中的一个锚&…...
分页查询日期格式不对
方式一:在属性上加入注解,对日期进行格式化 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理 /*** 统一转换处理扩展spring mvc* 后端返回前端的进行统一转化处理* param converters*/Overrideprotected voi…...
DAY140权限提升-Linux系统权限提升篇VulnhubPATH变量NFS服务Cron任务配合SUID
一、演示案例-Linux系统提权-Web&普通用户-SUID-NFS安全 NFS是一种基于TCP/IP 传输的网络文件系统协议,通过使用NFS协议,客户机可以像访问本地目录一样访问远程服务器中的共享资源。 https://www.virtualbox.org/wiki/Downloads https://www.vuln…...
HTTPS 的应用数据是如何保证完整性的?
在 HTTPS 中,确保 应用数据的完整性 是通过以下几个关键机制来实现的: 消息认证码(MAC):用于确保数据在传输过程中未被篡改。加密:通过加密数据防止数据被窃取,并与 MAC 配合使用,确…...
Unity ShaderLab 实现3D物体描边
实现思路: 给物体添加第二个材质球,在shader的顶点着色器中使顶点的位置变大,然后在片元着色器中输出描边颜色。 shader Graph实现如下: ShaderLab实现如下: Shader "Custom/Outline" {Properties{[HDR]_…...
Java 语言特性(面试系列2)
一、SQL 基础 1. 复杂查询 (1)连接查询(JOIN) 内连接(INNER JOIN):返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
