ROS2学习笔记(1)ROS2+docker的配置方法

2023-05-16

ROS2学习笔记(1)ros2+docker的配置方法

  • 1. 前言
  • 2. 安装docker
    • 2.1 docker的发展史
    • 2.2 什么是docker
    • 2.3 docker的思想
      • 2.3.1 集装箱
      • 2.3.2 标准化
        • 1. 运输方式
        • 2. 存储方式
        • 3. API接口
      • 2.3.3 隔离
    • 2.4 docker要解决的问题
      • 2.4.1 系统环境不一致
      • 2.4.2 系统好卡,哪个哥们又写死循环了
      • 2.4.3 双11来了,服务器撑不住了
    • 2.5 走进docker
      • 2.5.1 镜像
      • 2.5.2 容器
      • 2.5.3 仓库
    • 2.6 docker安装
    • 2.7 docker指令
    • 2.8 利用tmux分屏
  • 3.ros2+docker配置

1. 前言

关于ROS2的介绍可移步古月居官网查看,本文仅记录自己的学习过程。

2. 安装docker

docke介绍请参考文章。

2.1 docker的发展史

2010年几个年轻人成立了一个做PAAS平台的公司dotCloud.起初公司发展的不错,不但拿到过一些融资,还获得了美国著名孵化器YCombinator的支持,后来微软谷歌亚马逊这样的大厂商也纷纷加入PAAS平台,竞争十分激烈,dotCloud举步维艰。

2013年可能是公司发展的不是很好,工程师又不想自己的努力付之东流,于是他们决定将他们的核心技术开源。这项技术就是docker。当时docker的功能就是将linux容器中的应用代码打包,可以轻松的在服务器之间进行迁移。

无心插柳柳成荫,docker技术风靡全球,于是dotCloud公司改名为docker Inc,并全面投入到docker的开发之中,并于2014.6 Docker发布了第一个版本 Docker1.0。

2.2 什么是docker

docker是一个用来装应用的容器,就像杯子可以装水,笔筒可以放笔,书包可以放书,可以把hello word放在docker中,可以把网站放入docker中,可以把任何想得到的程序放在docker中。

2.3 docker的思想

2.3.1 集装箱

没有集装箱之前运输货物,东西零散容易丢失,有了集装箱之后货物不容易丢失,我们可以把货物想象成程序,目前我们要把程序部署到一台新的机器上,可能会启动不起来,比如少一些配置文件什么的或者少了什么数据,有了docker的集装箱可以保证我们的程序不管运行在哪不会缺东西。

2.3.2 标准化

1. 运输方式

docker运输东西有一个超级码头,任何地方需要货物都由鲸鱼先送到超级码头,然后再由鲸鱼从超级码头把货物送到目的地去。对应的技术来说,比如我们要把台式机的应用部署到笔记本上,我们可能选择用QQ发过去或者用U盘拷过去,docker就标准化了这个过程,我们只需在台式机上执行一个docker命令,把鲸鱼派过来,把程序送到超级码头去,再在笔记本上执行一个docker命令,然后由鲸鱼把程序从超级码头送到笔记本上去。

2. 存储方式

当我们把程序存储到笔记本上时,我们需要一个目录,且我们要记住这个目录,因为下次我们可能还要修改,有了docker之后我们就不用记住了程序在哪里了,我们使用的时候只需要一条命令就行了。

3. API接口

docker提供了一系列rest api的接口,包含了对docker也就是对我们的应用的一个启动停止查看删除等等,如当我们要启动tomcat时我们要执行startup命令,当我们要停止时要执行shutdown命令,如果不是tomcat,我们可能还需要一些别的命令。有了docker我们记docker的命令就可以对其进行操作。

2.3.3 隔离

我们在使用虚拟机时有自己的cpu、硬盘、内存,完全感觉不到外面主机的存在,docker也差不多,不过它更轻量,我们创建虚拟机可能要几分钟,但是docker只需要一秒。最底层的技术时linux一种内核的限制机制,叫做LXC,LXC是一种轻量级的容器虚拟化技术。最大效率的隔离了进程和资源。通过cgroup、namespace等限制,隔离进程组所使用的物理资源,比如CPU、MEMORY等等,这个机制在7、8年前已经加入到linux内核了,直到2013年docker出世的时候才火起来,大家可能奇怪为什么这么好的技术埋没这么多年都没人发现呢?英雄造时势,如果没有云计算、敏捷开发、高频度的弹性伸缩需求,没有IT行业这么多年长足的发展,也就没有docker。

2.4 docker要解决的问题

2.4.1 系统环境不一致

开发:我本地没问题。运维:服务器没问题.。这个问题就变成了皮球。

如果一个应用要正常的启动起来需要什么?比如java web应用。需要一个操作系统,操作系统之上要jdk、tomcat、我们的代码、配置文件。

操作系统的改变可能会导致我们的应用开不起来,比如我们调用了某些系统命令。jdk版本也可能导致程序的运行失败。比如class文件需要1.7编译,我们装了个1.6的jdk。tomcat版本也能导致失败,比如旧的版本一些配置在新版本中不再支持。代码的话就比如应用了C盘、D盘的一个文件,或者是用了系统的一些环境编码。配置的话我们可能少了某个配置文件等等。

下面docker来了,它把操作系统、jdk、tomcat、代码、配置全部放到集装箱里。再打包放到鲸鱼上,由鲸鱼给我们送到服务器上,在我的机器上怎么运行,在别的机器上也怎么运行。不会有任何的问题。一句话就是docker解决了运行环境不一致所带来的问题。

2.4.2 系统好卡,哪个哥们又写死循环了

如果有根别人共用服务器的同学可能有这样的体会,莫名其妙发现自己的程序挂了,一查原因要不是内存不够了,要不是硬盘满了,还有就是发现某个服务变慢了,甚至敲终端都比较卡,但是linux本身就是一个多用户的操作系统本身就可以供多个用户使用,docker的隔离性可以解决这个问题,就算别人的程序还是死循环疯狂吃CPU,还是封装疯狂打日志把硬盘占满,还是内存泄漏,把内存占满,都不会导致我们的程序运行错误。因为docker在启动的时候就限定好了,它最大使用的CPU硬盘,如果超过了,就会杀掉对应进程。

2.4.3 双11来了,服务器撑不住了

大部分系统业务量并不是每天都比较平均的,特别是一些电商系统,每天总有那么几天业务量是平时的几倍甚至几十倍,如果按双11的规模去准备服务器那么对于平时的规模来说又是极大的浪费,所以就在节日前临时扩展机器,过完节再把多余的节点下线,这就给运维带来了非常大的工作量,一到过节就在各个机器上部署各种各样的服务,我们启动程序需要java、tocmat等等,并且还可能起不来还要调试,这是非常恶心的工作,有了docker一切都变得美好了,只要点一下服务器就可以从10台变成100台甚至1000、1W台,都是分分钟的事情。

为什么会这么快呢?都是用标准的方式把我们的程序运过来,下载过来,再用标准的方式把它运行起来,就可以做到只要在每台机器上都执行一两条命令,就可以让程序正常跑起来,并且不用担心有问题。

2.5 走进docker

镜像就是上面说的集装箱,仓库就是超级码头,容器就是我们运行程序的地方。docker运行程序的过程就是去仓库把镜像拉到本地,然后用一条命令把镜像运行起来变成容器。

build:构建,就是构建镜像。

ship:运输,运输镜像,从仓库和主机运输。

run:运行的镜像就是一个容器。

buildshiprun镜像仓库容器是一一对应的。

2.5.1 镜像

镜像的英文名交image。前面我们讲到了集装箱,鲸鱼拖着的所有集装箱就是一个镜像。

从本质上来说镜像就是一系列文件,可以包括我们应用程序的文件,也可以包括我们应用的运行环境的文件,既然是文件,那么是以什么样的格式在本地保存的呢?

说到存储格式,就要提到linux的一个存储技术,叫做联合文件系统,是一种分层的文件系统,可以将不同的目录挂到同一个虚拟文件系统下。

比如test1下有三个文件夹,test2下有两个文件夹,还有一个readme文件。联合文件系统就是可以在一个文件夹(test)中看到多个文件夹(test1, test2)中的内容。

通过这种方式可以实现文件的分层,test1可以把它看作第一层,test2可以把它看作第二层,每一层有每一层自己的文件,docker就是利用了这种分层的概念实现了镜像存储。

下图就是镜像的存储格式,这张图是分层的,最下面一层,上面也是一层层的好像集装箱罗列在一起。这就是镜像最直观的存储方式。下面是操作系统的引导,上面是linux操作系统,再上面是一些相关的软件,如果是我们自己的程序,就可以是tomcat、jdk,再往上是应用代码,每一层是我们自己都可以控制得,最上面一层先忽略不看,因为这是和容器有关的。注意一点,docker镜像系统的每一层都是只读的,然后把每一层加载完成之后这些文件都会被看成是同一个目录,相当于只有一个文件系统。docker的这种文件系统被称之为镜像。
docker镜像存储格式示意图

2.5.2 容器

为了便于理解,大家可以把容器想象成虚拟机,每个虚拟机都有自己的文件系统,可以把图1整个一部分看成是文件系统,与虚拟机系统的区别是这里面的文件系统是一层一层的,并且最下面的n层都是只读的,只有上面一层是可写的。为什么要有可写的这层呢?大家的程序运行起来,势必会要写一些日志,写一些文件,或者对系统的某一些文件做一些修改,所以容器在最上面一层创建了可读可写的文件系统。

在程序的运行过程中,如果要写镜像文件时,因为镜像的每一层都是只读的,它会把文件的每一层拷到文件的最上层,然后再对它进行修改,修改之后,当我们的应用读一个文件时会从顶层进行查找,如果没有才会找下一层。

由于容器的最上一层是可以修改的,镜像是不能修改的,这样就能保证镜像可以生成多个容器独立运行,没有任何干扰。

2.5.3 仓库

我们的镜像是要在其它机器上运行,如何进行传输呢?

这就用到了docker仓库,我们要先把我们的镜像传到docker仓库中,再由目的地把docker仓库拉过去,这就完成了这样的一次传输过程。

谁提供了这样的仓库呢?docker自己提供了hub.docker.com,但是非常慢,为了解决这个问题,国内很多公司也在做自己的仓库。

2.6 docker安装

1 .卸载旧版本docker

sudo apt-get remove docker docker-engine docker.io containerd runc

2.更新及安装工具软件

更新系统里的所有的能更新的软件

sudo apt-get update

安装几个工具软件

\ 续行符号: 继续到下一行
curl:是字符界面的浏览器

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg \
    lsb-release

增加一个docker的官方GPG key:
gpgkey:是用来验证软件的真伪 ——防伪的

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

下载仓库文件

echo \
  "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

3.安装docker
再次进入系统

sudo apt-get update

安装docker-ce软件

sudo apt-get install docker-ce docker-ce-cli containerd.io -y

4.查看是否启动docker

ps aux|grep docker

5.测试运行一个docker容器

sudo docker run hello-world

下图为安装成功界面

在这里插入图片描述
5.docker去掉sudo权限
查看用户组及成员

sudo cat /etc/group | grep docker

在这里插入图片描述
可以添加docker组

sudo groupadd docker 

在这里插入图片描述
添加用户到docker组

sudo gpasswd -a ${USER} docker 

在这里插入图片描述
增加读写权限

sudo chmod a+rw /var/run/docker.sock

在这里插入图片描述
重启docker

sudo systemctl restart docker

在这里插入图片描述

2.7 docker指令

docker服务启动,若没有配置开机自启动,需要在每次使用docker时启动服务

sudo service docker start

docker镜像下载

docker pull [container-name]

测试安装是否成功

docker run -it [container-name]

出现以下界面表示安装完成

root@<container-id>:/#

查看镜像

sudo docker images

查看docker版本

sudo docker --version

查看本地存在的容器:

sudo docker ps -a

查看正在运行的容器

sudo docker ps

进入刚刚生成的容器

sudo docker exec -it [container-id] /bin/bash

停止容器

sudo docker stop [container-name]

启动容器

sudo docker start [container-name]

删除容器

sudo docker rm [container-name]

配置开机启动docker

systemctl start docker
systemctl enable docker

在容器中离开docker

exit

2.8 利用tmux分屏

安装tmux

sudo apt-get update
sudo apt install tmux

开启tmux

tmux

先按ctrl+b,紧接着按*%(Shift+5)。就可此分屏。
切换分屏需要先按
ctrl+b*,接着按o,就可以了。

tmux使用方法如下:
1,输入命令tmux使用工具
2,上下分屏:ctrl + b 再按 "
3,左右分屏:ctrl + b 再按 %
4,切换屏幕:ctrl + b 再按o
5,关闭一个终端:ctrl + b 再按x
6,上下分屏与左右分屏切换: ctrl + b 再按空格键

3.ros2+docker配置

ros2 docker镜像下载

docker pull osrf/ros:humble-desktop

宿主机开启xhost,使得docker里面可视化界面(vscode rviz)

xhost(参数)
//+:关闭访问控制,允许任何主机访问本地的X服务器;
//-:打开访问控制,仅允许授权清单中的主机访问本地的X服务器。

注意:每次重启容器,主机都得执行一遍,否则容器内可视化报错。

启动镜像

sudo docker run -it -v /mnt/d/docker/humble_container_data_1:/data --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix  --env="DISPLAY=$DISPLAY" --env="QT_X11_NO_MITSHM=1" --name=humble_ros_2 osrf/ros:humble-desktop  /bin/bash

其中,/mnt/d/docker/humble_container_data_1为自己本地创建的地址,:/data为同步到docker的/data文件目录下,用以存放ros2项目,这样的好处是本地与docker可数据同步,可根据实际情况自行设置。

必须加上:

--env="QT_X11_NO_MITSHM=1"

否则docker内部无法可视化(主机必须先执行 xhost + 命令)

此时你会发现ros2并不能运行,出现command not found ,不要着急,这是因为新终端没有自动添加环境变量,解决办法:
直接输入下面的命令追加bashrc即可

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

追加完成后source即可:

source ~/.bashrc

至此,ROS2+docker的配置完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS2学习笔记(1)ROS2+docker的配置方法 的相关文章

随机推荐

  • ROS: Publisher and Subscriber

    通过上一节编写ROS的第一个程序hello world xff0c 我们对ROS的整个编程开发过程有了基本的了解 xff0c 现在我们就来编写真正意义上的使用ROS进行节点间通信的程序 由于之前已经建好了catkin ws这样一个工作空间
  • phpStorm2018安装教程

    1 鼠标右击 PhpStorm 2018 2 3 压缩包选择 解压到PhpStorm 2018 2 3 2 双击打开解压后的 PhpStorm 2018 2 3 文件夹 3 鼠标右击 PhpStorm 2018 2 3 exe 选择 以管理
  • 学习Java第一个星期感受和收获

    最近在学习java xff0c 学了有一个星期 xff0c 说一说这个星期的收获和总结吧 xff01 首先我也是从一个小白做起 xff0c 这个星期学习了很多 xff0c 很多java基础知识 xff0c 我印象比较深刻的是基本数据类型和引
  • MySql知识体系总结(2021版)

    一 MySQL三层逻辑架构 MySQL的存储引擎架构将查询处理与数据的存储 提取相分离 下面是MySQL的逻辑架构图 xff1a 1 第一层负责连接管理 授权认证 安全等等 每个客户端的连接都对应着服务器上的一个线程 服务器上维护了一个线程
  • freertos与linux区别,μClinux、μC/OS-II、eCos、FreeRTOS和djyos操作系统的特点及不足-嵌入式系统-与非网...

    基于 STM 平台且满足实时控制要求操作系统 xff0c 有以下 5 种可供移植选择 分别为 Clinux C xff0f OS II eCos FreeRTOS 和都江堰操作系统 djyos 下面分别介绍这五种嵌入式操作系统的特点及不足
  • SM4加密算法原理以及C语言实现

    文章目录 一 算法原理描述1 密钥及密钥参量 xff1a 2 加密算法 3 解密算法 xff1a 4 密钥扩展算法 xff1a 二 C语言算法实现 h部分代码 xff1a c部分代码 xff1a 一 算法原理描述 SM4分组密码算法是一个迭
  • SIM900A GPRS无线通信

    文章目录 一 模块介绍1 基本概况2 GPRS通信开发说明 二 TCP连接实现及其源码1 TCP连接实现方法2 程序源码 xff08 基于MSP430F149单片机 xff09 1 main c2 Config h及Config c3 SI
  • UCOSII-信号量与信号量集

    文章目录 一 前言1 任务间的同步2 事件 二 信号量1 信号与信号量介绍2 信号量常用函数3 信号量使用流程 xff08 互斥信号量和信号量两种 xff09 4 互斥型信号量使用5 使用一般信号量做任务同步 三 信号量集 事件标志组 1
  • UCOSII-消息邮箱与消息队列

    文章目录 一 事件控制块及事件处理函数1 等待任务列表2 事件控制块的结构3 操作事件控制块的函数4 空事件控制块列表 二 消息邮箱1 消息邮箱介绍2 消息邮箱操作步骤 三 消息队列1 消息指针数组2 队列控制块3 消息队列的操作流程 四
  • float型数据与4字节之间的转换

    文章目录 一 前言二 地址指针转换的方法三 共用体的方法 xff08 注意要定义全局变量数组s xff0c 即地址要分配为固定地址 xff09 一 前言 在与上位机之间进行数据收发 xff0c 要将float型数据转换成字节进行传输 xff
  • USB虚拟串口实现多字节数据接收,基于stm32h743

    文章目录 一 USB虚拟串口原理简介二 接收函数实现源码三 小结 一 USB虚拟串口原理简介 USB 虚拟串口 xff0c 简称 VCP xff0c 是 Virtual COM Port 的简写 xff0c 它是利用 USB 的 CDC 类
  • EC20/EC25 4G模块AT指令开发总结

    文章目录 一 EC25 20 4G模块简介二 AT指令总结1 通用AT指令2 建立TCP UDP连接相关AT指令 三 TCP传输数据流程四 UDP传输数据流程五 总结 一 EC25 20 4G模块简介 EC25 是一系列带分集接收功能的 L
  • C语言实现socket网络编程及多线程编程

    文章目录 一 概述二 TCP socket网络编程1 server端程序实现 xff08 tcp server cpp xff09 2 client端程序实现 xff08 tcp client cpp xff09 3 编译与执行 三 UDP
  • 基于openssl实现https双向身份认证及安全通信

    文章目录 一 概述二 代码设计2 1 ssl server c程序设计2 2 ssl client c程序设计 三 测试 一 概述 https基于SSL TLS提供安全的通信信道 xff0c 基于证书认证技术实现服务器和客户端之间的身份认证
  • ubuntu的不同版本

    ubuntu是现在最流行的Linux安装包 xff0c 本文介绍了ubuntu的各种版本 一 Ubuntu 每个ubuntu的版本都包含一个版本号 xff08 version number xff09 和一个代码名 xff08 code n
  • Linux下通过service服务管理用户进程

    文章目录 一 service配置介绍1 1 service配置文件1 2 配置文件的区块1 3 修改配置文件后重启1 4 服务管理 二 设计一个可执行程序三 设计一个service管理 home ubuntu test servicetes
  • c++中多态调用场景下基类析构函数的virtual声明

    文章目录 一 基类析构函数未加virtual声明的情况1 1 基础示例演示1 2 进阶示例演示 二 基类析构函数添加virtual声明的情况三 总结 一 基类析构函数未加virtual声明的情况 在多态场景中 xff0c 可通过基类的指针指
  • protobuf协议原理及实现,基于c++

    文章目录 一 protobuf协议简介1 1 protobuf协议简介1 2 数据交互xml json protobuf格式比较1 3 关于 ProtoBuf 的一些思考 二 protobuf库安装三 protobuf库使用第一步 xff0
  • OLED显示屏驱动:8080并口,IIC,SPI三种驱动方式

    本文介绍了对OLED的几种驱动方式 xff0c 8080并口 xff0c IIC xff0c SPI三种驱动方式 xff0c 采用的单片机是STM32F407 文章目录 一 OLED驱动原理介绍二 8080并口驱动方式三 IIC驱动方式四
  • ROS2学习笔记(1)ROS2+docker的配置方法

    ROS2学习笔记 xff08 1 xff09 ros2 43 docker的配置方法 1 前言2 安装docker2 1 docker的发展史2 2 什么是docker2 3 docker的思想2 3 1 集装箱2 3 2 标准化1 运输方