vscode GDB debug ROS2的launch文件如何选择Python解释器

时间:2024-10-13 08:10:51

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解释器的版本,可以通过以下步骤设置:

  1. 打开命令面板:按 Ctrl + Shift + P (Windows/Linux) 或 Cmd + Shift + P (macOS)。
  2. 选择 Python 解释器:输入并选择 Python: Select Interpreter。
  3. 选择 Python 3.8:从列表中选择 Python 3.8 的解释器。

然后再用GDB debug就没有报错了。