ROS2中launch文件改用Python脚本,运行命令为
ros2 launch xxx.py
因此,如果在vscode中对ROS2的launch文件进行debug,就需要调用vscode的Python解释器。之前,本人在运行一个ROS2的launch文件时,使用ros2 launch xxx.py
命令运行脚本,没有任何报错。但是在vscode使用GDB debug时,却报以下错误:
ModuleNotFoundError : No module named 'rclpy._rclpy_action'
The C extension '/opt/ros/foxy/lib/python3.8/site-packages/_rclpy_action.cpython-310-x86_64-linux-gnu.so'
isn't present on the system.
后面才发现这是因为Python版本不同导致的。在 ROS 2 中,使用 ros2 launch
启动 Python 脚本和直接使用 python x.py
运行脚本之间有几个关键的区别,这可能会导致你遇到 ModuleNotFoundError
的问题。
1. Python 环境
-
ros2 launch: 当你使用
ros2 launch
启动脚本时,它会使用 ROS 2 环境中配置的 Python 解释器,ros2 foxy
对应的是Python3.8
。这意味着它会使用与 ROS 2 相关的库和模块。 -
python x.py: 当你直接运行
python x.py
时,它使用的是系统默认的 Python 解释器,系统中默认的是Python3.10
。如果你的脚本依赖于 ROS 2 的库或模块,而这些库只在 Python 3.8 环境中可用,那么就会出现ModuleNotFoundError
。
系统中是C扩展模块是/opt/ros/foxy/lib/python3.8/site-packages/_rclpy_action.cpython-38-x86_64-linux-gnu.so
。Python查找C扩展模块时查找名字会根据Python版本和平台变换,规则如Ubuntu中Python加载C扩展模块命名格式所示。
<module_name>.cpython-<python_version>-<platform>.so
所以,本文中的ModuleNotFoundError : No module named 'rclpy._rclpy_action
,并不是rclpy
的模块路径找不到,而是找不到Python3.10
对应的C扩展模块。
因此解决办法就是使用相同的 Python 版本: 尝试使用与 ROS 2 相同的 Python 版本(例如 Python 3.8)来运行你的脚本。你可以通过指定 Python 解释器来运行脚本,例如:
python3.8 x.py
在Vscode通过选择和ROS2 foxy
相同的 Python解释器的版本,可以通过以下步骤设置:
- 打开命令面板:按 Ctrl + Shift + P (Windows/Linux) 或 Cmd + Shift + P (macOS)。
- 选择 Python 解释器:输入并选择 Python: Select Interpreter。
- 选择 Python 3.8:从列表中选择 Python 3.8 的解释器。
然后再用GDB debug就没有报错了。