1

本文记录我把 ros_autonomous_slam 项目设置为虚拟机开机 登录后自动弹出终端并依次启动 roscoreturtlebot3_world.launchturtlebot3_navigation.launch 的完整过程。适合需要 Gazebo/rviz GUI 的仿真场景,不适合无头(无 GUI)的机器人部署。


一、目标与前提

目标
重启虚拟机 → 登录桌面后 5 秒 → 自动打开 3 个终端并依次执行:

  1. roscore

  2. roslaunch ros_autonomous_slam turtlebot3_world.launch

  3. roslaunch ros_autonomous_slam turtlebot3_navigation.launch

前提环境

  • Ubuntu(带 GNOME 桌面)并自动登录或手动登录(本方法在登录后执行)

  • 已安装 ROS Noetic(或你正在使用的 ROS 发行版),且 ros_autonomous_slam 项目已能在手动操作下正常运行

  • 工作空间路径:/home/ydzuo/catkin_ws(本文以此为例)

  • 用户名:ydzuo(博客内不建议写出明文密码;若你希望记录,请谨慎处理)


二、思路说明(为什么不用 systemd)

  • Gazebo/rviz 需要在 用户图形会话(X/Wayland) 中运行;如果用 systemd 在登录前启动,会缺少 DISPLAY、会话环境等,导致 Gazebo 无法正常显示或进程报错。

  • 因此选择 GNOME 的 autostart(~/.config/autostart,在用户图形会话准备好后执行脚本,脚本中再打开 gnome-terminal 执行 ROS 命令 —— 与手动打开终端效果一致。


三、实现步骤(按顺序操作)

以下命令均假定你已登录到用户名为 ydzuo 的桌面会话中。在复制/粘贴时请把路径替换为你自己的路径(如非 /home/ydzuo)。

1) 在 HOME 下创建启动脚本

在终端中输入:

nano /home/ydzuo/start_ros_slam.sh

把下面内容完整复制进去(这是最终版脚本 — 包含 cd 到工作空间并只设置一次 TURTLEBOT3_MODEL):

#!/bin/bash
# 等待桌面环境完全加载(可根据实际情况调整时间)
sleep 5

# 加载 ROS 环境(按需修改为你的 ROS 发行版路径)
source /opt/ros/noetic/setup.bash
# 加载你的工作空间(确保路径正确)
source /home/ydzuo/catkin_ws/devel/setup.bash

# 只设置一次 TURTLEBOT3_MODEL(不要重复在 ~/.bashrc 里设置)
export TURTLEBOT3_MODEL=burger
# 如果你想换模型,改为:
# export TURTLEBOT3_MODEL=waffle_pi

# 启动 roscore(在新终端中运行)
gnome-terminal -- bash -c "roscore; exec bash"
sleep 5

# 启动仿真世界(必须进入 catkin_ws 路径)
gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch ros_autonomous_slam turtlebot3_world.launch; exec bash"
sleep 5

# 启动导航(同样在 catkin_ws 下)
gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch ros_autonomous_slam turtlebot3_navigation.launch; exec bash"

保存并退出(Ctrl+O → 回车 → Ctrl+X)。

给脚本加执行权限:

chmod +x /home/ydzuo/start_ros_slam.sh

注意点:

  • sleep 可以根据你的机器启动速度调整(5s/8s 等)。

  • source /home/ydzuo/catkin_ws/devel/setup.bash 非常重要,否则 roslaunch 找不到包。

  • 脚本中不要再 source ~/.bashrc,避免把 TURTLEBOT3_MODEL 在多个位置重复设置,从而造成 Gazebo 中出现两个机器人。


2) 在 GNOME autostart 添加开机后自动运行项

创建 autostart 目录(若不存在):

mkdir -p /home/ydzuo/.config/autostart

创建 .desktop 文件:

nano /home/ydzuo/.config/autostart/start_ros.desktop

写入如下内容:

[Desktop Entry]
Type=Application
Name=Start ROS SLAM
Exec=/home/ydzuo/start_ros_slam.sh
X-GNOME-Autostart-enabled=true

保存并退出。

这样在 用户登录桌面会话 后,GNOME 会自动运行上面的脚本。


3) 本地测试(强烈建议先在会话下手动测试)

在桌面登录后,先手动运行脚本测试是否正常:

/home/ydzuo/start_ros_slam.sh

观察是否:

  • 出现一个终端运行 roscore

  • 出现一个终端加载并运行 turtlebot3_world.launch(Gazebo 窗口弹出)

  • 出现一个终端运行 turtlebot3_navigation.launch

  • Gazebo 中只出现 一辆机器人(若出现两辆,请看下面排查)

如果一切正常,再 sudo reboot 检验开机自动运行效果。


四、常见问题与排查

问题 1:重启后没有任何终端弹出 / 脚本没有执行

检查:

  • ~/.config/autostart/start_ros.desktop 路径和 Exec 是否正确(是否有执行权限)

  • 脚本里的路径 cd /home/ydzuo/catkin_wssource 路径是否正确

  • 测试时先手动运行脚本确认脚本本身没有错误

  • 如果你的桌面不是 GNOME(例如使用 KDE/xfce),.desktop 的 autostart 机制类似,但你可能要放到不同目录(KDE 也支持 ~/.config/autostart

问题 2:Gazebo 弹出但场景中有两辆机器人

原因与解决:

  • 通常是 TURTLEBOT3_MODEL 被多处设置或 launch 文件中又显式 spawn 了一个模型。

  • 检查 ~/.bashrc,如果里面有 export TURTLEBOT3_MODEL=waffle_pi,会在终端环境加载时设置(与脚本内 export 冲突)。

  • 解决办法:只在脚本内设置一次 export TURTLEBOT3_MODEL=...,并删除或注释 ~/.bashrc 中的重复设置。不要在脚本里 source ~/.bashrc(避免引入旧设置)。

问题 3:找不到 package / 找不到 launch 文件

检查:

  • source /home/ydzuo/catkin_ws/devel/setup.bash 是否成功(脚本中必须有)

  • 在工作空间内运行 roscd ros_autonomous_slam 看能否成功

  • roslaunch ros_autonomous_slam turtlebot3_world.launch 在终端手动执行是否能运行

问题 4:想把输出写入日志

修改 gnome-terminal 命令,把输出重定向到文件,例如:

gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch ros_autonomous_slam turtlebot3_world.launch 2>&1 | tee /home/ydzuo/logs/world.log; exec bash"

(请先创建 /home/ydzuo/logs 目录并设置权限)


五、可选进阶(供参考)

  • 使用 tmuxscreen 集中管理所有终端(适合喜欢在单窗口管理多个进程的用户)

  • 如果你需要无人值守(无 GUI) 的后台运行,用 systemd 写服务单元,但 Gazebo/RViz 不能在无会话下显示;适合真实机器人或无 GUI 环境

  • 为脚本加上自检/崩溃自动重启逻辑:可以用 while true; do ...; sleep 3; done 或者 systemd 的 Restart=on-failure(systemd 版本用于无 GUI 后端)


六、完整文件清单(便于直接复制)

start_ros_slam.sh(完整)

#!/bin/bash
sleep 5
source /opt/ros/noetic/setup.bash
source /home/ydzuo/catkin_ws/devel/setup.bash
export TURTLEBOT3_MODEL=burger

gnome-terminal -- bash -c "roscore; exec bash"
sleep 5

gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch ros_autonomous_slam turtlebot3_world.launch; exec bash"
sleep 5

gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch ros_autonomous_slam turtlebot3_navigation.launch; exec bash"

赋予权限:

chmod +x /home/ydzuo/start_ros_slam.sh

start_ros.desktop(放在 ~/.config/autostart

[Desktop Entry]
Type=Application
Name=Start ROS SLAM
Exec=/home/ydzuo/start_ros_slam.sh
X-GNOME-Autostart-enabled=true

完成!


七. 在真实环境(非 Gazebo)中实现 ROS 自动导航开机自启

在前面的步骤中,我们已经实现了在虚拟机 + Gazebo 环境中,系统开机后自动启动 roscore、仿真世界、导航节点。
但如果你的机器人已经进入 真实世界运行,例如外挂 LiDAR、深度相机、ESP32、STM32、Jetson Nano、树莓派等,那么就 不再需要 Gazebo 仿真,而是需要在开机时自动启动:

  • ROS Master(roscore)

  • LiDAR 驱动(如 rplidar.launch / sick.launch)

  • 机器人底盘驱动(如 cmd_vel → 电机控制节点)

  • TF / URDF 描述

  • 真实环境的导航:amcl.launch(定位)或 gmapping.launch(建图)

下面给出完整方案。


7.1 真实机器人开机自启的总体思路

现实环境下,ROS 通常由以下节点构成:

🟩 A. 机器人基础驱动

  • 底盘驱动(串口、CAN、以太网)

  • IMU 驱动

  • 电机控制器

  • TF 发布器(base_link → odom)

例如 bringup.launch

🟦 B. 传感器驱动

  • 激光雷达(比如 RPLIDAR、Hokuyo、SICK)

  • 深度相机(RealSense、奥比中光)

  • 超声波等辅助传感器

例如 lidar.launch

🟥 C. 导航相关节点

  • 如果是建图:gmapping

  • 如果是导航:amcl + move_base

例如 navigation.launch


7.2 为真实环境创建自动启动脚本(不含 Gazebo)

/home/ydzuo/ 下创建一个新的脚本文件,例如:

nano /home/ydzuo/start_real_robot.sh

脚本内容如下,可根据你的传感器名称自行修改:

#!/bin/bash
sleep 5

# 环境变量加载
source /opt/ros/noetic/setup.bash
source /home/ydzuo/catkin_ws/devel/setup.bash

# 设置机器人型号(可选)
export TURTLEBOT3_MODEL=burger

# 1. 启动 roscore
gnome-terminal -- bash -c "roscore; exec bash"
sleep 5

# 2. 启动雷达驱动 (示例:RPLIDAR)
gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch rplidar_ros rplidar.launch; exec bash"
sleep 3

# 3. 启动机器人底盘(示例:两个电机、IMU、TF 发布器)
gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch my_robot_bringup bringup.launch; exec bash"
sleep 3

# 4. 启动导航系统(真实场景使用 AMCL,不使用 Gazebo 地图)
gnome-terminal -- bash -c "cd /home/ydzuo/catkin_ws; roslaunch my_robot_navigation amcl.launch; exec bash"

保存退出。


7.3 给予脚本执行权限

sudo chmod +x /home/ydzuo/start_real_robot.sh

7.4 配置 systemd 实现开机自启

sudo nano /etc/systemd/system/real_robot.service

写入以下内容(注意脚本路径):

[Unit]
Description=Start Real Robot ROS System
After=multi-user.target graphical.target

[Service]
User=ydzuo
ExecStart=/home/ydzuo/start_real_robot.sh
Restart=always
Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/ydzuo/.Xauthority

[Install]
WantedBy=graphical.target

7.5 使能开机启动并启动服务

sudo systemctl daemon-reload
sudo systemctl enable real_robot.service
sudo systemctl start real_robot.service

重启测试:

reboot

系统进入桌面后,将自动启动:

✔ roscore
✔ LiDAR
✔ 电机底盘
✔ IMU 与 TF
✔ AMCL 分布式定位
✔ move_base 规划与控制

非常适用于:

  • Jetson Nano

  • 树莓派4B

  • MiniPC + LiDAR SLAM

  • 自制 AGV 小车

  • ROS 教程机器人


7.6 常见问题与解决办法

① 程序没有运行?

大多数情况是:

  • 没有配置 DISPLAY

  • 没查找到 gnome-terminal

解决:

Environment=DISPLAY=:0
Environment=XAUTHORITY=/home/ydzuo/.Xauthority

② LiDAR 或底盘驱动失败

常见原因:

  • USB 权限不足

  • /dev/ttyUSB0 动态变化

  • 没有加入 dialout 组

解决:

sudo usermod -a -G dialout ydzuo
sudo chmod 777 /dev/ttyUSB0

③ 想隐藏终端窗口?

可改为 tmux 后台运行版本(我可以帮你写一个更高级的版本)

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐