Ubuntu 24.04 arm 安装docker 然后部署ros1

Ubuntu 24.04 arm 安装docker

我直接参考Ubuntu ARM 安装 Docker进行安装;
安装完成后,需要执行以下语句把当前用户添加到docker用户组:

sudo usermod -aG docker $USER

然后重启,就能直接执行以下这类命令等等而不用加sudo

docker ps

docker虚拟ros1

主要参考,kimi2的问答,以及:
在ubuntu22.04中借助docker实现安装、调试ros1.0
如何轻松在Docker容器中安装ROS:一站式指南与常见问题解答
ros1+docker环境快速搭建
在 docker 上安装 ROS1/2

拉取镜像并验证,这个方案失败了

# 拉取ARM64架构的ROS1 Noetic桌面完整版
docker pull --platform linux/arm64 osrf/ros:noetic-desktop-full

# 验证镜像
docker images | grep noetic

自己构建镜像

构建与测试

# 在Edge2创建文件夹
mkdir -p ~/docker-ros-arm64
cd ~/docker-ros-arm64

cat > Dockerfile << 'EOF'
FROM arm64v8/ubuntu:20.04
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV LANG=en_US.UTF-8
ENV LC_ALL=en_US.UTF-8

# 第一步:安装基础工具
RUN apt-get update && apt-get install -y \
    curl gnupg2 lsb-release software-properties-common \
    build-essential python3-pip git sudo bash-completion \
    locales tzdata && \
    locale-gen en_US en_US.UTF-8 && update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8

# 第二步:添加ROS源
RUN sh -c 'echo "deb https://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654

# 第三步:安装ROS Noetic和catkin-tools
RUN apt-get update && apt-get install -y \
    ros-noetic-desktop-full \
    python3-rosdep \
    python3-rosinstall \
    python3-catkin-tools && \
    rm -rf /var/lib/apt/lists/*

# 第四步:手动创建rosdep配置(跳过rosdep init和update)
RUN mkdir -p /etc/ros/rosdep/sources.list.d && \
    echo "yaml https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git/master/rosdep/osx-homebrew.yaml osx" > /etc/ros/rosdep/sources.list.d/20-default.list && \
    echo "yaml https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git/master/rosdep/base.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list && \
    echo "yaml https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git/master/rosdep/python.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list && \
    echo "yaml https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git/master/rosdep/ruby.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list && \
    echo "yaml https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git/master/releases/fuerte.yaml" >> /etc/ros/rosdep/sources.list.d/20-default.list && \
    sed -i 's|https://raw.githubusercontent.com/ros/rosdistro/master|https://mirrors.tuna.tsinghua.edu.cn/git/rosdistro.git|g' /etc/ros/rosdep/sources.list.d/20-default.list

# 第五步:设置环境
RUN echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc
RUN mkdir -p /workspace/src
WORKDIR /workspace
CMD ["bash"]
EOF

清理旧的编译(因为我尝试了很多次)并重新编译:

# 清理失败状态
docker system prune -f

# 重新构建
docker build -t ros:noetic-edge2-arm64 .

快速验证

# 验证架构
docker inspect ros:noetic-edge2-arm64 | grep Architecture
# 输出:"Architecture": "arm64"

验证ros版本:

# 方法1:使用交互式shell(推荐)
docker run -it --rm ros:noetic-edge2-arm64 bash
# 进入容器后执行:
root@xxxx:/workspace# echo $ROS_DISTRO
# 输出:noetic

我的成功输出。

在vscode的ssh中使用

首先要确保vscode安装了如下插件:Dev Containers,Remote-SSH.

然后,创建测试用的文件夹并进入,

mkdir -p ~/ros1_docker_test/src
cd ~/ros1_docker_test

创建容器配置目录,并填入配置文件

# 创建.devcontainer配置目录
mkdir .devcontainer

cat > .devcontainer/devcontainer.json << 'EOF'
{
  "name": "ROS1 Noetic ARM64",
  "image": "ros:noetic-edge2-arm64",
  "workspaceFolder": "/workspace",
  "workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,consistency=cached",
  "runArgs": [
    "--privileged",
    "--platform=linux/arm64",
    "--network=host",
    "-e", "DISPLAY=${localEnv:DISPLAY}",
    "-v", "/tmp/.X11-unix:/tmp/.X11-unix:rw",
    "-v", "/dev:/dev"
  ],
  "postCreateCommand": "rosdep update && echo 'source /opt/ros/noetic/setup.bash' >> ~/.bashrc",
  "remoteUser": "root",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-iot.vscode-ros",
        "ms-vscode.cpptools",
        "ms-python.python"
      ],
      "settings": {
        "terminal.integrated.defaultProfile.linux": "bash",
        "ros.distro": "noetic"
      }
    }
  }
}
EOF

VSCode连接流程

    打开VSCode → 连接Edge2 SSH
    打开文件夹 ~/ros1_docker_test
    右下角点击"Reopen in Container"
    等待容器启动(首次5-10秒)

然后之后的使用体验基本和原生Ubuntu20-ros1一致了。

然后是测试创建包以及编译

# 验证1:ROS环境
root@xxxx:/workspace# echo $ROS_DISTRO
# 输出:noetic

# 验证2:编译工具
root@xxxx:/workspace# which catkin_make
# 输出:/opt/ros/noetic/bin/catkin_make

# 验证3:创建测试包
root@xxxx:/workspace# cd src
root@xxxx:/workspace/src# catkin_create_pkg test_pkg std_msgs rospy roscpp
# 成功创建

# 验证4:编译
root@xxxx:/workspace/src# cd ..
root@xxxx:/workspace# catkin_make
# 成功编译

# 验证5:运行roscore
root@xxxx:/workspace# roscore &
# 成功启动

后续的一些部署的测试啥的,我会卸载新的笔记中,目前来看,已经具备迁移测试之前的一些东西的条件了。

增量构建

主要是换了鱼香的rosdepc

mkdir -p ros-arm64-rosdepc-build && cd ros-arm64-rosdepc-build

# 2. 创建Dockerfile(基于旧镜像)
cat > Dockerfile << 'EOF'
# 基于你的旧镜像(已有ROS,无rosdep)
FROM ros:noetic-edge2-arm64

# 安装rosdepc
RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple rosdepc

# 构建阶段执行rosdepc init和update(结果固化在镜像中)
RUN rosdepc init && rosdepc update

# 设置workspace
WORKDIR /workspace
CMD ["bash"]
EOF

# 3. 构建新镜像(非常快)
docker build -t ros:noetic-arm64-rosdepc .

# 4. 验证(现在有3个镜像)
docker images ros        
# IMAGE                      ID             DISK USAGE   CONTENT SIZE   EXTRA
# ros:noetic-arm64-rosdepc   dfc6152c8929       6.74GB         1.38GB        
# ros:noetic-edge2-arm64     2ba91b897f11       6.73GB         1.38GB    U  

在.devcontainer/devcontainer.json文件中修改第2行第14行为

"image": "ros:noetic-arm64-rosdepc",
"postCreateCommand": "rosdepc update && echo 'source /opt/ros/noetic/setup.bash' >> ~/.bashrc",

直接安装鱼香ROS1

参考 Docker中安装ROS系统
执行

wget http://fishros.com/install -O fishros && . fishros

截取过程中一些重要的可能以后用得上的打印信息(我最终没有使用这个版本,但是看起来挺好用)

        ----------------------------------------------------------------------
RUN Choose Task:[请输入括号内的数字]
---众多工具,等君来用---
ROS相关:
  [1]:一键安装(推荐):ROS(支持ROS/ROS2,树莓派Jetson)
  [3]:一键安装:rosdep(小鱼的rosdepc,又快又好用)
  [4]:一键配置:ROS环境(快速更新ROS环境设置,自动生成环境选择)
  [9]:一键安装:Cartographer(18 20测试通过,16未测. updateTime 20240125)
  [11]:一键安装:ROS Docker版(支持所有版本ROS/ROS2)
  [16]:一键安装:系统自带ROS (!!警告!!仅供特殊情况下使用)

常用软件:
  [2]:一键安装:github桌面版(小鱼常用的github客户端)
  [6]:一键安装:NodeJS环境
  [7]:一键安装:VsCode开发工具
  [8]:一键安装:Docker
  [10]:一键安装:微信(可以在Linux上使用的微信)
  [12]:一键安装:PlateformIO MicroROS开发环境(支持Fishbot)
  [15]:一键安装:QQ for Linux

配置工具:
  [5]:一键配置:系统源(更换系统源,支持全版本Ubuntu系统)
  [13]:一键配置:python国内源
  [17]:一键配置: Docker代理(支持VPN+代理服务两种模式)

[0]:quit

请输入[]内的数字以选择:11

欢迎使用一键安装ROS-Docker版,支持所有版本ROS,本工具由作者小鱼提供
================================1.版本选择======================================
RUN Choose Task:[请输入括号内的数字]
请选择你要安装的ROS版本名称(请注意ROS1和ROS2区别):
[1]:jazzy (ROS2)
[2]:noetic (ROS1)
[3]:humble (ROS2)
[4]:foxy (ROS2)
[5]:galactic (ROS2)
[6]:iron (ROS2)
[7]:melodic (ROS1)
[8]:rolling (ROS2)
[9]:kinetic (ROS1)
[10]:eloquent (ROS2)
[11]:dashing (ROS2)
[12]:crystal (ROS2)
[13]:bouncy (ROS2)
[14]:ardent (ROS2)
[15]:lunar (ROS2)
[16]:indigo (ROS1)
[0]:quit
请输入[]内的数字以选择:2
你选择了noetic(ROS1),该版本目前状态:长期支持
================================2.安装Docker======================================
Run CMD Task:[docker version]
[-][0.05s] CMD Result:success

=================3.下载镜像(该步骤因网络原因会慢一些,若失败请重试)==================
Run CMD Task:[sudo docker pull ros:noetic ]
Error response from daemon: failed to resolve reference "docker.io/library/ros:noetic": failed to do request: Head "https://registry-1.docker.io/v2/library/ros/manifests/noetic": dial tcp 96.44.137.28:443: i/o timeout
Run CMD Task:[sudo docker pull ros:noetic ]
Error response from daemon: failed to resolve reference "docker.io/library/ros:noetic": failed to do request: Head "https://registry-1.docker.io/v2/library/ros/manifests/noetic": dial tcp 45.77.186.255:443: i/o timeout
Run CMD Task:[sudo docker pull ros:noetic ]
Error response from daemon: failed to resolve reference "docker.io/library/ros:noetic": failed to do request: Head "https://registry-1.docker.io/v2/library/ros/manifests/noetic": dial tcp 45.77.186.255:443: i/o timeout
================================4.生成容器======================================
请为你的noetic容器取个名字吧!
>>ros1
收到名字ros1
请问你要使用什么网络模式?
1.host (主机模式,容器共享宿主机的网络命名空间,没有隔离(仅 Linux)) 
2.bridge (桥接模式,默认网络模式,每个容器都有自己的 IP,容器之间通过网桥通信,宿主机通过端口映射访问) 
>>1

RUN Choose Task:[请输入括号内的数字]
为方便后续使用容器,请选择使用方式,若不知道怎么选,推荐套餐1,若不需要则可以选退出:
[1]:套餐1:VsCode+插件(本地使用推荐)
[2]:套餐2:SSH-Service(远程使用推荐)
[0]:quit
请输入[]内的数字以选择:2

===========================后续使用指令=================================
后续可在任意终端输入ros1来启动/停止/测试/删除容器
==============================文件存储位置===============================
你的主目录已经和容器的对应目录做了映射
==============================问题反馈&&更新讨论=============================
请访问社区的一键安装版块:https://fishros.org.cn/forum/topic/112
配置文件已保存至: /tmp/fish_install.yaml
欢迎加入机器人学习交流QQ群:438144612(入群口令:一键安装)
鱼香小铺正式开业,最低499可入手一台能建图会导航的移动机器人,淘宝搜店:鱼香ROS 或打开链接查看:https://item.taobao.com/item.htm?id=696573635888
如在使用过程中遇到问题,请打开:https://fishros.org.cn/forum 进行反馈

不过我没有成功用起来,怎么输密码都不对,还是卸载了。

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容