ROS 2 / Gazebo / Autoware 一键清理与切换 Domain 使用指南

这篇文档把一套常用的清理函数整理成简单版本,适合日常排查:

  • ROS 2 进程残留
  • Gazebo 进程冲突
  • Fast DDS 共享内存脏状态
  • ROS_DOMAIN_ID 混乱导致看不到话题

1. 你会得到什么

两个函数:

  • ros_domain <id>:只切换 ROS_DOMAIN_ID
  • ros_clean [id]:清理 ROS/Gazebo 相关环境,可选同时切换 ROS_DOMAIN_ID

2. 函数代码(可直接放到 ~/.bashrc)

bash 复制代码
# ==============================
# ROS 2 / Gazebo / Autoware clean helpers
# Usage:
#   ros_clean         # clean processes + daemon + shm
#   ros_clean 0       # same as above, then export ROS_DOMAIN_ID=0
#   ros_clean 42      # same as above, then export ROS_DOMAIN_ID=42
#   ros_domain 0      # only switch ROS_DOMAIN_ID
# ==============================

ros_domain() {
    if [ -z "$1" ]; then
        echo "Usage: ros_domain <id>"
        return 1
    fi

    export ROS_DOMAIN_ID="$1"
    echo "[ros_domain] ROS_DOMAIN_ID set to: $ROS_DOMAIN_ID"
}

ros_clean() {
    local NEW_DOMAIN_ID="$1"

    echo "======================================"
    echo "[ros_clean] Start cleaning ROS/Gazebo"
    echo "======================================"

    echo "[1/9] Killing ROS 2 / Autoware / RViz / Gazebo related processes..."

    # ROS 2 / Autoware common
    pkill -9 -f "ros2" 2>/dev/null
    pkill -9 -f "rviz" 2>/dev/null
    pkill -9 -f "rviz2" 2>/dev/null
    pkill -9 -f "autoware" 2>/dev/null
    pkill -9 -f "component_container" 2>/dev/null
    pkill -9 -f "component_container_mt" 2>/dev/null
    pkill -9 -f "component_container_isolated" 2>/dev/null
    pkill -9 -f "static_transform_publisher" 2>/dev/null
    pkill -9 -f "robot_state_publisher" 2>/dev/null
    pkill -9 -f "joint_state_publisher" 2>/dev/null
    pkill -9 -f "joint_state_broadcaster" 2>/dev/null
    pkill -9 -f "parameter_bridge" 2>/dev/null
    pkill -9 -f "pointcloud_to_laserscan" 2>/dev/null
    pkill -9 -f "slam_toolbox" 2>/dev/null
    pkill -9 -f "nav2" 2>/dev/null
    pkill -9 -f "planner_server" 2>/dev/null
    pkill -9 -f "controller_server" 2>/dev/null
    pkill -9 -f "bt_navigator" 2>/dev/null
    pkill -9 -f "waypoint_follower" 2>/dev/null
    pkill -9 -f "map_server" 2>/dev/null
    pkill -9 -f "amcl" 2>/dev/null

    echo "[2/9] Killing Gazebo / Ignition / gz simulator related processes..."

    # Gazebo classic / Ignition / Gazebo Sim
    pkill -9 -f "gz sim" 2>/dev/null
    pkill -9 -f "gzserver" 2>/dev/null
    pkill -9 -f "gzclient" 2>/dev/null
    pkill -9 -f "gazebo" 2>/dev/null
    pkill -9 -f "ign gazebo" 2>/dev/null
    pkill -9 -f "ignition" 2>/dev/null
    pkill -9 -f "ruby $(which ign)" 2>/dev/null
    pkill -9 -f "ruby $(which gz)" 2>/dev/null

    echo "[3/9] Killing ros_gz / gazebo bridge / control helpers..."

    pkill -9 -f "ros_gz" 2>/dev/null
    pkill -9 -f "ros_ign" 2>/dev/null
    pkill -9 -f "spawn_entity" 2>/dev/null
    pkill -9 -f "create " 2>/dev/null
    pkill -9 -f "spawner" 2>/dev/null
    pkill -9 -f "controller_manager" 2>/dev/null
    pkill -9 -f "gz_ros2_control" 2>/dev/null

    echo "[4/9] Stopping ros2 daemon..."
    ros2 daemon stop >/dev/null 2>&1
    sleep 1

    echo "[5/9] Cleaning Fast DDS / shared memory leftovers..."
    rm -f /dev/shm/fastrtps_* 2>/dev/null
    rm -f /tmp/fastdds_* 2>/dev/null
    rm -f /tmp/fastrtps_* 2>/dev/null

    echo "[6/9] Cleaning user-level ROS temporary files..."
    rm -rf ~/.ros/log/latest 2>/dev/null
    find ~/.ros/log -maxdepth 1 -type d -name "20*" -mtime +7 -exec rm -rf {} \; 2>/dev/null

    echo "[7/9] Cleaning Gazebo temporary cache (safe subset)..."
    rm -rf ~/.gazebo/log/* 2>/dev/null
    rm -rf ~/.ignition/gazebo/log/* 2>/dev/null
    rm -rf ~/.gz/sim/log/* 2>/dev/null

    echo "[8/9] Restarting ros2 daemon..."
    ros2 daemon start >/dev/null 2>&1
    sleep 1

    echo "[9/9] Resetting ROS_DOMAIN_ID if requested..."
    if [ -n "$NEW_DOMAIN_ID" ]; then
        export ROS_DOMAIN_ID="$NEW_DOMAIN_ID"
        echo "[ros_clean] ROS_DOMAIN_ID set to: $ROS_DOMAIN_ID"
    else
        echo "[ros_clean] ROS_DOMAIN_ID unchanged: ${ROS_DOMAIN_ID:-<unset>}"
    fi

    echo "--------------------------------------"
    echo "[ros_clean] Done."
    echo "Current ROS_DOMAIN_ID: ${ROS_DOMAIN_ID:-<unset>}"
    echo "Tip: run source ~/.bashrc if needed."
    echo "======================================"
}

3. 使用方法(最常用)

3.1 只切换 Domain

bash 复制代码
ros_domain 88

3.2 清理并保留当前 Domain

bash 复制代码
ros_clean

3.3 清理并切到指定 Domain

bash 复制代码
ros_clean 88

4. 推荐排查流程(实战)

bash 复制代码
ros_clean 88
source ~/.bashrc
# 然后再启动仿真 + Autoware

如果你出现这些症状,优先跑一遍:

  • ros2 topic list 看到的话题不全
  • 同名节点重复(duplicated node)
  • route 已设置但车不走
  • 终端和主进程不在同一个 ROS_DOMAIN_ID

5. 注意事项

  • 脚本里使用了大量 pkill -9,适合强制清场排障,不适合保留现场调试。
  • 如果你有其他 ROS 工程同时运行,也会被一起清掉。
  • 多终端场景下,记得每个终端都确认 echo $ROS_DOMAIN_ID。

6. 一句话总结

这套函数的核心价值:

  • 先统一清场,再统一 Domain,再重启流程。

对 ROS 2 / Autoware 来说,这一步往往能直接解决大量通信异常问题。

相关推荐
咕泡科技31 分钟前
AI前沿速递:Gemini双连发+混元双档落地!智元发布首个机器人工时KPI,具身智能分出工厂与客厅两条赛道
人工智能·机器人·腾讯混元·智元机器人·gemini4carbon·巴布机器人
天树星智源1 小时前
静态物理满分、交互 11.54%:3D 场景生成系统的幻觉
论文阅读·人工智能·3d·机器人
咬代码的兽1 小时前
智元创新日拆解:机器人开始按工时结算,Token之后有了Worken
机器人
趣味科技v1 小时前
具身智能从“演示”走向“部署”:智元把机器人送进真实工位
机器人·具身智能·智元
Wanda12142 小时前
机器人与机电一体化3D数字孪生机器-Day9
人工智能·3d·unity·机器人·数字孪生
超级架构师2 小时前
让 Fortran 模型自己调用 Agent:原生 Fortran 2008 实现深度剖析
人工智能·python·架构·机器人·开源·fortran
JIAOZHANZHISHIKU10 小时前
机器人外壳粘接性价比怎么选?3M VHB 胶带与结构胶解决方案
经验分享·机器人·工业胶粘剂·3m胶粘剂
GlobalInfo11 小时前
2026年机器人多指灵巧手市场分析报告——涵盖行业调查、趋势分析与发展前景
大数据·人工智能·microsoft·微服务·机器人
zkk952717 小时前
【机器人感知运控笔记一】从点云到避障:距离场的构建、查询与梯度
机器人·具身智能·sdf·esdf
XMAIPC_Robot19 小时前
-40~85℃宽温实测:RK3588 机器人控制器硬件底座,长时间 SLAM 定位稳定性验证
人工智能·fpga开发·机器人·边缘计算·arm+fpga·rk3588+fpga