要完成完全的离线安装,需要提前下载所有必需的软件包和依赖项。以下是完整的离线安装方案:
1. 准备离线环境
1.1 在有网络的环境中准备离线包
在一台有网络且系统相同的机器上(Ubuntu 20.04),执行以下步骤:
bash
# 创建离线包目录
mkdir -p ~/ros-offline/apt-packages
mkdir -p ~/ros-offline/rosdep
mkdir -p ~/ros-offline/vscode
mkdir -p ~/ros-offline/scripts
# 保存当前系统的软件包列表
dpkg --get-selections > ~/ros-offline/package-list.txt
1.2 下载 ROS 相关软件包
bash
# 1. 添加 ROS 源并下载所有相关包
# 方式 A(推荐,适用于 Ubuntu 20.04+):将密钥放入 keyrings,源中指定 signed-by
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/ros-latest.list > /dev/null
# 方式 B(旧方式,apt-key 已弃用但 Ubuntu 20.04 仍可用):若方式 A 失败可尝试
# wget -qO - https://packages.ros.org/ros.key | sudo apt-key add -
# sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu focal main" > /etc/apt/sources.list.d/ros-latest.list'
# 3. 更新源
sudo apt-get update
# 4. 下载 ROS Noetic 桌面完整版及其所有依赖(不安装)
cd ~/ros-offline/apt-packages
apt-get download $(apt-cache depends --no-pre-depends --no-recommends --no-suggests \
--no-conflicts --no-breaks --no-replaces --no-enhances \
--recurse ros-noetic-desktop-full | grep "^\w" | sort -u)
# 5. 下载其他必需的软件包
apt-get download \
python3-rosdep \
python3-catkin-tools \
python3-osrf-pycommon \
build-essential \
cmake \
g++ \
python3-rosinstall \
python3-rosinstall-generator \
python3-wstool \
libgflags-dev \
libgoogle-glog-dev \
liblapack-dev \
libblas-dev \
libsuitesparse-dev
# 6. 下载 catkin 相关包
apt-get download ros-noetic-catkin
1.3 下载 VSCode 及相关文件
bash
# 1. 下载 VSCode 安装包
cd ~/ros-offline/vscode
wget https://update.code.visualstudio.com/latest/linux-deb-x64/stable -O vscode.deb
# 2. 下载微软 GPG 密钥(用于验证 VSCode 包,可选)
wget -qO- https://packages.microsoft.com/keys/microsoft.asc | gpg --dearmor -o packages.microsoft.gpg
# 3. 下载 ROS VSCode 插件(当前最新为 0.9.6,仓库已归档可继续使用)
wget "https://github.com/ms-iot/vscode-ros/releases/download/0.9.6/ros-0.9.6.vsix" -O ms-iot.vscode-ros.vsix
1.4 准备 rosdep 数据
bash
# 1. 初始化并更新 rosdep(在有网络的环境)
sudo apt-get install python3-rosdep
sudo rosdep init
rosdep update
# 2. 备份 rosdep 数据
cd ~/ros-offline/rosdep
sudo cp -r /etc/ros/rosdep/ ./etc-ros-rosdep/
sudo cp -r /usr/lib/python3/dist-packages/rosdep2/ ./rosdep2-python/
cp -r ~/.ros/rosdep/ ./home-ros-rosdep/
1.5 创建安装脚本
在 ~/ros-offline/scripts 目录中创建以下脚本:
bash
#!/bin/bash
# install-ros-offline.sh
# 通过脚本所在目录定位离线包根目录,避免 sudo 时 ~ 指向 /root 导致路径错误
set -e
OFFLINE_ROOT="$(cd "$(dirname "$0")/.." && pwd)"
echo "=== 开始离线安装 ROS Noetic ==="
echo "离线包路径: $OFFLINE_ROOT"
# 1. 安装所有下载的 deb 包
echo "安装 ROS 及相关软件包..."
sudo dpkg -i "$OFFLINE_ROOT/apt-packages/"*.deb 2>/dev/null || true
# 2. 修复依赖关系
echo "修复依赖关系..."
sudo apt-get install -f -y --allow-downgrades --allow-remove-essential --allow-change-held-packages
# 3. 恢复 rosdep 数据
echo "配置 rosdep..."
sudo mkdir -p /etc/ros/rosdep/
sudo cp -r "$OFFLINE_ROOT/rosdep/etc-ros-rosdep"/* /etc/ros/rosdep/
sudo cp -r "$OFFLINE_ROOT/rosdep/rosdep2-python"/* /usr/lib/python3/dist-packages/rosdep2/
mkdir -p ~/.ros/rosdep
cp -r "$OFFLINE_ROOT/rosdep/home-ros-rosdep"/* ~/.ros/rosdep/
# 4. 设置环境变量
echo "配置环境变量..."
echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
source /opt/ros/noetic/setup.bash
# 5. 安装 VSCode
echo "安装 VSCode..."
sudo dpkg -i "$OFFLINE_ROOT/vscode/vscode.deb"
# 6. 安装 VSCode ROS 插件
echo "安装 VSCode ROS 插件..."
code --install-extension "$OFFLINE_ROOT/vscode/ms-iot.vscode-ros.vsix"
echo "=== ROS Noetic 离线安装完成 ==="
echo "请运行 'source ~/.bashrc' 使环境变量生效"
bash
#!/bin/bash
# setup-workspace.sh
set -e
echo "=== 设置 ROS 工作空间 ==="
# 1. 创建 catkin 工作空间
mkdir -p ~/catkin_ws/src
cd ~/catkin_ws
# 2. 初始化工作空间
catkin init
# 3. 编译空工作空间
catkin build
# 4. 设置环境变量
echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc
source ~/catkin_ws/devel/setup.bash
echo "=== ROS 工作空间设置完成 ==="
2. 离线环境安装步骤
2.1 传输离线包到目标机器
将 ~/ros-offline 整个目录传输到目标离线机器(使用U盘、移动硬盘或内部网络):
bash
# 在目标机器上创建目录
mkdir -p ~/ros-offline
# 将整个 ros-offline 目录复制到目标机器的 ~/ 目录下
2.2 在目标机器上执行离线安装
bash
# 1. 进入离线包目录
cd ~/ros-offline
# 2. 给脚本执行权限
chmod +x scripts/*.sh
# 3. 执行安装脚本
sudo ./scripts/install-ros-offline.sh
# 4. 设置工作空间
./scripts/setup-workspace.sh
# 5. 验证安装
source ~/.bashrc
printenv | grep ROS
rosversion -d
# 6. 测试 ROS
# 打开终端1
roscore
# 打开终端2
rosrun roscpp_tutorials talker
3. 创建完整的离线安装包(可选)
如果需要创建可重复使用的离线安装包:
bash
# 在有网络的环境中
cd ~
tar -czvf ros-noetic-offline-ubuntu20.04.tar.gz ros-offline/
# 创建自解压安装包
cat > ros-offline-installer.sh << 'EOF'
#!/bin/bash
echo "正在解压 ROS Noetic 离线安装包..."
tail -n +$(($(grep -n "^__ARCHIVE__" $0 | cut -d: -f1) + 1)) $0 | tar -xz
cd ros-offline
chmod +x scripts/*.sh
echo "请执行: sudo ./scripts/install-ros-offline.sh"
exit 0
__ARCHIVE__
EOF
cat ros-noetic-offline-ubuntu20.04.tar.gz >> ros-offline-installer.sh
chmod +x ros-offline-installer.sh
4. 注意事项
4.1 系统要求
- 目标机器必须是 Ubuntu 20.04(与下载环境相同)
- 系统架构必须一致(通常都是 amd64)
4.2 常见问题解决
问题1: 依赖关系错误
bash
# 若目标机器可联网,可尝试(完全离线时 apt-get update 会失败,可跳过 update 仅执行 install -f)
sudo apt-get update
sudo apt-get install -f -y
问题2 : rosdep 初始化失败
从离线包恢复 rosdep 配置(将备份的 etc-ros-rosdep 复制到 /etc/ros/rosdep/):
bash
# 从离线包恢复(请将路径改为你本机的 ros-offline 实际位置)
sudo mkdir -p /etc/ros/rosdep
sudo cp -r ~/ros-offline/rosdep/etc-ros-rosdep/* /etc/ros/rosdep/
问题3: VSCode 安装失败
bash
# 手动安装依赖
sudo apt-get install libxss1 libasound2 libgbm1 -y
sudo dpkg -i ~/ros-offline/vscode/vscode.deb
4.3 最小化离线包版本
如果存储空间有限,可以创建最小化离线包:
bash
# 只下载必要包(约2GB)
apt-get download \
ros-noetic-ros-base \
python3-rosdep \
python3-catkin-tools \
build-essential \
cmake \
g++
5. 验证安装
在目标机器上执行以下验证:
bash
# 1. 验证 ROS 核心
printenv | grep ROS
rosversion -d
# 2. 验证编译工具
which g++
which cmake
which catkin
# 3. 创建测试包
cd ~/catkin_ws/src
catkin_create_pkg test_pkg roscpp rospy std_msgs
cd ~/catkin_ws
catkin build
source devel/setup.bash
# 4. 运行简单节点
roscore &
sleep 2
rosrun roscpp_tutorials talker
这个离线安装方案包含了所有必需的组件,可以在完全无网络的环境中安装完整的 ROS Noetic 开发环境。