2.2.1 ROS2 在功能包中编写 Python 节点

2.2.1 在功能包中编写 Python 节点

创建一个 ROS 2 的功能包,可以先使用 ros2 pkg create --help 来查看参数

bash 复制代码
$ ros2 pkg create --help
usage: 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

Create a new ROS 2 package

positional arguments:
  package_name          The package name

options:
  -h, --help            show this help message and exit
  --package-format {2,3}, --package_format {2,3}
                        The package.xml format.
  --description DESCRIPTION
                        The 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_DIRECTORY
                        Directory 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_EMAIL
                        email address of the maintainer of this package
  --maintainer-name MAINTAINER_NAME
                        name of the maintainer of this package
  --node-name NODE_NAME
                        name of the empty executable
  --library-name LIBRARY_NAME
                        name of the empty library

创建 python 功能包:

bash 复制代码
$ ros2 pkg create demo_python_pkg --build-type ament_python --license Apache-2.0
going to create a new package
package name: demo_python_pkg
destination directory: /home/hw/Development/shx-notebooks/ros_study/chapt02
package format: 3
version: 0.0.0
description: TODO: Package description
maintainer: ['hw <2979532572@qq.com>']
licenses: ['Apache-2.0']
build type: ament_python
dependencies: []
creating folder ./demo_python_pkg
creating ./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

接下来可以在 demo_python_pkg/demo_python_pkg/ 下创建 python_node.py

python 复制代码
import rclpy
from rlcpy.node import Node


def main():
    rclpy.init()
    node = Node('python_node')
    node.get_logger().info('你好 Python 节点')
    rclpy.spin(node)
    rclpy.shutdown()

这里的代码其实和之前的 Python 文件时一样的,只是没有 if __name__ = '__main__',因为 ROS 2 的功能包会自动生成可执行文件去帮我们调用这个代码,因此我们还需要在功能包中去声明可执行文件的名字是什么和对应的 main 函数。

setup.pyconsole_scripts 添加

  • 第一个 python_node:可执行文件的名字
    • 可以取任何名字,不一定要与代码文件的名字保持一致
  • demo_python_pkg:包的名字
  • python_node:代码文件的名字
  • main:函数的名字

写完这个之后,一般还要再清单文件 package.xml 中加一个依赖声明。因为我们在代码中使用了 rclpy 库,所以添加依赖信息 <depend>rclpy</depend>

接下来就可以构建功能包,使用命令 colcon build 进行构建,会构建当前及子目录下的所有功能包,并在同级目录产生 build,install,log 三个文件夹。

bash 复制代码
hw@LAPTOP-OF07PRPE:~/Development/shx-notebooks/ros_study/chapt2$ colcon build
Starting >>> demo_python_pkg
Finished <<< demo_python_pkg [0.47s]          

Summary: 1 package finished [0.76s]

构建完成后,我们可以发现多出了 build install log 这三个文件夹。

复制代码
.
├── build  放置构建过程中的中间文件
├── demo_python_pkg
├── install  放置构建结果                                                                                                              
│   ├── COLCON_IGNORE
│   ├── _local_setup_util_ps1.py
│   ├── _local_setup_util_sh.py
│   ├── demo_python_pkg  来自 demo_python_pkg
│   │   ├── lib
│   │   │   ├── demo_python_pkg
│   │   │   │   └── python_node  之前在 setup.py 中指定生成的可执行文件
│   │   │   └── python3.10
│   │   │       └── site-packages
│   │   │           ├── demo_python_pkg  把外面的包拷贝到这里,python_node 可执行文件也会到这里来找 main 函数
│   │   │           │   ├── __init__.py
│   │   │           │   ├── __pycache__
│   │   │           │   │   ├── __init__.cpython-310.pyc
│   │   │           │   │   └── python_node.cpython-310.pyc
│   │   │           │   └── python_node.py
│   │   │           └── demo_python_pkg-0.0.0-py3.10.egg-info
│   │   └── share
│   ├── local_setup.bash
│   ├── local_setup.ps1
│   ├── local_setup.sh
│   ├── local_setup.zsh
│   ├── setup.bash
│   ├── setup.ps1
│   ├── setup.sh
│   └── setup.zsh
└── log

如果直接运行命令 ros2 run demo_python_pkg python_node 就会提示找不到功能包

python 复制代码
$ ros2 run demo_python_pkg python_node
Package 'demo_python_pkg' not found

这是因为 ros2 run 会通过 AMENT_PREFIX_PATH 环境变量来查找功能包,该值默认的是 ROS 2 的安装目录,而 demo_python_pkg 包的安装目录在 install 目录下,因此我们需要修改 AMENT_PREFIX_PATH 。可以直接使用 install 目录下的 setup.bash 脚本来修改环境变量。

bash 复制代码
$ echo $AMENT_PREFIX_PATH
/opt/ros/humble
$ source install/setup.bash 
$ echo $AMENT_PREFIX_PATH
/home/hw/Development/shx-notebooks/ros_study/chapt2/install/demo_python_pkg:/opt/ros/humble
$ ros2 run demo_python_pkg python_node
[INFO] [1764734395.496624161] [python_node]: 你好 Python 节点
相关推荐
爱吃苹果的梨叔1 分钟前
2026年KVM over IP采购指南:BIOS级接管、并发和审计怎么验收
ide·python·tcp/ip·github
Cloud_Shy6187 分钟前
解读《Effective Python 3rd Edition》:从练气到老魔(第六章 Item 40 - 43)
android·开发语言·人工智能·笔记·python·学习方法
装不满的克莱因瓶8 分钟前
掌握生成对抗网络(GAN)的优化目标与评估指标——从博弈函数到生成质量衡量体系
人工智能·python·深度学习·算法·机器学习
半只小闲鱼13 分钟前
配置计划模块通用办公设备家具批复数合计计算
开发语言·python
是阿千呀!13 分钟前
A股市场风格切换研究:基于 Barra 风险模型的量化框架
python·量化
大蚂蚁2号25 分钟前
短视频批量生成技术深度解析与实战方案
python·aigc·音视频
努力写A题的小菜鸡35 分钟前
PyTorch 两种卷积写法彻底对比:F.conv2d 函数式 vs nn.Conv2d 类实战(超详细入门笔记)
python
golfscript35 分钟前
Playwright Python:微软出的浏览器自动化库
python·其他·microsoft·自动化
qq_4221525735 分钟前
Word 文件太大怎么压缩?2026 年文档瘦身方案对比
开发语言·c#·word
charliedev40 分钟前
Jedi:Python 自动补全与静态分析的实用工具
开发语言·python·其他