学习journal(一)0505更新
0502-0503上
1 拉取ros humble镜像
在虚拟机安装Ubuntu22.04,在Ubuntu22.04通过docker拉取ros humble完整镜像(desktop-full)
由于国内网络访问官方镜像源不稳定,指定国内镜像源下载
sudo docker pull osrf/ros:humble-desktop-full (官方地址)
替换为
sudo docker pulldocker.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 tagdocker.1ms.run/osrf/ros:humble-desktop-fullros:humble-full
# 以后就可以直接用短标签了
sudo docker run -it --rmros: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:root0503下-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.com2.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 等环境
