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.py 的 console_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 节点