ROS2 与 OpenPCDet 跨环境调用配置

记录在 Conda 环境中运行 OpenPCDet,并调用 ROS2 Python 接口 rclpy 时需要注意的环境变量、依赖和动态库问题。

在 ROS2 节点中调用 OpenPCDet 时,比较容易遇到 Conda 环境和 ROS2 系统环境冲突的问题。这篇文章记录我在配置过程中的处理方式。

1. 问题背景

OpenPCDet 通常运行在 Conda 环境中,例如:

1
conda activate Openpcdet-cu117

而 ROS2 通常安装在系统目录,例如:

1
/opt/ros/humble

因此运行 ROS2 + OpenPCDet 节点时,需要同时处理:

  • Conda Python 环境;
  • ROS2 Python 接口;
  • ROS2 系统环境变量;
  • C++ 动态库链接问题。

2. 基本原则

不要直接在普通系统终端里运行 Conda 环境中的 OpenPCDet 代码。

推荐流程是:

  1. 先激活 OpenPCDet Conda 环境;
  2. 在该环境中安装需要的 ROS2 Python 依赖;
  3. source ROS2 的系统环境变量;
  4. 必要时设置 LD_PRELOAD
  5. 回到 OpenPCDet 根目录运行节点。

3. 激活 OpenPCDet Conda 环境

1
conda activate Openpcdet-cu117

后续命令都建议在这个环境下执行。

4. 安装 ROS2 Python 基础库

假设使用的是 ROS2 Humble:

1
pip install rclpy

注意:这里安装的是 Python 接口,不等于安装完整 ROS2。

如果你的 ROS2 版本不是 Humble,需要根据实际版本调整后续路径。

5. 加载 ROS2 系统环境变量

1
source /opt/ros/humble/setup.bash

这一步很重要,否则 Python 代码中可能无法正确找到 ROS2 相关包和环境配置。

6. 处理 C++ 动态库 ImportError

如果运行时遇到 C++ 动态库相关的 ImportError,可以尝试强制预加载系统的 libstdc++.so.6

1
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

完整运行流程如下:

1
2
3
4
5
6
conda activate Openpcdet-cu117
source /opt/ros/humble/setup.bash
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

cd ~/OpenPCDet
python3 ros2/pcdet_ros2_node.py

7. 推荐启动脚本

为了避免每次手动输入,可以写一个简单脚本,例如:

1
2
3
4
5
6
7
8
#!/usr/bin/env bash

conda activate Openpcdet-cu117
source /opt/ros/humble/setup.bash
export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6

cd ~/OpenPCDet
python3 ros2/pcdet_ros2_node.py

保存为:

1
run_pcdet_ros2.sh

赋予执行权限:

1
chmod +x run_pcdet_ros2.sh

运行:

1
./run_pcdet_ros2.sh

8. 排查思路

如果仍然报错,可以按下面顺序排查:

8.1 检查当前 Python 是否来自 Conda 环境

1
2
which python
python -V

预期路径应类似:

1
/home/cx/anaconda3/envs/Openpcdet-cu117/bin/python

8.2 检查 rclpy 是否能导入

1
python -c "import rclpy; print('rclpy ok')"

8.3 检查 ROS2 环境变量

1
echo $ROS_DISTRO

如果使用 Humble,预期输出:

1
humble

8.4 检查 libstdc++ 路径

1
echo $LD_PRELOAD

如果已经设置,应该看到:

1
/usr/lib/x86_64-linux-gnu/libstdc++.so.6

总结

ROS2 与 OpenPCDet 一起使用时,核心问题不是模型本身,而是 Python 环境和系统 ROS2 环境之间的衔接。我的建议是把启动流程写成脚本,固定执行顺序,避免每次手动配置导致环境不一致。

使用 Hugo 构建
主题 StackJimmy 设计