具身智能和 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 安装和入门项目。遇到不熟的命令,用--help或man查,比背完整命令大全高效得多。
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.04 | ROS2 Humble | 入门最推荐,资料最多 |
| Ubuntu 20.04 | ROS2 Foxy | 老项目里还能见到 |
| Ubuntu 24.04 | ROS2 Jazzy | 较新组合,教程需要适配 |
不同发行版的二进制包不通用。你在网上看到一篇教程,第一件事不是复制命令,而是看它用的 Ubuntu 版本。如果教程针对 Ubuntu 22.04,你却用 Ubuntu 24.04 执行,安装 ros-humble-desktop 就会提示找不到软件包。
2.3 新装 Ubuntu 后先做这几件小事
安装完系统,不要急着装 ROS2。先把基础环境整理干净:
- 更换软件源到国内镜像,比如阿里云、清华源,能明显降低下载超时概率。
- 执行
sudo apt update和sudo apt upgrade,把系统软件包列表刷新到最新。 - 安装基础工具:
curl、git、vim、net-tools、build-essential。 - 安装 VSCode,后面编辑代码和脚本会常用。
- 给虚拟机拍一个快照,方便后续出问题时回滚。
这里最容易忽略的是第 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 -lacd切换目录,~代表当前用户的家目录。ls -la显示隐藏文件、权限、所有者和大小。刚到一个新目录,我一般先执行ls -la,确认眼前的东西和预期一致,再继续操作。
复制、移动、重命名:
cp -r src_backup src_new mv old_name.py new_name.pymv在 Linux 里既是移动,也是重命名。热词里提到的“用 shell 重命名文件”,最简单的方式就是mv。只有批量重命名时才需要写循环脚本。
查看文本和日志:
cat setup.py less /var/log/syslog tail -f ~/ros2_ws/log/console.logcat适合看小文件,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 $total4.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排查顺序:
- 先执行
sudo apt update,刷新软件包列表。 - 确认 Ubuntu 版本是 22.04。系统版本不匹配时,这个包名可能不存在。
- 确认 ROS2 软件源已添加。ROS2 的包不在 Ubuntu 默认软件源里,必须先添加 ROS2 官方或镜像源。
- 检查网络。如果源已添加但下载列表失败,大概率是网络或镜像源问题。
最容易被忽略的是第 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 正式教程之前,可以先完成下面这份练习清单:
- 用虚拟机安装 Ubuntu 22.04,配置国内软件源。
- 在虚拟机里更新系统,安装 git、curl、VSCode。
- 用命令行创建目录,下载一个开源功能包并解压。
- 写一个脚本,把目录里所有
.txt文件统一加上时间戳前缀。 - 写一个脚本,检查
/opt/ros/humble/setup.bash是否存在并输出提示。 - 写一个脚本,同时启动两个 ROS2 节点,并输出节点列表。
前三个练习帮你把环境跑通,后三个练习帮你把 Shell 自动化能力接进 ROS2 工作流。做完这些,你再回到 ROS2 教程,会发现很多安装步骤和启动命令看起来都熟悉了。
7.3 维护一份自己的报错记录
机器人开发过程中,很多报错其实是同一个套路:环境没 source、路径不对、权限不足、版本不匹配、换行符错误。
建议在学习笔记里维护一个“报错记录”文件,每次遇到报错,都写清楚三行:
- 现象:实际看到了什么。
- 排查过程:依次检查了什么。
- 解决方案:最终怎么解决。
不用写得很正式,自己能看懂就行。下次遇到类似问题,先翻记录,很可能直接跳过漫长的排查过程。这个方法对 Linux、Shell、ROS2 都适用。
说到底,具身智能和 ROS2 的门槛不只是算法和硬件,还有一套和图形界面完全不同的操作习惯。Linux 命令行是进入这套系统的入口,Shell 脚本是把重复工作变成自动化工具的钥匙。先把终端用顺,再谈机器人跑起来,这个顺序别颠倒。我建议你从虚拟机开始,装好系统,跑通第一个脚本,后面会顺畅得多。