0502-0503上

1 拉取ros humble镜像

在虚拟机安装Ubuntu22.04,在Ubuntu22.04通过docker拉取ros humble完整镜像(desktop-full)

由于国内网络访问官方镜像源不稳定,指定国内镜像源下载

sudo docker pull osrf/ros:humble-desktop-full          (官方地址)
替换为

sudo docker pull docker.1ms.run/osrf/ros:humble-desktop-full        (国内镜像源docker.1ms.run,可用的国内镜像源还有docker.xuanyuan.me 和 doceer.m.daocloud.io)

下载完成 

1.1 验证

1.1.1 检查镜像是否已下载

sudo docker images | grep humble-desktop-full

1.1.2 快速测试(运行后自动删除容器)

方法一

sudo docker run --rm docker.1ms.run/osrf/ros:humble-desktop-full bash -c "echo \$ROS_DISTRO"

方法二

先进入容器的交互式 Shell
sudo docker run -it --rm docker.1ms.run/osrf/ros:humble-desktop-full

手动source环境变量

source /opt/ros/humble/setup.bash

再检查 ROS 2 发行版
echo $ROS_DISTRO

执行exit 退出并删除容器

1.2 为镜像指定tag

# 将完整版镜像打上短标签
sudo docker tag docker.1ms.run/osrf/ros:humble-desktop-full ros:humble-full

# 以后就可以直接用短标签了
sudo docker run -it --rm ros:humble-full

(我为了不弄混从哪拉取的镜像,这里没指定tag,直接沿用全名docker.1ms.run/osrf/ros:humble-desktop-full

1.3 创建一个容器

自定义创建符合自己要求的容器,我创建的这个容器名为humble

docker run -it \
  --name humble \
  --network=host \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  -v /mnt/hgfs/share:/workspace \
  -e DISPLAY=${DISPLAY} \
  docker.1ms.run/osrf/ros:humble-desktop-full \
  /bin/bash

第5行命令-v /mnt/hgfs/share:/workspace是将虚拟机的目录/mnt/hgfs/share挂载到容器的workspace目录,此外我的另一篇博客VMware虚拟机 安装Ubuntu-CSDN博客,我的虚拟机/mnt/hgfs/share和宿主机的D:\Soft\Ubuntu\share是共享目录

因此容器的workspace目录实际是宿主机的D:\Soft\Ubuntu\share目录,占用的是宿主机的磁盘空间,即:

宿主机 (Windows)                         虚拟机 (Ubuntu)                       Docker 容器
     │   VMware Tools                          │   docker -v                            │
     │    共享文件夹                              │   挂载卷                                │
     ▼                                                  ▼                                            ▼
┌─────────────┐          ┌─────────────┐          ┌─────────────┐
│ D:\Soft\Ubuntu\share│◄─►│    /mnt/hgfs/share    │ ◄─►│      /workspace         │
│        实际存储           │互同步│                                 │互访问│          容器内            │
└─────────────┘          └─────────────┘          └─────────────┘

1.4 查看容器

sudo docker ps -a

1.5 启动与进入容器

假设容器名是humble

case1:有人正在使用容器(正在运行Up),用 sudo docker exec -it humble /bin/bash 进入

case2:没人使用容器(已停止Exited),用 sudo docker start -ai humble 启动并进入

如果进入容器卡住(之前没退出容器就重启ubuntu之类的原因),另起一个终端执行sudo docker stop humble 或sudo docker kill humble,再尝试进入

1.6 写入环境变量

进入容器,注意要英文双引号

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

1.7 开启 X Server 的访问控制

执行 xhost +local: 后,X 服务器允许来自本地(包括 Docker 容器)的连接请求
如果容器中执行会弹出图形窗口的命令失败,例如gazebo/rviz/MoveIt,在宿主机执行:
xhost +local:root

0503下-0505上

 1 启动盘安装ubuntu

虚拟机太卡了,我直接全盘安装Ubuntu系统,这篇博客追加记录U盘启动盘安装Ubuntu全过程安装Ubuntu-VMware虚拟机或U盘启动盘-CSDN博客

2 安装ToDesk

用于另一台windows与这台ubuntu交互,linux版下载地址:https://www.todesk.com/linux.html

下载后按官网提示执行sudo apt-get install ./todesk-vx.x.x.x-amd64.deb,如果出现类似报错:

N: 由于文件'/home/tina/下载/todesk-v4.8.6.2-amd64.deb'无法被用户'_apt'访问,已脱离沙盒并提权为根用户来进行下载。 - pkgAcquire::Run (13: 权限不够)

不用管,执行 todesk 登录账号就可以使用了

0504 todesk问题

问题 2.1

执行 todesk 报错:

mkdir: 无法创建目录 "/tmp/fuse": 文件已存在
fusermount: entry for /tmp/fuse not found in /etc/mtab
[setting] functionRightToast =
[setting] functionRightToast =
解决2.1

不影响使用,一定要消除报错的话,执行 fusermount -uz /tmp/fuse 将原来的挂载点清理干净,下次启动 ToDesk 时,程序就能正常创建目录

(0505 发现并不像上面说的那样,ctrl+c终止后,再执行todesk就没有这个报错了)

问题2.2

交互双方的剪切板不共用

解决2.2

安装剪切板管理工具:sudo apt-get install xclip

切换到 X11 显示服务器:

如果执行 echo $XDG_SESSION_TYPE 输出 Wayland,需要切换为x11,原因:这是解决很多 ToDesk 相关问题(包括黑屏和剪贴板失效)最关键的一步。Ubuntu 22.04 默认使用新的 Wayland 协议,而 ToDesk 目前对 Wayland 的兼容性不佳,切换到经典的 X11 协议能解决大部分问题

1)修改配置 sudo nano /etc/gdm3/custom.conf 加入 WaylandEnable=false这一行

2)重启ubuntu

3)重启 ToDesk 服务 sudo systemctl restart todeskd.service

4)验证 执行 echo $XDG_SESSION_TYPE ,输出 x11

这时 todesk 连接win,发现剪切板共用了

问题2.3 与解决

控制方向被控方输入文字,字符重复2遍,这是连接不稳定的原因,断开重连多试几次就好了

(0505 如果重连还是不行,说明还是不稳定,可能时而不重复时而重复,解决办法:绕过在被控方输入文本的操作,先在控制方编辑好要输入的内容,直接复制到被控方)

问题2.4 与解决

控制方Ubuntu无法向被控方输入文字

解决:控制方的输入法改英语

3 ubuntu截图工具

各种ubuntu截图工具:https://blog.csdn.net/kingdom_java/article/details/148723506

截图工具Flameshot

学习参考博客:https://blog.csdn.net/qnesp/article/details/157659217?ops_request_misc=elastic_search_misc&request_id=a4c87fd50581c3fb419ba9c057b8cde2&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-157659217-null-null.142^v102^pc_search_result_base5&utm_term=Flameshot&spm=1018.2226.3001.4187

记录博客难免会需要截图,Ubuntu系统的截图还不太会,听说这个工具截图功能强大,但学习起来还是要花些时间的

3.1 目前设置了ctrl + alt + a 截图:

绑定快捷键:进入设置 > 键盘 > 快捷键,添加自定义快捷键(如 Ctrl+alt+A),关联命令 flameshot gui

此外右上角也有图标可以启动

3.2 截取式截图后进入编辑在左上角,有些标注快捷键需要记忆,双击后复制截图到剪切板

0504更新学习笔记

截图工具Flameshot 学习笔记:​​​​​​​Flameshot 学习笔记-CSDN博客

4 新建容器

sudo docker run -it   --name humble   --network=host   -v /tmp/.X11-unix:/tmp/.X11-unix   -v /tina:/workspace   -e DISPLAY=${DISPLAY}   docker.1ms.run/osrf/ros:humble-desktop-full   /bin/bash

5 挂载机械盘

后来我才知道我还没挂载机械盘:我的电脑有两个磁盘,一个系统盘(固态128GB),一个机械盘1T,安装Ubuntu选固态硬盘,之后需要挂载机械盘用于存放数据,具体操作见我跟deepseek的对话:https://chat.deepseek.com/share/elw8n9ttqfna90qbwn

挂载后我的机械盘目录/mnt/hd,因此新建容器挂载路径修改为/mnt/hd/tina,即

sudo docker run -it   --name humble   --network=host   -v /tmp/.X11-unix:/tmp/.X11-unix   -v /mnt/hd/tina:/workspace   -e DISPLAY=${DISPLAY}   docker.1ms.run/osrf/ros:humble-desktop-full   /bin/bash

6 ROS2学习之键盘控制海龟验证

记录于博客:​​​​​​​​​​​​​​ROS学习-CSDN博客

7 vscode安装与docker适配

见我的博客:​​​​​​​​​​​​​​docker学习-CSDN博客

0505 下

1 ROS创建编译与运行节点

记录于博客:​​​​​​​​​​​​​​ROS学习-CSDN博客

2 如何将容器的项目推送自己的Github仓库进行版本管理

我的容器名为humble

2.1 配置SSH密钥

2.1.1 宿主机配置 SSH 密钥

ssh-keygen -t ed25519 -C <你的邮箱>,然后一直回车

2.1.2 将公钥添加到 GitHub

1)cat ~/.ssh/id_ed25519.pub 并复制公钥

2)添加到 GitHub: 登录 GitHub → 点击右上角头像 → Settings 左侧菜单选择 SSH and GPG keys 点击绿色按钮 New SSH key Title:自定义名字,Key type:保持 "Authentication Key", Key:粘贴公钥 → 点击 Add SSH key

3)验证  ssh -T git@github.com,会输出类似

Hi 用户名! You've successfully authenticated, but GitHub does not provide shell access.

2.1.3 复制 SSH 密钥到容器
sudo docker exec humble mkdir -p /root/.ssh
sudo docker cp ~/.ssh/id_ed25519 humble:/root/.ssh/  # 复制私钥
sudo docker cp ~/.ssh/id_ed25519.pub humble:/root/.ssh/  # 复制公钥 

如果不加sudo,就统一不加sudo,否则会no such directory

2.1.4 进入容器并修复权限

进入容器  sudo docker exec -it humble /bin/bash,依次执行

# 修复权限
chmod 700 /root/.ssh
chmod 600 /root/.ssh/id_ed25519
chmod 644 /root/.ssh/id_ed25519.pub

# 添加 GitHub 到 known_hosts
ssh-keyscan github.com >> /root/.ssh/known_hosts

# 测试 SSH 连接
ssh -T git@github.com

2.2 配置Git

2.2.1 配置 Git 的用户名和邮箱

全局用global,局部用local,这里我省事直接全局

git config --global user.name <用户名>

git config --global user.email <邮箱>

查看

git config --global user.name

git config --global user.email

2.2.2 初始化本地仓库
# 如果项目还没有 .git 目录
git init
# 添加所有文件到暂存区
git add .
# 提交到本地仓库 
git commit -m "Initial commit"
2.2.3 关联远程仓库

# 添加远程仓库地址    git remote add origin git@github.com:xxx.git

# 验证远程仓库是否添加成功   git remote -v

2.2.4 创建并切换到新分支

git checkout -b your-branch-name

2.2.5 推送新分支到远程仓库

# 首次推送需要设置上游分支  git push -u origin feature/your-branch-name

后面直接push

3 学习dockerfile

裸镜像创建的容器,后面肯定会新安装不少东西,但如果这个容器因为某些原因被销毁,则之前所做的全要重安装一遍,因此写个完整的dockerfile以便后续镜像具备所需的所有包,新建容器可以开箱即用

3.1 编写Dockerfile

根据我目前的开发环境,Dockerfile如下

# 使用国内 ROS 镜像作为基础镜像
FROM docker.1ms.run/osrf/ros:humble-desktop-full

# 避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
ENV ROS_DISTRO=humble

# 使用国内 Ubuntu 镜像源,并安装常用依赖和额外 ROS 包
RUN sed -i -e 's|http://archive.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' \
           -e 's|http://security.ubuntu.com/ubuntu/|https://mirrors.tuna.tsinghua.edu.cn/ubuntu/|g' \
           /etc/apt/sources.list \
    && apt-get update \
    && apt-get install -y --no-install-recommends \
        curl \
        gnupg2 \
        lsb-release \
        software-properties-common \
        python3-pip \
        python3-dev \
        git \
        python3-colcon-common-extensions \
        python3-rosdep \
        ros-humble-turtle-tf2-py \
        ros-humble-tf2-tools \
        ros-humble-ros-gz \
    && rm -rf /var/lib/apt/lists/*

# 安装 Python 库
RUN pip3 install --no-cache-dir transforms3d || \
    pip3 install --no-cache-dir --break-system-packages transforms3d

# 初始化 rosdep
# 注意:rosdep update 依赖 GitHub 网络,国内环境可能失败。
# 如果构建时失败,建议注释掉这一段,进入容器后手动执行。
RUN if [ ! -f /etc/ros/rosdep/sources.list.d/20-default.list ]; then \
        rosdep init; \
    fi \
    && rosdep update

# 设置 ROS2 环境
RUN echo "source /opt/ros/humble/setup.bash" >> /root/.bashrc

# 默认进入 bash
CMD ["bash"]

3.2 构建镜像

运行 docker build -t docker-cfg .        # 其中 docker-cfg 是镜像名

将镜像打包 docker save -o docker-cfg.tar docker-cfg:latest && ls -lh docker-cfg.tar

执行成功:

.....
Successfully tagged dcker-cfg:latest
-rw------- 1 tina docker 1.2G  5月  5 20:12 docker-cfg.tar

查看镜像,第一行就是刚刚创建的镜像

3.3 使用示例

打包的.tar可以拿到ubuntu18.04的开发环境使用(即使镜像是22.04)

1) 拷贝镜像文件
把 docker-cfg.tar 从当前机器拷贝到 Ubuntu 18.04 机器

2)安装 Docker
若 Ubuntu 18.04 上还没安装 Docker,运行:
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable --now docker

如果用户不是root,执行
sudo usermod -aG docker $USER && newgrp docker

3)加载镜像
在 Ubuntu 18.04 机器上执行:docker load -i docker-cfg.tar

成功后会看到类似  Loaded image: docker-cfg:latest

4)运行容器
直接启动一个交互式容器:docker run -it docker-cfg bash

或 把本地代码目录挂载到容器:

docker run -it -v /path/to/your/project:/root/project docker-cfg bash

进入容器后,就能使用 ROS Humble、transforms3d、tf2 等环境

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐