ROS2 节点因缺少 HOME 环境变量崩溃
问题
不设置 HOME 环境变量运行 ROS 2 节点,节点直接崩溃,无法启动。
根本原因
ROS 2 日志子系统初始化时需要确定日志目录,查找逻辑:
ROS_LOG_DIR非空 → 直接使用- 否则 →
$ROS_HOME/log ROS_HOME也未设置 → 回退到~/.ros
第 3 步中 ~ 的展开依赖 HOME 环境变量。rcutils 的 rcutils_expand_user() 在 HOME 不存在时直接失败,日志目录无法解析,抛出致命错误:
rcutils_expand_user failed, at .../rcl_logging_interface/src/logging_dir.c:81
Failed to get logging directory, at .../rcl_logging_spdlog/src/rcl_logging_spdlog.cpp:84 节点在日志子系统初始化阶段就崩溃,还没执行任何业务逻辑。
受影响场景
- Docker 容器:部分最小化镜像不设置
HOME - systemd 服务:默认不继承用户的
HOME变量 - Python subprocess:
subprocess.Popen启动的子进程可能缺少HOME
解决方案
任选其一:
bash
# 方案 1:设置 HOME(最根本)
export HOME=/root
# 方案 2:设置 ROS_LOG_DIR 为绝对路径(绕过 ~ 展开)
export ROS_LOG_DIR=/tmp/ros_logs
# 方案 3:设置 ROS_HOME 为绝对路径(日志目录变为 $ROS_HOME/log)
export ROS_HOME=/tmp/.ros 方案 2 和 3 不要使用 ~,否则只是把问题换了个地方。必须用绝对路径。
其他受影响的功能
~/.ros 还被以下功能使用,HOME 缺失同样会导致问题:
- rosbag2:默认录制存储路径
~/.ros/ - SROS2 安全:默认密钥库路径
~/.ros/ - Fast-DDS:共享内存配置等也可能依赖
HOME