在 Ubuntu 虚拟机上实现开机登录后自动启动 ROS (turtlebot3 + Gazebo)
本文记录我把 ros_autonomous_slam 项目设置为虚拟机开机 登录后自动弹出终端并依次启动 roscore、turtlebot3_world.launch、turtlebot3_navigation.launch 的完整过程。适合需要 Gazebo/rviz GUI 的仿真场景,不适合无头(无 GUI)的机器人部署
1
本文记录我把
ros_autonomous_slam项目设置为虚拟机开机 登录后自动弹出终端并依次启动roscore、turtlebot3_world.launch、turtlebot3_navigation.launch的完整过程。适合需要 Gazebo/rviz GUI 的仿真场景,不适合无头(无 GUI)的机器人部署。
一、目标与前提
目标
重启虚拟机 → 登录桌面后 5 秒 → 自动打开 3 个终端并依次执行:
-
roscore -
roslaunch ros_autonomous_slam turtlebot3_world.launch -
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_ws、source路径是否正确 -
测试时先手动运行脚本确认脚本本身没有错误
-
如果你的桌面不是 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 目录并设置权限)
五、可选进阶(供参考)
-
使用
tmux或screen集中管理所有终端(适合喜欢在单窗口管理多个进程的用户) -
如果你需要无人值守(无 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 后台运行版本(我可以帮你写一个更高级的版本)
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)