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 节点
相关推荐
徐先生 @_@|||32 分钟前
Palantir Foundry 五层架构模型详解
开发语言·python·深度学习·算法·机器学习·架构
tang777891 小时前
爬虫如何绕过绕过“5秒盾”Cloudflare:从浏览器指纹模拟到Rust求解之不完全指南
开发语言·爬虫·rust·cloudflare
Yuer20251 小时前
什么是 Rust 语境下的“量化算子”——一个工程对象的最小定义
开发语言·后端·rust·edca os·可控ai
深蓝电商API1 小时前
Scrapy爬虫限速与并发控制最佳实践
爬虫·python·scrapy
Derrick__11 小时前
淘宝MD5爬虫
爬虫·python
hqwest1 小时前
码上通QT实战26--系统设置01-系统设置布局
开发语言·qt·qss·qt基础控件·qt布局控件·qt表格控件
薛定谔的猫19821 小时前
llama-index Embedding 落地到 RAG 系统
开发语言·人工智能·python·llama-index
jghhh012 小时前
传递对准MATLAB仿真程序
开发语言·matlab
nimadan123 小时前
**手机小说扫榜工具2025推荐,精准追踪榜单动态与题材风向
python·智能手机
编程武士3 小时前
Python 各版本主要变化速览
开发语言·python