Skip to content

ROS2 节点因缺少 HOME 环境变量崩溃

问题

不设置 HOME 环境变量运行 ROS 2 节点,节点直接崩溃,无法启动。

根本原因

ROS 2 日志子系统初始化时需要确定日志目录,查找逻辑:

  1. ROS_LOG_DIR 非空 → 直接使用
  2. 否则 → $ROS_HOME/log
  3. ROS_HOME 也未设置 → 回退到 ~/.ros

第 3 步中 ~ 的展开依赖 HOME 环境变量。rcutilsrcutils_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 subprocesssubprocess.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

基于 VitePress 构建