ROS2开发先过Linux和Shell这关:从命令行到脚本自动化
2026/9/8 5:06:08 网站建设 项目流程

具身智能和 ROS2 开发,第一道坎往往不是算法,也不是机械臂,而是 Linux 命令行和 Shell 脚本。

很多人照着教程安装 ROS2,第一步就卡在终端里:软件源不会配,软件包装不上,下载的脚本没有执行权限,source 环境变量不知道是什么意思。折腾一晚上,最后发现不是 ROS2 难,而是缺了 Linux 和 Shell 这一层基本功。

这篇文章不教你写机器人控制代码,也不展开具体算法,只把 ROS2 落地前最该补的 Linux 文件系统、常用命令、Shell 脚本和自动化思路,按实际落地顺序拆一遍。适合完全没接触过命令行的新手,也适合已经装过 ROS2、但每次开终端都要复制粘贴的开发者。最值得关注的核心逻辑是:先用熟悉的路径和权限把终端用顺,再用脚本把重复工作自动化,最后把这套能力接进 ROS2 的日常开发里。

1. 为什么具身智能和 ROS2 开发要先过 Linux 与 Shell 这一关

1.1 ROS2 的主流运行环境就是 Linux

做具身智能、做机械臂、做移动机器人底盘,几乎绕不开 ROS2。ROS2 虽然有 Windows 版本,但官方支持最完整、社区资料最多、驱动和功能包最齐全的,还是 Linux。你搜 ros2 humble、ROS2 安装教程,绝大多数步骤都发生在 Ubuntu 终端里。

这意味着什么?意味着如果你连终端提示符都看不明白,后面就没办法顺畅地看日志、改配置、编译工作空间、启动多个节点。具身智能的感知、导航、控制,很多底层库都是在 Linux 上先做好,再适配其它系统的。把操作 Linux 的基本功补上,不是额外任务,而是 ROS2 开发的前置步骤。

1.2 Shell 是操作 Linux 的工作台,不只是“一个黑窗口”

Linux 有图形桌面,但很多场景没有桌面可用。你连到一台服务器上跑训练任务,看到的是纯命令行;你把程序部署到开发板或树莓派上,可能没有显示器;你远程调试机器人的时候,SSH 进去之后能用的也是 Shell。

Shell 是命令解释器,你输入命令,它负责执行。日常开发中最常用的是 bash,而 Shell 脚本就是把一系列命令按顺序、带逻辑地组合到一个文件里,让机器自动执行。机器人开发里的很多自动化,其实都依赖 Shell:

  • 自动加载环境变量
  • 批量启动多个 ROS2 节点
  • 备份日志和模型文件
  • 批量处理数据集文件
  • 定时清理临时文件

这些操作靠鼠标点不出来,靠一个个手敲也效率太低,需要写脚本。

1.3 不需要先学完所有 Linux 内容,但这两轮不能省

新手最常见的误区,是把战线拉得很长,计划先花几个月刷完上百条 Linux 常用命令,再学 Python,再学 ROS2。这个计划大概率烂尾。

更务实的方式是分两轮:

第一轮先学文件操作和权限。要能理解目录树,会用 cd、ls、mkdir、cp、mv、rm,能区分普通文件和目录,知道没有执行权限时要怎么办。

第二轮再学 Shell 脚本。要能写变量、循环、条件判断、函数,知道怎么给脚本加执行权限,怎么传参数。

这两轮学完,足够应对 ROS2 安装和入门项目。遇到不熟的命令,用--helpman查,比背完整命令大全高效得多。

2. 环境准备:先从虚拟机开始,再确定 Ubuntu 和 ROS2 版本匹配

2.1 学习阶段选虚拟机,错误成本最低

在 Windows 下用 VMware Workstation Player 或 VirtualBox 安装 Ubuntu,是 ROS2 入门阶段最省心的方案。

为什么不是双系统?因为新手最容易把系统搞坏。装错软件源、乱改环境变量、删掉系统依赖,都可能导致登录不了桌面。虚拟机有快照功能,出问题可以一键恢复,双系统恢复成本高,而且分区操作有一定风险。

性能方面,学习阶段不需要太高要求。但建议宿主机内存至少 16GB,给虚拟机分配 4GB 到 8GB。磁盘按 60GB 以上准备,因为 ROS2 桌面版加上常用功能包之后,占用会明显上涨。

如果只是临时体验,WSL2 也可以跑,但后面涉及 rviz2 可视化、摄像头设备直通、串口开发板调试时,虚拟机会更稳。

2.2 Ubuntu 版本和 ROS2 发行版必须先配对

安装 ROS2 时最经典的报错,就是热词里出现的这条:

E: Unable to locate package ros-humble-desktop

遇到这个报错,第一反应应该是检查 Ubuntu 版本和 ROS2 发行版是否匹配。常见组合如下:

Ubuntu 版本ROS2 发行版说明
Ubuntu 22.04ROS2 Humble入门最推荐,资料最多
Ubuntu 20.04ROS2 Foxy老项目里还能见到
Ubuntu 24.04ROS2 Jazzy较新组合,教程需要适配

不同发行版的二进制包不通用。你在网上看到一篇教程,第一件事不是复制命令,而是看它用的 Ubuntu 版本。如果教程针对 Ubuntu 22.04,你却用 Ubuntu 24.04 执行,安装 ros-humble-desktop 就会提示找不到软件包。

2.3 新装 Ubuntu 后先做这几件小事

安装完系统,不要急着装 ROS2。先把基础环境整理干净:

  1. 更换软件源到国内镜像,比如阿里云、清华源,能明显降低下载超时概率。
  2. 执行sudo apt updatesudo apt upgrade,把系统软件包列表刷新到最新。
  3. 安装基础工具:curlgitvimnet-toolsbuild-essential
  4. 安装 VSCode,后面编辑代码和脚本会常用。
  5. 给虚拟机拍一个快照,方便后续出问题时回滚。

这里最容易忽略的是第 2 步。很多软件包安装失败,根源不是依赖缺失,而是软件源列表没有刷新。执行sudo apt update不花多少时间,但能避免一大类无头绪的报错。

以下是入门阶段比较稳妥的资源配置参考:

资源项建议值备注
宿主机内存16GB 以上运行虚拟机加 IDE 会比较轻松
虚拟机内存4GB 至 8GB低于 4GB 跑 rviz2 会比较吃力
虚拟机磁盘60GB 以上ROS2 功能包、日志、虚拟环境都会占空间
网络能稳定访问软件源下载失败时先检查镜像源
GPU入门阶段不强求后续做模型训练或仿真再单独考虑

3. 文件系统、权限和常用命令:ROS2 开发里最先用到的 Linux 基础

3.1 目录结构不需要全记,先熟悉五个位置

Linux 的目录树看起来复杂,ROS2 日常开发中真正高频接触的位置就几个:

  • /home/用户名/:个人工作区,源码、功能包、脚本基本都放这里。
  • /opt/ros/humble/:ROS2 默认安装位置。后面反复出现的setup.bash就在这里。
  • /etc/:系统配置文件所在目录。
  • /dev/:设备文件目录,开发板或传感器调试时会看到。
  • /tmp/:临时文件目录,重启后会被清空。

记住这五个,比背完整目录树有用。尤其是/opt/ros/humble/setup.bash这个路径,你学 ROS2 的第一周就会遇到很多次。

3.2 常用命令按“场景”来记,不要按字母表背

命令不在多,在能不能在正确场景下想起来。ROS2 开发里最常见的几组场景是这样:

切换目录和查看文件:

cd ~/ros2_ws ls -la

cd切换目录,~代表当前用户的家目录。ls -la显示隐藏文件、权限、所有者和大小。刚到一个新目录,我一般先执行ls -la,确认眼前的东西和预期一致,再继续操作。

复制、移动、重命名:

cp -r src_backup src_new mv old_name.py new_name.py

mv在 Linux 里既是移动,也是重命名。热词里提到的“用 shell 重命名文件”,最简单的方式就是mv。只有批量重命名时才需要写循环脚本。

查看文本和日志:

cat setup.py less /var/log/syslog tail -f ~/ros2_ws/log/console.log

cat适合看小文件,less适合翻页浏览大文件,tail -f适合实时跟踪日志。ROS2 节点运行时不退出、实时打印日志的场景,用tail -f非常直观。

查找文件和内容:

find ~/ros2_ws -name "*.py" grep -r "error" ~/ros2_ws/log/

find按文件名找,grep -r按文件内容找。程序报错但不知道日志在哪时,用grep -r在日志目录里搜关键字,比一个个文件打开效率高很多。

3.3 权限问题先掌握 chmod 和 sudo 的使用边界

ls -l查看文件列表时,第一列长这样:

-rw-r--r--

第一个字符是文件类型,-表示普通文件,d表示目录。后面三组分别是所有者、所属组、其他人的权限。r可读,w可写,x可执行。

新手经常遇到的报错是:

Permission denied

原因通常是脚本没有执行权限。解决办法:

chmod +x run.sh

学习阶段不用死记八进制数字权限,先记住chmod +x给执行权限,chmod -R递归处理目录。

另一个高频词是sudo。它表示用管理员权限执行命令。安装软件时几乎都要用,但不是什么命令都要加 sudo。一个很典型的错误:整个 ROS2 工作空间都用 sudo 创建,之后编译和运行会出现权限归属混乱。自己账号能完成的操作,就不需要用 sudo。

3.4 最值得提前背下来的排查顺序

报错信息常见原因优先排查项
Permission denied没有执行/读权限用 ls -l 查看权限,chmod +x
command not found命令未安装或 PATH 不对用 which 命令名称,检查环境变量
unable to locate package软件源未更新或未添加先 sudo apt update,再确认源
$'\r': command not found文件换行符是 CRLF用 sed 转成 LF

这个表建议收藏。ROS2 开发里遇到报错,先看现象,再对照表格找方向,不要一上来就重装系统。

4. 从敲命令到自动化:第一个 Shell 脚本怎么写

4.1 什么情况下才需要写脚本

终端一条一条敲命令,能完成很多事。但遇到重复性操作,手敲效率太低。比如:

  • 每次进入 ROS2 工作空间,都要手动 source 环境变量
  • 启动多个 ROS2 节点,每个节点开一个终端
  • 批量重命名几十个日志文件
  • 定期备份模型文件、清理临时文件

这些场景就是 Shell 脚本的用武之地。脚本把多个命令按顺序放进文件,再加上条件判断和循环,就变成了可以反复执行的小工具。

4.2 创建并运行第一个脚本

在个人目录里创建hello.sh,内容如下:

#!/bin/bash echo "Hello, ROS2" echo "当前目录: $(pwd)" echo "当前时间: $(date)"

第一行#!/bin/bash叫 shebang,作用是告诉系统用哪个解释器运行脚本。后面几行就是正常命令。

给脚本加执行权限,然后运行:

chmod +x hello.sh ./hello.sh

这里有一个新手容易困惑的细节:为什么执行当前目录的脚本要写./?因为 Linux 默认不会在当前目录查找可执行文件,需要显式写出路径。./hello.sh的意思是“当前目录下的 hello.sh 文件”。如果不写./,系统会提示 command not found。

4.3 变量和基本运算

Shell 里定义变量不需要类型声明,直接赋值:

#!/bin/bash name="robot" count=3 echo "$name 即将启动 $count 次"

需要注意:

  • 赋值时等号两边不能有空格
  • 读取变量时前面加$
  • 字符串拼接直接写,比如backup_$name

如果需要数学运算,用$((...))

total=$((count * 2)) echo $total

4.4 for 循环实现批量重命名

自动化脚本里最常用的循环是for。看一个批量重命名日志文件的例子:

#!/bin/bash for file in *.log do mv "$file" "backup_$(date +%Y%m%d)_$file" done

这个脚本做了什么?遍历当前目录下所有.log文件,给每个文件加上当天的日期前缀。

这里有两个关键细节:

  • *.log是通配符,匹配所有以 .log 结尾的文件名。
  • "$file"加了双引号。如果文件名带空格,不加引号会被拆成多个参数,导致 mv 命令报错。Shell 脚本里凡是变量可能包含空格的情况,都建议加双引号。

4.5 if 条件判断

很多时候脚本要根据条件执行不同分支。比如检查目录是否存在:

#!/bin/bash if [ -d "$HOME/ros2_ws" ]; then echo "工作空间目录存在" else echo "工作空间目录不存在" fi

常用的判断条件:

  • -d:目录是否存在
  • -f:文件是否存在
  • -z:字符串是否为空
  • =:字符串是否相等

再举一个 ROS2 开发里很常见的场景:判断 ROS2 是否已经安装。

#!/bin/bash if [ -f /opt/ros/humble/setup.bash ]; then echo "ROS2 Humble 已安装" else echo "未找到 ROS2,请检查安装路径" exit 1 fi

遇到“ROS2 环境变量加载失败”类问题时,这个脚本能快速定位是路径问题还是安装问题。

4.6 函数和脚本参数

脚本变长之后,建议把逻辑拆成函数。比如一个负责检查环境,一个负责备份:

#!/bin/bash check_env() { if [ -d "$HOME/ros2_ws" ]; then echo "工作空间 OK" else echo "工作空间不存在" exit 1 fi } backup_logs() { mkdir -p ~/logs/$(date +%Y%m%d) cp ~/ros2_ws/log/*.log ~/logs/$(date +%Y%m%d)/ } check_env backup_logs echo "备份完成"

脚本也可以接收参数。$1表示第一个参数,$2表示第二个参数,$#表示参数数量。热词里提到的shift命令,作用是把参数列表整体左移一位,适合处理循环读取参数的情况,入门阶段可以先不深入。

5. 把这些 Shell 知识用到 ROS2 开发里

5.1 source 环境变量和 ~/.bashrc 的关系

ROS2 安装完成后,每次打开新终端,想用ros2命令,通常需要先执行:

source /opt/ros/humble/setup.bash

为什么?因为 ROS2 的可执行文件不在系统默认 PATH 里,source 这个文件后,当前终端才会加载 ROS2 相关的环境变量。

如果每次都要手动敲,很啰嗦。解决办法是把这行写入~/.bashrc

echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc source ~/.bashrc

~/.bashrc是 bash 的启动配置文件,每次打开终端都会自动加载。写入之后,新终端窗口里就能直接使用 ros2 命令。

这里有个细节要提示:修改.bashrc后,当前终端要执行一次source ~/.bashrc才能立即生效。重开终端也可以,但不要认为改完文件,当前窗口立刻就能用。

5.2 用脚本一次性启动多个 ROS2 节点

具身智能机器人通常不是单程序运行,而是多个节点协同工作。手动开三个终端分别启动节点,效率太低。可以先写成脚本:

#!/bin/bash source /opt/ros/humble/setup.bash source ~/ros2_ws/install/setup.bash ros2 run my_robot camera_node & sleep 3 ros2 run my_robot lidar_node & sleep 2 ros2 run my_robot controller_node

解释几个关键点:

  • &把进程放到后台运行,不会阻塞当前终端。
  • sleep 3等几秒,给节点留出启动时间。
  • 最后一个节点不挂后台,保持前台运行,方便用 Ctrl+C 中断。

这个脚本在验证阶段够用。等系统复杂了,应该用 ROS2 官方的 launch 文件来管理多节点,但理解脚本中的后台和等待逻辑,是理解 launch 文件的基础。

5.3 日志收集和目录备份

机器人跑起来后,日志是非常重要的排查依据。手动复制一堆 log 文件容易遗漏,写个脚本更稳妥:

#!/bin/bash set -e mkdir -p ~/logs/$(date +%Y%m%d) cp ~/ros2_ws/log/*.log ~/logs/$(date +%Y%m%d)/ tar -czf ~/logs/backup_$(date +%Y%m%d).tar.gz ~/logs/$(date +%Y%m%d) echo "[INFO] 备份完成: ~/logs/backup_$(date +%Y%m%d).tar.gz"

mkdir -p表示如果上级目录不存在就一起创建。tar -czf把日志目录打包压缩,方便归档和传输。这样一个脚本,配合定时任务,就能形成简单的日志备份机制。

5.4 脚本里要有日志输出和错误退出

自动化任务不能“闷头跑”。建议在每个关键步骤加输出信息:

#!/bin/bash set -e echo "[INFO] 开始备份..." # 中间是备份命令 echo "[INFO] 备份完成"

set -e的语义是:脚本中某个命令执行失败,立即退出,后续命令不再执行。这能避免“前面出错,后面用错误结果继续跑”的连锁问题。

调试时可以用set -x。它会把每条命令的实际参数打印出来,执行到哪一步一目了然。

#!/bin/bash set -x echo "调试模式"

出了问题之后,先开set -x跑一遍,再看日志,比盲改参数有效。平时不要开,因为有set -x时输出会很长。

6. 安装和实战中最常遇到的 6 个问题

6.1 安装软件包时报 unable to locate package

这是搜索量很高的一个问题。安装 ROS2 Humble 时执行:

sudo apt install ros-humble-desktop

报错:

E: Unable to locate package ros-humble-desktop

排查顺序:

  1. 先执行sudo apt update,刷新软件包列表。
  2. 确认 Ubuntu 版本是 22.04。系统版本不匹配时,这个包名可能不存在。
  3. 确认 ROS2 软件源已添加。ROS2 的包不在 Ubuntu 默认软件源里,必须先添加 ROS2 官方或镜像源。
  4. 检查网络。如果源已添加但下载列表失败,大概率是网络或镜像源问题。

最容易被忽略的是第 3 步。很多人执行完sudo apt update后直接安装,但忘了添加 ROS2 的 apt 源,自然会找不到软件包。

6.2 文件没有执行权限和 command not found

在 ROS2 开发中,下载的开源工具或自己写的脚本运行时,出现Permission denied

chmod +x 文件名

然后重新运行。如果出现command not found,则要区分两种情况:

  • 命令本身没安装。使用which 命令名检查。
  • 命令已安装,但不在 PATH 里。使用ls /opt/ros/humble/bin/查看实际路径。

对于 ROS2 来说,如果which ros2没有输出,而/opt/ros/humble/bin/下确实存在 ros2,多半是环境变量没有被 source。

6.3 脚本在 Windows 编辑过,报奇怪的换行错误

用 VSCode 在 Windows 上写完脚本,传到 Ubuntu 执行时出现:

$'\r': command not found

原因是 Windows 的换行符是 CRLF,Linux 只识别 LF。转换方式:

sed -i 's/\r$//' run.sh

也可以在 VSCode 右下角把换行符改成 LF 后重新保存。这类问题看起来玄,其实就是换行符细节。

6.4 Python 环境和系统自带解释器冲突

Linux 系统自带的 Python 版本,被很多系统工具依赖。不要随便卸载,也不要轻易用 pip 全局覆盖,否则可能导致系统命令都出问题。

建议方式:

  • 使用python3 -m pip install --user 包名
  • 创建虚拟环境:python3 -m venv myenv
  • 使用 conda 管理不同项目的 Python 版本。

安装新 Python 版本时,更推荐通过现成的工具链或源码编译安装到/usr/local,不要触碰/usr/bin/python3这个路径。

6.5 虚拟机卡顿和软件源下载慢

虚拟机卡顿,不要第一时间加 CPU 核数。先看内存分配,再看系统负载。ROS2 启动后资源占用高时,降低图形界面的动画效果,或关闭不需要的桌面组件。

软件源下载慢时,把系统源换成国内镜像。换完后执行:

sudo apt update

这个问题在虚拟机里很常见,但解决起来很简单,重点是先确认网络是否连通,再考虑源的问题。

6.6 脚本在生产环境跑,不能只看“能不能跑”

如果只是学习,Shell 脚本随便写没关系。但如果要在机器人上长期运行,就需要注意:

  • 输出目录要单独规划,不能用当前目录乱放。
  • 日志要有时间戳,方便归档和回查。
  • 关键步骤要输出明确的信息,不能静默执行。
  • set -e,避免错误继续执行。
  • 失败时要有退出码,方便外部判断是否成功。

判断标准很简单:脚本能不能连续重复跑 10 次不出错?出错时日志能不能帮助定位?如果这两点做不到,脚本还需要完善。

7. 给具身智能入门者的学习节奏建议

7.1 不要等“完全学会”再学 ROS2

很多人的学习计划是:先花四个月学完 Linux 常用命令、再学 C++/Python、再学 ROS2、最后开始做项目。这个计划基本会烂尾。

更有效的节奏是:先用一两周掌握终端操作和 Shell 脚本基础,然后直接按 ROS2 教程走。在真实需求里遇到哪块 Linux 知识点不够,再回头补。

你会发现,Shell 内容和 ROS2 是穿插着学的:

  • 学 ROS2 工作空间时,会用到 source、mkdir、编译环境变量。
  • 写 launch 文件时,会用到脚本逻辑。
  • 处理数据集时,会用到批量命令和文件操作。

这些知识在真实需求中掌握得最快,而不是靠单独背命令。

7.2 建议按顺序完成这六个练习

在看 ROS2 正式教程之前,可以先完成下面这份练习清单:

  1. 用虚拟机安装 Ubuntu 22.04,配置国内软件源。
  2. 在虚拟机里更新系统,安装 git、curl、VSCode。
  3. 用命令行创建目录,下载一个开源功能包并解压。
  4. 写一个脚本,把目录里所有.txt文件统一加上时间戳前缀。
  5. 写一个脚本,检查/opt/ros/humble/setup.bash是否存在并输出提示。
  6. 写一个脚本,同时启动两个 ROS2 节点,并输出节点列表。

前三个练习帮你把环境跑通,后三个练习帮你把 Shell 自动化能力接进 ROS2 工作流。做完这些,你再回到 ROS2 教程,会发现很多安装步骤和启动命令看起来都熟悉了。

7.3 维护一份自己的报错记录

机器人开发过程中,很多报错其实是同一个套路:环境没 source、路径不对、权限不足、版本不匹配、换行符错误。

建议在学习笔记里维护一个“报错记录”文件,每次遇到报错,都写清楚三行:

  • 现象:实际看到了什么。
  • 排查过程:依次检查了什么。
  • 解决方案:最终怎么解决。

不用写得很正式,自己能看懂就行。下次遇到类似问题,先翻记录,很可能直接跳过漫长的排查过程。这个方法对 Linux、Shell、ROS2 都适用。

说到底,具身智能和 ROS2 的门槛不只是算法和硬件,还有一套和图形界面完全不同的操作习惯。Linux 命令行是进入这套系统的入口,Shell 脚本是把重复工作变成自动化工具的钥匙。先把终端用顺,再谈机器人跑起来,这个顺序别颠倒。我建议你从虚拟机开始,装好系统,跑通第一个脚本,后面会顺畅得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询