ubuntu20.04在docker下运行ros-noetic进行开发

经常折腾虚拟机各双系统 , 想着不如把docker利用起来,下面算是一个初学者使用docker运行ros的记录:

1. 安装

使用官方安装脚本自动安装

 curl -fsSL https://test.docker.com -o test-docker.sh
 sudo sh test-docker.sh

验证是否安装成功

docker version

Docker 需要用户具有 sudo 权限,为了避免每次命令都输入sudo,可以把用户加入 Docker 用户组

sudo usermod -aG docker $USER

Docker 是服务器----客户端架构。命令行运行docker命令的时候,需要本机有 Docker 服务。如果这项服务没有启动,可以用下面的命令启动

# service 命令的用法
sudo service docker start
# systemctl 命令的用法
sudo systemctl start docker

2. 在docker中运行ros-noetic

[参考] (https://blog.csdn.net/qq_40695642/article/details/117607446)

2.1 安装Portainer(选择安装)

Portainer 个可视化的界面其实和ROS关系并不大,但是使用起来非常的方便,可以让我们更快速的利用Docker学习ROS,而不是要完整的学习完Docker的繁杂的命令再学习ROS。

sudo systemctl restart docker

#下载Portainer的Docker镜像
sudo docker pull portainer/portainer
#运行Portainer容器;
sudo docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock --restart=always --name prtainer portainer/portainer

(执行上面的命令如果有报错的话 , 建议 魔法先关闭 )

2.2 如果出现超时什么的 重启容器

使用sudo docker ps来查看正在运行的容器

sudo docker ps

该命令将列出所有正在运行的容器。
运行以下命令停止 Portainer 容器:

sudo docker stop <container_id>

将 <container_id> 替换为实际的 Portainer 容器的 ID 或名称
使用以下命令再次启动 Portainer 容器:

sudo docker start <container_id>

同样,将 <container_id> 替换为 Portainer 容器的 ID 或名称。
等待一段时间,让容器重新启动

2.3 访问本机9000端口

运行上述命令等待执行成功后,放行防火墙,访问本机的9000端口进入Portainer,创建账号密码之后即可登录到控制台。
本机的9000端口: http://localhost:9000
在这里我们可以查看到运行容器内部的信息,也可以快速的删除废弃的容器及镜像。也可以构建虚拟网络实现容器间隔离
Portainer 学习参考: https://www.hangge.com/blog/cache/detail_2597.html

2.2 在docker中运行ros-noetic

首先我们可以使用

sudo docker search ros

来查看目前docker hub上有哪些大神上传的公共镜像

选择pull ros-neotic的 docker 镜像

sudo docker pull osrf/ros:noetic-desktop-full

在这里插入图片描述
接下来我们需要写一个Dockerfile,来帮我们完成一些简单的环境依赖安装工作:

mkdir cwc_docker
cd cwc_docker
gedit Dockerfile

下面是Dockerfile 文件内容:

FROM osrf/ros:melodic-desktop-full

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

RUN apt-get update && \
    apt-get install -y \
    build-essential \
    libgl1-mesa-dev \
    libglew-dev \
    libsdl2-dev \
    libsdl2-image-dev \
    libglm-dev \
    libfreetype6-dev \
    libglfw3-dev \
    libglfw3 \
    libglu1-mesa-dev \
    freeglut3-dev \
    gedit

接下来使用下面的命令来构建容器:(同样 我关闭了我的魔法)

sudo docker build -t cwc_docker . 

在这里插入图片描述以下是 Dockerfile 的具体功能说明:

设置环境变量 NVIDIA_VISIBLE_DEVICES 和 NVIDIA_DRIVER_CAPABILITIES,用于配置 NVIDIA 设备的可见性和驱动程序的能力。
使用 apt-get 更新软件包列表,并安装以下软件包:
    build-essential:包含了 gcc 和 make 等基本的构建工具。
    libgl1-mesa-dev:Mesa OpenGL 库的开发文件。
    libglew-dev:GLEW 库的开发文件。
    libsdl2-dev:SDL2 库的开发文件。
    libsdl2-image-dev:SDL2_image 库的开发文件。
    libglm-dev:GLM 库的开发文件。
    libfreetype6-dev:FreeType 库的开发文件。
    libglfw3-dev 和 libglfw3:GLFW 库的开发文件和运行时库。
    libglu1-mesa-dev:Mesa GLU 库的开发文件。
    freeglut3-dev:FreeGLUT 库的开发文件。
    gedit:用于在容器内编辑文件的文本编辑器。

这些软件包通常用于图形编程和开发。使用该 Dockerfile 构建镜像后,可以将其作为基础镜像来运行具备图形能力的 ROS 应用程序。
如果上面Dockerfile的下面安装部分安装不成功的话也没有关系,删除RUN节,只剩下:

FROM osrf/ros:melodic-desktop-full

# nvidia-container-runtime
ENV NVIDIA_VISIBLE_DEVICES ${NVIDIA_VISIBLE_DEVICES:-all}
ENV NVIDIA_DRIVER_CAPABILITIES ${NVIDIA_DRIVER_CAPABILITIES:+$NVIDIA_DRIVER_CAPABILITIES,}graphics

在这里插入图片描述

然后继续进入容器再安装:

###在运行容器后输入下面的命令,然后任意安装
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys F42ED6FBAB17C654
sudo apt update
sudo apt install gedit

在这里插入图片描述

经过漫长的等待 ,容器构建成功, 下面启动容器

sudo xhost +local:
sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix  --env="DISPLAY=$DISPLAY"  --name=cwc_docker  osrf/ros:noetic-desktop-full  /bin/bash

运行上述命令即可进入容器的内部:
在这里插入图片描述

在容器内部有一个ros_entrypoint.sh的文件,./ros_entrypoint.sh执行这个脚本

然后就可以正常使用roscore和rviz了
在这里插入图片描述

在使用rviz的时候我们当然需要再开启一个终端,那么对应的我们要进入启动roscore的这个容器

sudo docker ps
###找到运行的rocker容器的id

####进入容器
sudo docker exec -it dc3224c8d60e /bin/bash

source /opt/ros/noetic/setup.bash

rviz

即打开了rviz
在这里插入图片描述启动小乌龟
每次开启终端不知道为什么 都要

source  /opt/ros/noetic/setup.bash

在这里插入图片描述

3.导出容器

如果我要导出名为cwc_docker的容器的当前状态(包括文件系统中的更改,但不包括已挂载卷的内容),可以使用docker export命令。这将创建一个包含容器文件系统的快照的tar文件:


sudo docker export cwc_docker > cwc_docker.tar

这条命令会将cwc_docker容器的文件系统导出到一个名为cwc_docker.tar的tar归档文件中。

但是呢 这个操作并不会导出以下内容:

  • 容器的元数据,如环境变量、默认命令、端口配置等。
  • 容器的运行状态。
  • 容器使用的卷中的数据。

如果我们需要重新创建具有相同配置的容器,包括环境变量、命令和卷等,可能需要使用docker commit来创建一个新的镜像,然后使用docker save来导出这个新的镜像。这样,我们就可以在另一台机器上使用docker load来加载这个镜像,并通过它来启动一个新的容器,该容器会反映cwc_docker当时的状态。以下是相关命令:

# 将容器提交为新的镜像
sudo docker commit cwc_docker my_cwc_docker_image

# 将镜像保存为tar文件
sudo docker save my_cwc_docker_image > my_cwc_docker_image.tar

之后,我们就可以将my_cwc_docker_image.tar文件复制到其他计算机,并使用docker load导入它,然后使用docker run根据这个镜像启动一个新的容器。

4. 加载镜像

我这里导出了一个名为:fastplanner_250_image.tar 的镜像文件
在这里插入图片描述

#在相应的目录下加载镜像 
sudo docker load -i fastplanner_250_image.tar 

在这里插入图片描述
接下来就是容器:

sudo xhost +local:
#相应修改你自己的镜像名称
sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix --env="DISPLAY=$DISPLAY" --name=my_fastplanner_container fastplanner_250_image:latest /bin/bash

4.1 退出容器:

如果在容器内部,可以通过输入exit或按Ctrl+D来退出并停止容器。
重新进入

sudo docker start -ai <你的容器名称>

5. 使用vscode 插件 Dev Container 对容器进行开发

1.在vscode 进行安装
在这里插入图片描述
2. 选择附加到正在运行的容器 (所以你要提前运行你的容器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述这样就可以很方便实现在容器里面进行代码开发了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/164586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣 hot100 最长连续序列 哈希去重 双指针

128. 最长连续序列 ⭐ AC code class Solution {public int longestConsecutive(int[] nums) {if (nums.length 0)// 特判为空的数组&#xff0c;返回0return 0; // set实现去重HashSet<Integer> set new HashSet<>();for (int x : nums)set.add(x);Object[] a…

时间序列与 statsmodels:预测所需的基本概念(2)

时间序列与 statsmodels&#xff1a;预测所需的基本概念&#xff08;2&#xff09; 维托米尔约万诺维奇 跟随 出版于 走向发展 4 分钟阅读 2022 年 1 月 31 日 8 一、说明 在使时间序列平稳后&#xff0c;在本博客中我们应用 SARIMAX 预测并进行深入解释。 二、关于平稳性 …

算法设计与分析复习--求解最大子段和问题(分支法、动态规划)

文章目录 问题描述分治法动态规划法 问题描述 最大子段和问题&#xff1b; 洛谷P1115.最大子段和 分治法 利用归并排序的方法&#xff0c;但是由于是算最大子段和所以&#xff0c;并不能将它变成有序的&#xff0c;左边和右边的最大子段和通过调用函数&#xff0c;而中间的要…

SpringCloudAlibaba系列之Nacos服务注册与发现

目录 说明 认识注册中心 Nacos架构图 Nacos服务注册与发现实现原理总览 SpringCloud服务注册规范 服务注册 心跳机制与健康检查 服务发现 主流服务注册中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos作为注册中心的一些实现&#xff0c;很…

「Tech初见」对epoll的理解

一、Motivation 通常&#xff0c;操作系统会为每个进程划分一个时间片的&#xff0c;在这个时间片内进程可以合法占有 cpu 进行一些计算任务。并当时间片结束后自动退回至就绪状态待命&#xff0c;等待下一次的调度 但是&#xff0c;有一种情况会使进程提前&#xff08;时间片…

Web实战:基于Django与Bootstrap的在线计算器

文章目录 写在前面实验目标实验内容1. 创建项目2. 导入框架3. 配置项目前端代码后端代码 4. 运行项目 注意事项写在后面 写在前面 本期内容&#xff1a;基于Django与Bootstrap的在线计算器 实验环境&#xff1a; vscodepython(3.11.4)django(4.2.7)bootstrap(3.4.1)jquery(3…

1、cvpr2024

CVPR2024官网&#xff1a; Overleaf模板&#xff1a; 更改作者&#xff08;去掉CVPR标识&#xff09; % \usepackage{cvpr} % To produce the CAMERA-READY version \usepackage[review]{cvpr} % To produce the REVIEW version改成 \usepackage{cvpr} …

性格懦弱怎么办?如何改变懦弱的性格?

性格懦弱是一个比较常见的话题了&#xff0c;懦弱带来的苦恼和困扰&#xff0c;深深影响着我们的生活&#xff0c;人际关系&#xff0c;以及事业的发展。然后如何摆脱懦弱&#xff0c;却并非易事&#xff0c;尤其是对于成年人来说&#xff0c;这种懦弱的性格特征&#xff0c;已…

Prometheus+Grafana监控

Prometheus是一种开源监控系统&#xff0c;可用于收集指标和统计数据&#xff0c;并提供强大的查询语言&#xff0c;以便分析和可视化这些数据。它被广泛用于云原生和容器化环境中&#xff0c;可以嵌入到Kubernetes集群中&#xff0c;并与其他Kubernetes工具进行集成。 Grafan…

大模型的交互能力

摘要&#xff1a; 基础大模型显示出明显的潜力&#xff0c;可以改变AI系统的开发人员和用户体验&#xff1a;基础模型降低了原型设计和构建AI应用程序的难度阈值&#xff0c;因为它们在适应方面的样本效率&#xff0c;并提高了新用户交互的上限&#xff0c;因为它们的多模式和生…

代码随想录算法训练营|五十六天

回文子串 647. 回文子串 - 力扣&#xff08;LeetCode&#xff09; dp含义&#xff1a;表示区间内[i,j]是否有回文子串&#xff0c;有true&#xff0c;没有false。 递推公式&#xff1a;当s[i]和s[j]不相等&#xff0c;false&#xff1b;相等时&#xff0c;情况一&#xff0c;…

图书管理系统 保姆级教学 手把手教你图书管理系统设计!

天梯无捷径&#xff0c;唯有苦攀登。 一起加油&#xff0c;小伙伴们&#xff01;&#xff01; 目录 1. 实现思路: 2. 那么如何找对象呢? 3. Book类的实现 Book类总代码&#xff1a; 4. BookList类的实现 BookList类总代码&#xff1a; 5. 用户的操作 5.1 AddOperation类…

在线识别二维码工具

具体请前往&#xff1a;在线二维码识别解码工具--在线识别并解码二维码网址等内容

10、背景分离 —— 大津算法

上一节学习了通过一些传统计算机视觉算法,比如Canny算法来完成一个图片的边缘检测,从而可以区分出图像的边缘。 今天再看一个视觉中更常见的应用,那就是把图片的前景和背景的分离。 前景和背景 先看看什么是前景什么是背景。 在图像处理和计算机视觉中,"前景"…

Go——一、Go语言安装及介绍

Go 一、Windows下安装Go1、下载Go2、配置环境变量3、下载Jetbrain下的GoLang4、编写hello world5、编译和执行 二、Go语言介绍1、开发文档2、Go语言核心开发团队3、为什么要创建Go4、Go语言发展史5、Go语言特点6、Golang执行过程6.1 执行过程分析6.2 编译是什么 7、开发注意事项…

线性变换概论

线性变换 定义 设 V V V 和 W W W 都是在域 K K K上定义的向量空间&#xff0c; T : V → W T :V \rightarrow W T:V→W 对任二向量 x , y ∈ V x,y \in V x,y∈V,与任何标量 a ∈ K a \in K a∈K&#xff0c;满足&#xff1a; T ( x y ) T ( x ) T ( y ) T(xy)T(x)T(…

c语言:解决数组有关的删除,排序,合并等问题。

题目1&#xff1a;判断数组是否有序&#xff08;升序或者降序&#xff09; 思路和代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int main() {int a 0;scanf("%d", &a);int arr[50];int flag1 0;//是降序int flag2 0;//是升序…

系列十一、你平时工作用过的JVM常用基本配置参数有哪些?

一、常用参数 1.1、-Xms 功能&#xff1a;初始内存大小&#xff0c;默认为物理内存的1/64&#xff0c;等价于 -XX:InitialHeapSize 1.2、-Xmx 功能&#xff1a;最大分配内存&#xff0c;默认为物理内存的1/4&#xff0c;等价于 -XX:MaxHeapSize 1.3、-Xss 功能&#xff1a;设置…

解决在pycharm中使用matplotlib画图问题

第一&#xff0c;再导入包后直接绘图出现&#xff1a; AttributeError: module backend_interagg has no attribute FigureCanvas表明版本不兼容&#xff0c;我们需要加入&#xff1a;matplotlib.use(‘TkAgg’) 导入函数就变成了&#xff1a; import matplotlib matplotlib.…

项目点使用Redis作为缓存技术-自用

在spring boot项目中&#xff0c;使用缓存技术只需在项目中导入相关缓存技术的依赖包&#xff0c;并在启动类上使用EnableCaching开启缓存支持即可。 例如&#xff0c;使用Redis作为缓存技术&#xff0c;只需要导入Spring data Redis的maven坐标即可。 描述 使用Redis缓存高频数…