linux ubuntu22.04安装ROS2humble完整版的流程

linux ubuntu22.04安装ROS2::humble完整版的流程

前提准备:确保你的电脑里装有docker,如果没有需要安装docker

1. 下载ROS2::humble完整版镜像的命令

bash 复制代码
docker pull osrf/ros:humble-desktop-full

如果需要指定其他版本,可选:

  • osrf/ros:humble-desktop - 桌面版(不含仿真工具)
  • osrf/ros:humble-ros-base - 基础版(仅核心功能)
  • osrf/ros:humble - 最新稳定版

2. 使用镜像

推荐使用脚本启动,可以自行更改配置。

bash 复制代码
#!/bin/bash

# ================== 配置区 ==================
CONTAINER_NAME="ros2_humble_dev"                              # 容器名称
IMAGE_NAME="osrf/ros:humble-desktop-full"                     # ROS2镜像
WORKSPACE_HOST="/home/*******/ros2_ws"             	          # 宿主机工作空间路径(修改为你自己的路径)
WORKSPACE_CONTAINER="/workspace"                              # 容器内工作空间路径
MEMORY="16g"                                                  # 内存限制
MEMORY_SWAP="20g"                                             # 交换内存限制
CPUS="8"                                                      # CPU核心数限制
# ==========================================

# Linux: 允许容器访问 GUI(图形界面)
if [[ "$OSTYPE" == "linux-gnu"* ]]; then
    xhost +local:root >/dev/null 2>&1
fi

# 检查容器是否存在
if ! docker ps -aq -f name=^/${CONTAINER_NAME}$ 2>/dev/null | grep -q .; then
    # 容器不存在,创建新容器
    echo "正在创建新容器 $CONTAINER_NAME..."
    
    docker run -d \
      --name "$CONTAINER_NAME" \
      --memory="$MEMORY" \
      --memory-swap="$MEMORY_SWAP" \
      --cpus="$CPUS" \
      --network=host \                                         # 使用宿主机网络,方便ROS2多机通信
      -v /dev/shm:/dev/shm \                                    # 共享内存,ROS2通信需要
      -v /tmp/.X11-unix:/tmp/.X11-unix \                        # 挂载X11套接字,用于显示GUI(rviz2、gazebo等)
      -v "$WORKSPACE_HOST":"$WORKSPACE_CONTAINER" \             # 挂载工作空间,代码持久化
      -w "$WORKSPACE_CONTAINER" \                               # 设置容器默认工作目录
      -e DISPLAY="$DISPLAY" \                                   # 设置显示器环境变量
      -e XDG_RUNTIME_DIR=/tmp/runtime-root \                    # 运行时目录
      -e QT_X11_NO_MITSHM=1 \                                   # Qt程序兼容性设置
      "$IMAGE_NAME" \
      tail -f /dev/null                                         # 保持容器运行
    
    if [ $? -eq 0 ]; then
        echo "容器创建成功"
        sleep 2
        
        # 配置 ROS2 环境(自动添加到bashrc)
        docker exec "$CONTAINER_NAME" bash -c "echo 'source /opt/ros/humble/setup.bash' >> ~/.bashrc" 2>/dev/null
        # 如果工作空间有install目录,自动source
        docker exec "$CONTAINER_NAME" bash -c "echo '[ -f /workspace/install/setup.bash ] && source /workspace/install/setup.bash' >> ~/.bashrc" 2>/dev/null
    else
        echo "容器创建失败"
        exit 1
    fi
fi

# 检查容器是否在运行
if ! docker ps -q -f name=^/${CONTAINER_NAME}$ 2>/dev/null | grep -q .; then
    echo "容器已停止,正在启动..."
    docker start "$CONTAINER_NAME" >/dev/null
    sleep 2
fi

# 进入容器
echo "进入容器 $CONTAINER_NAME..."
echo "提示:多个终端可以同时运行此命令,都会进入同一个容器"
docker exec -it "$CONTAINER_NAME" bash

3.丰富容器

​ 往往仅依赖osrf/ros:humble-desktop-full这一个镜像无法满足我们的工作需求,我们还想在docker中使用某些软件,或者其他库等,则需要创建Dockerfile来构建新的镜像,这样才能在创建的docker中使用这些软件及库文件。

3.1 简单放一些工具及库进去。创建的Dockerfile名字别写错

bash 复制代码
# ================== 基础镜像 ==================
FROM osrf/ros:humble-desktop-full

# ================== 环境配置 ==================
# 避免交互式安装
ENV DEBIAN_FRONTEND=noninteractive

# 可选:更换为国内源(加快下载速度,根据你的网络情况决定是否启用)
# 中科大源(推荐)
# RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
# 阿里云源
# RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
# 清华源
# RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list

# ================== 安装基础开发工具 ==================
RUN apt-get update && apt-get install -y \
    # 文本编辑器
    vim \
    gedit \
    # 版本控制
    git \
    # 网络工具
    wget \
    curl \
    # 编译工具
    cmake \
    build-essential \
    gdb \
    # 系统工具
    htop \
    tmux \
    sudo \
    tree \
    unzip \
    zip \
    # Python 工具
    python3-pip \
    python3-venv \
    # 清理缓存(减小镜像体积)
    && rm -rf /var/lib/apt/lists/*

# ================== 安装常用第三方库 ==================
RUN apt-get update && apt-get install -y \
    # 图像处理
    libopencv-dev \
    python3-opencv \
    # 点云处理
    libpcl-dev \
    # 线性代数
    libeigen3-dev \
    # 可视化
    libgl1-mesa-dev \
    libglu1-mesa-dev \
    # 清理缓存
    && rm -rf /var/lib/apt/lists/*

# ================== 安装 Python 常用库 ==================
RUN pip3 install --no-cache-dir \
    numpy \
    scipy \
    matplotlib \
    pyyaml \
    pandas

# ================== 配置环境 ==================
# 自动 source ROS2 环境
RUN echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc

# 设置工作目录
WORKDIR /workspace

# 保持容器运行
CMD ["tail", "-f", "/dev/nulldocker build -t my_ros2_dev:latest .
"]

3.2 构建新的更丰富的镜像

bash 复制代码
docker build -t my_ros2_dev:latest .

3.3 docker images命令查看你构建的镜像

3.4 运行容器

修改启动脚本run_ros2.sh 中的 IMAGE_NAME 为 my_ros2_dev:latest(你刚才构建的新Docker镜像),然后运行

bash 复制代码
./run_ros2.sh

3.5 容器的常用操作命令

3.5.1 docker ps -a

执行 docker ps -a 会显示所有容器(包括运行中和已停止的),输出示例:

bash 复制代码
CONTAINER ID   IMAGE                          COMMAND                  CREATED        STATUS            PORTS        NAMES
fcab3ad4f9cd   osrf/ros:humble-desktop-full   "tail -f /dev/null"      2 hours ago    Up 2 hours                  ros2_humble_dev 
e3d8fd034c1b   image20260310:latest           "/bin/bash"              5 days ago     Exited (0) 2 days ago       image20260310
4ec2381d5183   scllovewkf/opencalib:v1        "/ros_entrypoint.sh..."    2 weeks ago    Up 2 weeks                  opencalib_dev

各列含义

列名 说明 示例值
CONTAINER ID 容器唯一ID(前12位) fcab3ad4f9cd
IMAGE 容器使用的镜像名称 osrf/ros:humble-desktop-full
COMMAND 容器启动时执行的命令 "tail -f /dev/null"
CREATED 容器创建时间 2 hours ago
STATUS 容器当前状态 Up 2 hours(运行中) Exited (0) 2 days ago(已停止)
PORTS 端口映射(主机端口→容器端口) 0.0.0.0:8080->80/tcp
NAMES 容器名称(可自定义) ros2_humble_dev

STATUS 状态详解:

  • Up X minutes/hours:容器正在运行
  • Exited (0):正常退出
  • Exited (1):异常退出(程序错误)
  • Created:已创建但未启动
  • Restarting:正在重启
  • Paused:已暂停
3.5.2 Docker 容器常用操作命令
操作分类 命令 说明 示例
查看容器 docker ps 查看运行中的容器 docker ps
docker ps -a 查看所有容器(含停止的) docker ps -a
docker ps -q 只显示容器ID docker ps -q
docker ps -a --format "table {``{.Names}}\t{``{.Status}}" 自定义显示格式
创建/运行 docker run IMAGE 创建并启动容器 docker run ubuntu
docker run -it IMAGE bash 创建并进入交互式终端 docker run -it ubuntu bash
docker run -d IMAGE 后台运行容器 docker run -d nginx
docker run --name NAME IMAGE 指定容器名称 docker run --name my_ubuntu ubuntu
启动/停止 docker start CONTAINER 启动已停止的容器 docker start my_ubuntu
docker stop CONTAINER 停止运行中的容器 docker stop my_ubuntu
docker restart CONTAINER 重启容器 docker restart my_ubuntu
docker pause CONTAINER 暂停容器进程 docker pause my_ubuntu
docker unpause CONTAINER 恢复暂停的容器 docker unpause my_ubuntu
进入容器 docker exec -it CONTAINER bash 进入容器执行命令(新终端) docker exec -it my_ubuntu bash
docker attach CONTAINER 附加到容器主进程(不推荐) docker attach my_ubuntu
删除容器 docker rm CONTAINER 删除容器(需先停止) docker rm my_ubuntu
docker rm -f CONTAINER 强制删除容器(运行中也可删) docker rm -f my_ubuntu
docker container prune 删除所有停止的容器 docker container prune
日志/信息 docker logs CONTAINER 查看容器日志 docker logs my_ubuntu
docker logs -f CONTAINER 实时跟踪日志输出 docker logs -f my_ubuntu
docker inspect CONTAINER 查看容器详细信息(JSON格式) docker inspect my_ubuntu
docker top CONTAINER 查看容器内进程 docker top my_ubuntu
docker stats CONTAINER 查看容器资源使用情况 docker stats my_ubuntu
文件操作 docker cp HOST_PATH CONTAINER:CONTAINER_PATH 复制文件到容器 docker cp ./file.txt my_ubuntu:/tmp/
docker cp CONTAINER:CONTAINER_PATH HOST_PATH 从容器复制文件 docker cp my_ubuntu:/tmp/file.txt ./
镜像操作 docker images 查看本地镜像列表 docker images
docker pull IMAGE 拉取镜像 docker pull ubuntu:22.04
docker rmi IMAGE 删除镜像 docker rmi ubuntu:22.04
docker build -t NAME . 构建镜像 docker build -t my_image .
清理 docker system prune 删除所有停止的容器、未使用的镜像 docker system prune
docker system prune -a 彻底清理(删除所有未使用的资源) docker system prune -a

3.6 常用组合命令示例

bash 复制代码
# 1. 查看所有容器(包括停止的)
docker ps -a

# 2. 停止所有运行中的容器
docker stop $(docker ps -q)

# 3. 删除所有停止的容器
docker rm $(docker ps -aq)

# 4. 删除所有容器(包括运行中的,强制删除)
docker rm -f $(docker ps -aq)

# 5. 删除所有未使用的镜像
docker image prune -a

# 6. 进入容器并自动 source ROS2 环境
docker exec -it ros2_humble_dev bash -c "source /opt/ros/humble/setup.bash && bash"

# 7. 查看容器资源使用(实时监控)
docker stats

# 8. 在容器内执行单条命令(不进入交互式)
docker exec ros2_humble_dev ros2 topic list

# 9. 导出容器为镜像
docker commit ros2_humble_dev my_backup:latest

# 10. 保存镜像为tar文件
docker save -o my_image.tar my_ros2_dev:latest
相关推荐
zly35002 小时前
centos7 sshd无法启动
linux·运维·服务器
maxmaxma2 小时前
ROS2 机器人 少年创客营:Day 9
机器人·ros2
编程大师哥3 小时前
Linux 命名管道(FIFO)通信 超清晰讲解
linux·运维·服务器
Smile_2542204183 小时前
linux服务器清理磁盘
linux·运维·服务器
KivenMitnick3 小时前
Claude Code--Ubuntu Linux超详细配置教程(附每步的可能报错及解决方法)
linux·运维·ubuntu
panamera124 小时前
linux下SPI、IIC、UART、CAN的编码
linux·运维·服务器
欲盖弥彰13144 小时前
linux设备驱动 -- RK3568 led驱动 (led子系统&设备树)
linux·led·嵌入式linux·led子系统
三万棵雪松4 小时前
【Linux 物联网网关主控系统-Linux主控部分(四)】
linux·物联网·嵌入式linux
returnthem5 小时前
虚拟机sda紧急处理扩容(used100%,无空间剩余,开不了机)
linux·运维·服务器