【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]_…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

基于FPGA的PID算法学习———实现PID比例控制算法
基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...