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

ROS2创建Python与C++功能包指南以及什么是节点(ros2第一章)

究竟什么是节点

你提出了一个很好的问题!在 ROS 2 中,“节点”(Node)是一个核心概念,但初学者常常会困惑它到底是什么。让我详细解释一下:
🔍 什么是 ROS 2 节点?
在 ROS 2 中:
● 节点是 ROS 计算图中的基本执行单元
● 每个节点代表一个独立的进程,执行特定的任务
● 节点之间通过话题(Topics)、服务(Services) 和动作(Actions) 进行通信
● 一个节点通常对应一个特定的功能模块(如传感器驱动、控制算法、数据处理等)
📦 节点在代码中的体现
在你的代码中:

class PersonNode : public rclcpp::Node
{// ...
};int main()
{auto person_node = std::make_shared<PersonNode>("person_node", "Alice", 30);rclcpp::spin(person_node);
}

● PersonNode类继承自 rclcpp::Node,这表示它是一个节点类
● person_node是这个节点类的实例(对象)
● 当你调用 rclcpp::spin(person_node)时,你启动了节点实例的执行
🔄 节点生命周期

  1. 创建节点对象:auto person_node = std::make_shared(…)
    ○ 调用构造函数初始化节点
    ○ 设置节点名称(“person_node”)
    ○ 初始化成员变量(name, age)
  2. 启动节点:rclcpp::spin(person_node)
    ○ 让节点进入事件循环
    ○ 处理所有注册的回调(如定时器、订阅等)
    ○ 保持节点运行直到被终止
  3. 销毁节点:rclcpp::shutdown()
    ○ 清理资源
    ○ 退出节点
    🌐 节点在 ROS 2 生态系统中的位置
    [ROS 2 系统]
    ├── [节点1] - 传感器驱动
    ├── [节点2] - 数据处理
    ├── [你的节点] - PersonNode
    └── [节点3] - 控制执行
    ● 你的 PersonNode节点是 ROS 2 系统中的一部分
    ● 它可以与其他节点通信(虽然你的代码中还没有实现)
    ● 在终端中,你可以用 ros2 node list查看所有运行中的节点
    🧩 节点 vs 对象
    ● 节点类:定义节点的行为和能力(如 PersonNode类)
    ● 节点对象:节点的具体实例(如 person_node)
    ● 节点进程:当调用 rclcpp::spin()时,节点对象开始作为一个独立的进程运行
    🛠 如何让你的节点更有用?
    目前你的节点只打印日志,但在实际 ROS 2 应用中,节点通常会:
  4. 发布话题(Publish topics):
auto publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10);
  1. 订阅话题(Subscribe to topics):
auto subscription_ = this->create_subscription<std_msgs::msg::String>("chatter", 10, [this](const std_msgs::msg::String::SharedPtr msg) {RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());});
  1. 提供服务(Provide services):
auto service_ = this->create_service<example_interfaces::srv::AddTwoInts>("add_two_ints", [this](...) { /* 处理请求 */ });
  1. 使用参数(Use parameters):
this->declare_parameter("my_param", 0);
int param = this->get_parameter("my_param").as_int();

💡 总结
● 节点是 ROS 2 的基本执行单元,代表一个独立的功能模块
● 在你的代码中:
○ PersonNode是节点类(定义节点的行为)
○ person_node是节点对象(节点的具体实例)
○ rclcpp::spin(person_node)启动节点进程
● 一个节点可以包含多个组件(发布者、订阅者、服务、定时器等)
● 节点通过 ROS 2 的通信机制与其他节点交互
理解节点是掌握 ROS 2 的关键第一步!你现在创建了一个基本节点,下一步可以尝试添加通信功能让它与其他节点交互。

1-1创建python功能包

  1. ros2 pkg create --help
    ● 作用:查看 ros2 pkg create 命令的帮助信息,了解该命令的用法、可选参数等。
    ● 输出解释:
    ○ 首先显示命令的使用格式 ros2 pkg create [-h] … package_name,说明 package_name 是必须的位置参数(创建的包名)。
    ○ 接着列出了各种可选参数,比如 --package-format(指定 package.xml 的格式版本)、–description(包的描述信息)、–license(包使用的许可证)、–build-type(构建类型,如 ament_cmake、ament_python 等)、–dependencies(包的依赖)等,以及每个参数的作用说明。
  2. ros2 pkg create --build-type ament_python --license Apache-2.0
    ● 作用:尝试使用指定构建类型(ament_python)和许可证(Apache-2.0)创建 ROS 2 包,但由于缺少必须的位置参数 package_name(包名),所以命令执行出错。
    ● 输出解释:
    ○ 错误提示 ros2 pkg create: error: the following arguments are required: package_name,明确指出必须提供 package_name 参数,否则无法创建包。
  3. ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg
    ● 作用:使用 ament_python 构建类型、Apache-2.0 许可证,创建名为 demo_python_pkg 的 ROS 2 包。
    ● 输出解释:
    ○ 首先显示一些创建包的基本信息,如 package name: demo_python_pkg(包名)、destination directory: /home/crf/learning_library/ros/chapt3_wspy/src(包的目标创建目录)、package format: 3(package.xml 格式版本)、version: 0.0.0(包的版本)、description: TODO: Package description(包的描述,默认待完善)、maintainer: [‘crf crf@todo.todo’](维护者信息,默认基于系统用户信息)、licenses: [‘Apache-2.0’](许可证)、build type: ament_python(构建类型)、dependencies: [](依赖列表,当前为空)。
    ○ 然后显示创建的文件和目录结构,比如创建了 demo_python_pkg 文件夹,在其中生成了 package.xml(包的描述配置文件)、setup.py(Python 包的安装配置文件)、setup.cfg(配置文件)、resource 文件夹(资源目录)、test 文件夹(测试文件目录)以及 Python 包相关的 init.py 文件等,这些都是 ament_python 类型包的标准结构,用于后续编译、安装和运行包中的节点等功能。

源码

(base) crf@crf-G15-24:~/learning_library/ros/chapt3_wspy/src$ ros2 pkg create --helpusage: ros2 pkg create [-h] [--package-format {2,3}] [--description DESCRIPTION] [--license LICENSE]
[--destination-directory DESTINATION_DIRECTORY] [--build-type {cmake,ament_cmake,ament_python}]
[--dependencies DEPENDENCIES [DEPENDENCIES ...]] [--maintainer-email MAINTAINER_EMAIL] [--maintainer-name MAINTAINER_NAME]
[--node-name NODE_NAME] [--library-name LIBRARY_NAME]
package_nameCreate a new ROS 2 packagepositional arguments:package_name          The package nameoptions:
-h, --help            show this help message and exit
--package-format {2,3}, --package_format {2,3}The package.xml format.--description DESCRIPTIONThe description given in the package.xml--license LICENSE     The license attached to this package; this can be an arbitrary string, but a LICENSE file will only be generated if it is
one of the supported licenses (pass '?' to get a list)--destination-directory DESTINATION_DIRECTORYDirectory where to create the package directory--build-type {cmake,ament_cmake,ament_python}The build type to process the package with
--dependencies DEPENDENCIES [DEPENDENCIES ...]list of dependencies--maintainer-email MAINTAINER_EMAILemail address of the maintainer of this package--maintainer-name MAINTAINER_NAMEname of the maintainer of this package
--node-name NODE_NAMEname of the empty executable--library-name LIBRARY_NAMEname of the empty library(base) crf@crf-G15-24:~/learning_library/ros/chapt3_wspy/src$ ros2 pkg create --build-type ament_python --license Apache-2.0usage: ros2 pkg create [-h] [--package-format {2,3}] [--description DESCRIPTION] [--license LICENSE]
[--destination-directory DESTINATION_DIRECTORY] [--build-type {cmake,ament_cmake,ament_python}]
[--dependencies DEPENDENCIES [DEPENDENCIES ...]] [--maintainer-email MAINTAINER_EMAIL] [--maintainer-name MAINTAINER_NAME]
[--node-name NODE_NAME] [--library-name LIBRARY_NAME]
package_name
ros2 pkg create: error: the following arguments are required: package_name(base) crf@crf-G15-24:~/learning_library/ros/chapt3_wspy/src$ ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkggoing to create a new packagepackage name: demo_python_pkgdestination directory: /home/crf/learning_library/ros/chapt3_wspy/srcpackage format: 3version: 0.0.0description: TODO: Package description
maintainer: ['crf <crf@todo.todo>']licenses: ['Apache-2.0']build type: ament_pythondependencies: []creating folder ./demo_python_pkgcreating ./demo_python_pkg/package.xml
creating source folder
creating folder ./demo_python_pkg/demo_python_pkg
creating ./demo_python_pkg/setup.py
creating ./demo_python_pkg/setup.cfg
creating folder ./demo_python_pkg/resource
creating ./demo_python_pkg/resource/demo_python_pkg
creating ./demo_python_pkg/demo_python_pkg/__init__.py
creating folder ./demo_python_pkg/test
creating ./demo_python_pkg/test/test_copyright.py
creating ./demo_python_pkg/test/test_flake8.py
creating ./demo_python_pkg/test/test_pep257.py
(base) crf@crf-G15-24:~/learning_library/ros/chapt3_wspy/src$ 

1-2创建C++功能包

主要代码

ros2 pkg create --build-type ament_cmake --license Apache-2.0 demo_cpp_pkg

(最终包名 demo_cpp_pkg)
命令各部分解释:

  1. ros2 pkg createROS 2 的核心命令之一,用于创建新的功能包(package),功能包是 ROS 2 中组织代码、配置文件等资源的基本单位。
  2. –build-type ament_cmake指定功能包的构建系统类型:
    ○ ament_cmake 是 ROS 2 中用于 C++ 项目的主流构建类型,基于 CMake 工具链,支持编译 C++ 代码、链接库等。(如果是 Python 项目,通常用 --build-type ament_python)
  3. –license Apache-2.0指定功能包的开源许可证为 Apache License 2.0,这是 ROS 生态中常用的许可证之一,会自动在包中生成对应的 LICENSE 文件。
  4. demo_cpp_pkg功能包的名称,需符合 ROS 2 包名规范(小写字母、数字、下划线,不能有空格或特殊字符)。
    执行后会生成的目录结构(简化):
demo_cpp_pkg/
├── CMakeLists.txt       # CMake 构建配置文件(核心,指定编译规则)
├── package.xml          # 包的元信息(名称、依赖、许可证等,ROS 2 必须)
├── LICENSE              # Apache-2.0 许可证文本
├── include/demo_cpp_pkg/ # C++ 头文件存放目录(默认空)
└── src/                 # C++ 源文件存放目录(默认空)

2-colcon build 工作空间及运行ros2操作

1ROS 2 的一键编译 + 安装命令

colcon build

2启动自动生成的环境脚本

source install/setup.bash

● source
● 是 Bash 内置命令,用来在 当前终端环境 执行一个脚本。
● 与直接运行脚本(./script.sh)不同,source 会 保留脚本中对环境变量的修改,比如 PATH、PYTHONPATH 等。
● install/setup.bash
● 这是 ROS 2 或其他通过 colcon build 构建的工作空间自动生成的环境脚本。
● 作用是:
○ 设置 ROS 2 包路径
○ 设置 Python 路径
○ 配置环境变量以便能使用工作空间里的包

3和. install/setup.bash的区别

source install/setup.bash 在当前终端加载环境变量
. install/setup.bash 同上,更短的写法
./install/setup.bash 在子终端执行,不影响当前终端环境(ROS 2 会用不了)

4运行pyros文件

ros2 run demo_python_pkg person_node

ros2 run demo_python_pkg person_node 是 ROS 2 中用于运行指定功能包中可执行节点的命令,各部分含义如下:
命令拆解:

  1. ros2 runROS 2 的核心命令之一,用于启动功能包中编译好的可执行文件(节点)。
  2. demo_python_pkg功能包名称(package name),即你要运行的节点所在的包。这里指定的是一个 Python 类型的功能包(名称中包含 python,通常对应 --build-type ament_python 创建的包)。
  3. person_node可执行节点的名称(executable name),即你要启动的具体节点。这个名称通常在功能包的 setup.py(Python 包)或 CMakeLists.txt(C++ 包)中通过 entry_points 或 add_executable 定义,需与配置中的名称一致。
    执行该命令的前提:
  4. 功能包已正确编译:需先通过 colcon build 编译工作空间,确保 demo_python_pkg 中的 person_node 可执行文件被正确生成。
  5. 环境已刷新:编译后需执行 source install/setup.bash(或对应终端的配置文件,如 setup.zsh),让 ROS 2 识别到新编译的包和节点。
  6. 节点定义正确:在 demo_python_pkg 中,person_node 需对应一个有效的 Python 脚本(例如 person_node.py),且在 setup.py 中通过 entry_points 声明了节点入口.
http://www.dtcms.com/a/516620.html

相关文章:

  • wordpress可以建网站吗电子商务网站建设 教案
  • vr中xr射线长度调整
  • 怎样做微信挂机平台网站建设公司的网站首页
  • 【Go】P11 掌握 Go 语言函数(二):进阶玩转高阶函数、闭包与 Defer/Panic/Recover
  • 无奈!我用go写了个MySQL服务
  • 重庆网站建设业务招聘网站推广方式主要通过
  • GaussDB 数据集成方案:ETL 工具如何简化企业上云过程
  • 如何解决 pip install 安装报错 externally-managed-environment(PEP 668)问题
  • 相向双指针|两数之和II-输入有序数组|三数之和|统计和小于目标的下标对数目|最接近的三数之和|四数之和|有效三角形的个数
  • ffmpeg4.4.2 gcc 15.2.0 编译错误
  • 免费的大语言模型API接口
  • css3 学习笔记
  • 高水平的网站建设南昌做个网站多少钱
  • 宁夏建设工程质量安全监督总网站wordpress发送文章链接过期
  • Vscode 如何配置远程环境的 ssh 连接
  • 昆明参差网站开公司建网站
  • 专业点的网站制作公司建设一个公司网站需要什么条件
  • Mybatis-Spring重要组件介绍
  • 【ROS2】行为树 BehaviorTree(十):行为树节点注册、动态加载过程详解
  • MapperMethod中的SqlCommand和MethodSignature
  • 代码随想录Day55|108. 冗余连接、109. 冗余连接II
  • 最简单的方式做最系统的教学【计算机组成入门到入土】计组核心:一篇文章搞定指令格式与所有寻址方式
  • 30.redis消息队列
  • 如何做体育彩票网站什么是网络营销方案
  • 济南网站优化公司排名四川省建设工程交易中心网站
  • 企业安全防护之——防火墙
  • 电商网站制作公司网站单个页面紧张搜索引擎蜘蛛
  • mac 安装 dmg 格式程序,打开显示已损坏问题
  • CentOS 7 系统安装教程
  • 网站设计制作从哪里学起精准营销定义