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

2023-11-20 15:15

本文主要是介绍ubuntu20.04在docker下运行ros-noetic进行开发,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

1. 安装

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

 curl -fsSL https://test.docker.com -o test-docker.shsudo 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,}graphicsRUN 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/bashsource /opt/ros/noetic/setup.bashrviz

即打开了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. 选择附加到正在运行的容器 (所以你要提前运行你的容器

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

这篇关于ubuntu20.04在docker下运行ros-noetic进行开发的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/395532

相关文章

mysqld_multi在Linux服务器上运行多个MySQL实例

《mysqld_multi在Linux服务器上运行多个MySQL实例》在Linux系统上使用mysqld_multi来启动和管理多个MySQL实例是一种常见的做法,这种方式允许你在同一台机器上运行多个... 目录1. 安装mysql2. 配置文件示例配置文件3. 创建数据目录4. 启动和管理实例启动所有实例

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

IDEA运行spring项目时,控制台未出现的解决方案

《IDEA运行spring项目时,控制台未出现的解决方案》文章总结了在使用IDEA运行代码时,控制台未出现的问题和解决方案,问题可能是由于点击图标或重启IDEA后控制台仍未显示,解决方案提供了解决方法... 目录问题分析解决方案总结问题js使用IDEA,点击运行按钮,运行结束,但控制台未出现http://

解决Spring运行时报错:Consider defining a bean of type ‘xxx.xxx.xxx.Xxx‘ in your configuration

《解决Spring运行时报错:Considerdefiningabeanoftype‘xxx.xxx.xxx.Xxx‘inyourconfiguration》该文章主要讲述了在使用S... 目录问题分析解决方案总结问题Description:Parameter 0 of constructor in x

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

使用MongoDB进行数据存储的操作流程

《使用MongoDB进行数据存储的操作流程》在现代应用开发中,数据存储是一个至关重要的部分,随着数据量的增大和复杂性的增加,传统的关系型数据库有时难以应对高并发和大数据量的处理需求,MongoDB作为... 目录什么是MongoDB?MongoDB的优势使用MongoDB进行数据存储1. 安装MongoDB

Linux使用fdisk进行磁盘的相关操作

《Linux使用fdisk进行磁盘的相关操作》fdisk命令是Linux中用于管理磁盘分区的强大文本实用程序,这篇文章主要为大家详细介绍了如何使用fdisk进行磁盘的相关操作,需要的可以了解下... 目录简介基本语法示例用法列出所有分区查看指定磁盘的区分管理指定的磁盘进入交互式模式创建一个新的分区删除一个存

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

使用Python进行文件读写操作的基本方法

《使用Python进行文件读写操作的基本方法》今天的内容来介绍Python中进行文件读写操作的方法,这在学习Python时是必不可少的技术点,希望可以帮助到正在学习python的小伙伴,以下是Pyth... 目录一、文件读取:二、文件写入:三、文件追加:四、文件读写的二进制模式:五、使用 json 模块读写