当前位置: 首页 > news >正文

docker使用与服务器上的可视化(ROS rviz等)

1.安装docker

  • 安装docker:官网教程,按照官网命令一步步来即可。

  • 添加当前用户到docker用户组: 【docker】添加用户到docker组,这样后面运行docker的时候前面不需要加sudo命令,否则运行docker的时候一直需要在前面加sudo,即sudo docker xxx

2.docker基础命令

  • 首先区分镜像(images)和容器(containers):他们的关系与类和对象的关系比较相似——镜像就是类,容器就是类生成的对象。最终我们都是在容器中进行操作,所以首先要使用镜像生成容器,然后容器就相当于一个新的环境, 可以在里面进行一系列操作。而镜像则一般都需要自己制作,或者从 docker hub 网站上拉取。

  • 查看当前有哪些镜像:

docker images
  • 删除某个镜像:
docker rmi IMAGE_ID
  • 查看正在运行的容器:
docker ps
  • 查看所有的容器(包括正在运行的和没有运行的):
docker ps -all
  • 暂停正在运行的容器:
docker stop CONTAINER_ID
  • 删除某个容器:
docker rm CONTAINER_ID
  • 删除所有容器:
docker container prune

3.docker拉取镜像、创建容器和可视化

这里以 ubuntu18+ros-melodic-desktop为例,从 docker hub 网站上拉取一个镜像,然后生成容器,最重要的是说明如何设置docker中ROS的可视化界面,比如rviz/gazebo等。

参考:如何可视化docker:以ROS环境为例(例如Gazebo,Rviz)

注意下面以服务器为例,因为服务器一般没有可视化界面,配置更复杂。如果是本地机器使用docker可视化,应该比使用服务器简单很多。此外如果使用的是本地机器,上面的参考博客中也有讲解如何操作。

3.1.第一次创建容器

  • 配置MobaXterm:

在这里插入图片描述

在这里插入图片描述

  • 登录到服务器上之后,首先解除Xserver的访问限制:
xhost +   # 注意二者之前有空格

如果成功解除,会显示:

 access control disabled, clients can connect from any host
  • 拉取镜像:
docker pull osrf/ros:melodic-desktop-full
  • 创建容器:注意这一步中的参数非常重要,因为它确定了容器的很多属性,如果后面要修改的话比较麻烦,所以尽量要在创建容器的时候就设置好。
docker run --env="DISPLAY=$DISPLAY" --net=host --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --env="QT_X11_NO_MITSHM=1" -v /tmp/.X11-unix:/tmp/.X11-unix:ro -it -v /home/cc/host_path:/media/data --name ros-melodic osrf/ros:melodic-desktop-full /bin/bash

关于这个指令的解释和注意如下:

  1. -v /home/cc/host_path:/media/data 这一句是把宿主机的 /home/cc/host_path 路径,挂在到容器内的 /media/data 路径;

  2. --name ros-melodic 是设置生成的容器的名字为 ros-melodic,这里不加这一句也可以,这里就是设置别名

  3. osrf/ros:melodic-desktop-full 是使用的镜像的名字,因为容器是从镜像生成的

  4. 剩下的前面的命令都是和可视化显示有关的,是为了实现容器的可视化。
    注意:上面的参考博客中,--env="DISPLAY=$DISPLAY" 这一句写的是 --env="DISPLAY",但是后面测试发现经常会无法显示可视化界面,后面很艰难的查到了一个说法是因为docker中的容器设置的显示器DISPLAY和宿主机的不一样,因此导致无法显示。而这里使用--env="DISPLAY=$DISPLAY"这句话的意思就是让docker容器的显示器DISPLAY和宿主机的一样,因为当前命令是在宿主机执行的,所以$DISPLAY其实就是当前宿主机的显示器标号,这样就把docker容器和宿主机的显示器DISPLAY设置成一样了。下面这个命令是另外一个博客中使用的,可以看到其中也有--env="DISPLAY=$DISPLAY"的语句:

sudo docker run -it --device=/dev/dri --group-add video --volume=/tmp/.X11-unix:/tmp/.X11-unix  --env="DISPLAY=$DISPLAY"  --name=rocker tiryoh/ros-melodic-desktop  /bin/bash
  • 刷新ros环境变量,测试ros可视化:
source /opt/ros/melodic/setup.bash   
rqt

如果正常的话,此时就可以看到rqt的可视化结果了。

注意,如果报错如下:

QXcbConnection: Could not connect to display localhost:17.0

则大概率还是DISPLAY的问题,需要把docker容器内的DISPLAY设置成和宿主机内一样的:
(1)参考博客:
ROS Could not connect to display localhost:17.0
docker虚拟机(可显示界面)
docker容器在windows上的可视化配置
Docker运行图形界面程序
(2)解决步骤:
① 查看宿主机内的DISPLAY的值:

echo $DISPLAY`   # 在宿主机内输入

比如显示:

localhost:14.0

② 修改docker容器的DISPLAY的值和宿主机一样:

export DISPLAY=:14.0  # 在docker容器内输入

3.2.进入已有的容器

3.2.1.命令行进入容器

  • 启动已经存在的容器:
docker start CONTAINER_ID
  • 然后进入容器:
docker exec -it CONTAINER_ID /bin/bash

3.2.2.使用脚本一次性进入容器

参考博客:Docker通过shell命令获取容器Id并把结果赋值给变量

像上面输入两次命令进入容器比较麻烦,尤其是要输入容器id。所以这里使用脚本一次进入容器——首先利用容器名字获取到它的id,然后进入容器:

#! /bin/bash
id=$(docker ps -aqf "name=ros-melodic")
docker exec -it $id /bin/bash
  • 设置进入容器的用户身份、进入之后的路径:
    进入docker容器的默认目录怎么指定
    docker:指定root用户进入容器

4.docker使用:tmux开多个终端

参考博客:
使用tmux进入docker容器
tmux使用笔记

4.1.在docker中使用tmux的原因

如果是在MobaXterm中进入了docker,但是现在想再打开一个终端输入命令:

(1)如果直接在MobaXterm中新建终端,会发现直接开了新的本地终端,连服务器的终端都不是,更别谈docker的多个终端了
(2)如果在服务器的终端中使用tmux开多个终端,会发现每次新建一个终端都是宿主机的环境,默认不会进入docker环境中,这样如果想使用docker中的多个终端,就要每次都重新进入一次容器,显然不太方便。

因此,如果想启动docker中的多个终端,应该在docker容器中安装tmux,然后进入docker之后使用tmux开多个终端。

4.2.操作步骤

假设目前要在docker内开两个终端,一个是运行roslaunch启动程序,另外一个是运行rosbag play播包,则操作步骤如下:

  • ssh到服务器上,接触Xserver访问限制:
xhost +
  • 进入docker容器:
docker start CONTAINER_ID
docker exec -it CONTAINER_ID /bin/bash

以下操作均在docker内进行
(1)运行程序:

tmux
source /opt/ros/melodic/setup.bash
source ./devel/setup.bash
roslaunch node run.launch

(2)播放rosbag:
键盘操作:Ctrl+b d

tmux
rosbag play rosbag.bag

(3)返回roslaunch的终端查看运行输出:
键盘操作:Ctrl+b d

tmux attach -t 0

5.docker使用:VSCode打开docker代码

参考博客:VSCode远程连接服务器里的docker(血泪踩坑)

在这里插入图片描述
实测操作步骤如下:

  • 给本地VSCode安装 Remote SSH、Remote developement、docker插件
  • 首先使用MobaXterm连接到服务器,因为MobaXterm是有显示器DISPLAY的,而VSCode并没有,这个需要给后面的可视化使用
  • 然后VSCode使用Remote SSH再次连接服务器
  • 从服务器的VSCode里打开docker插件,选择容器,右键attach to vscode就可以打开docker容器了

6.其它

  • docker对已经启动的容器添加目录映射(挂载目录)

  • 使用VNC可视化docker界面: ROS-学习笔记-06- Docker安装ROS、ROS VNC & Docker常用命令

  • 使用脚本加速pull docker image:https://github.com/NotGlop/docker-drag

  • 从tar加载docker镜像:

docker load -i xxx.tar
  • 在服务器上部署docker,为自己添加sudo权限:
    参考:在 Ubuntu 中如何将用户添加到 Sudoers
    首先找到一个具有sudo权限的用户,然后执行如下命令把要添加的普通用户xxx加入sudo用户组:
sudo usermod -aG sudo xxx

注意此时如果之前已经登陆了xxx这个用户的话,需要退出重新登录才能有sudo权限。使用sudo whoami命令测试,如果输出是root,则说明此时已经有了sudo权限。

相关文章:

docker使用与服务器上的可视化(ROS rviz等)

1.安装docker 安装docker:官网教程,按照官网命令一步步来即可。 添加当前用户到docker用户组: 【docker】添加用户到docker组,这样后面运行docker的时候前面不需要加sudo命令,否则运行docker的时候一直需要在前面加su…...

最新版本Portraiture4.1中文版ps磨皮滤镜插件安装包

在Portraiture有非常强大的手动功能,可以为用户进行手动调整照片中的皮肤区域以达到更加完美的效果,软件还支持同时导入上千张照片,用户可以通过自动识别照片中的人脸从而依照自己的风格进行批量处理十分的方便快捷。 最新版本Portraiture 4…...

仓储WMS对接淘宝奇门详细说明【亲测可用】

文章目录 简介名词解释奇门对接方案前期准备系统调用流程代码实现思路关键点(个人观点)奇门对接关键代码可能遇到的问题 简介 淘宝奇门项目支持 ERP、WMS 之间的系统标准化对接,通过构建 ERP、WMS 系统之间标准通信协议来实现不同系统之间的打通;对商家…...

RFID软件:简介、功能和应用范围

在当今快节奏的商业环境中,RFID(射频识别)技术已经成为物流、供应链和库存管理等领域中不可或缺的工具。本文将向您介绍RFID软件的基本知识,探讨其功能和广泛应用的范围。 第一部分:RFID软件简介 RFID软件是一种应用…...

Android 逆向之安全防护基本策略

对抗反编译 混淆 使用混淆主要可以减小包的大小。混淆对于安全保护来说,只是增加了阅读难度而已。混淆不会把关键代码混淆掉,比如MainActivity,Application等,可以通过分析smali和阅读jar包定位代码。 资源混淆也是换汤不换药&…...

基站机房:保障通信网络稳定,如何解决安全隐患?

基站机房作为无线通信网络的关键组成部分,承载着大量的网络设备和通信设施,对于运营商和通信服务提供商来说具有重要意义。 无论是大型运营商还是通信服务提供商,动环监控系统都将成为他们成功运营和管理通信网络的关键工具。 客户案例 案例…...

sqlmap -os-shell 使用方法

一、burp suite抓包。 如上图所示,红框处很明显是一个传参点,我们就在这个页面抓包。 抓到包之后将内容保存到桌面的1000.txt文件下。 二、sqlmap跑包。 打开sqlmap跑包。 python sqlmap.py -r C:\Users\16434\Desktop\1000.txt -dbmsmysql --os-shell…...

Go语言并发之Select多路选择操作符

1、Go语言并发之Select多路选择操作符 select 是类 UNIX 系统提供的一个多路复用系统 API,Go 语言借用多路复用的概念,提供了 select 关键字,用 于多路监听多个通道。当监听的通道没有状态是可读或可写的,select 是阻塞的&#…...

黄金回收小程序开发功能有哪些?

一、用户端: 1、实时查询:通过对接三方接口实现实时金价动态查看; 2、多种类珠宝实时回收:小程序支持多品类珠宝的实时回收包含黄金饰品、金条、铂金、K金、白银等,同步实现价格实时更新; …...

nginx的详解与应用

前言 说明 要义 nginx 有一个master 进程和多个worker 进程。主进程的主要目的是读取和评估配置,以及维护工作进程。工作进程对请求进行实际处理。nginx 采用基于事件的模型和依赖于操作系统的机制在工作进程之间有效地分发请求。工作进程的数量在配置文件中定义…...

SpringBoot激活profiles的几种方式

多环境是最常见的配置隔离方式之一,可以根据不同的运行环境提供不同的配置信息来应对不同的业务场景,在SpringBoot内支持了多种配置隔离的方式,可以激活单个或者多个配置文件。 激活的profiles要在项目内创建对应的配置文件,格式…...

【Java】Java核心要点总结:58

文章目录 1. java中 怎么确保一个集合不能被修改2. 队列和栈是什么 有什么区别3. Java8开始的ConcurrentHashMap为什么舍弃了分段锁4. ConcurrentHashMap 和 Hashtable有什么区别5. ReadWriteLock和StampeLock 1. java中 怎么确保一个集合不能被修改 Java 中可以使用 Collectio…...

前端面试题---作用域链和原型链

一.JavaScript 中的作用域链是如何工作的? JavaScript 中的作用域链(Scope chain)是一种用于查找变量和函数的机制,它是由嵌套的作用域环境组成的链式结构。 当在 JavaScript 中访问一个变量或函数时,解析器会首先在当前作用域…...

零售品牌私域流量池如何运营?火山引擎数智平台提供全套产品组合

虽然距离6月18日还有两周时间,但各大平台的第一波618战绩(预售尾款)已经相继出炉。 5月31日晚8点,京东率先公布618开门红10分钟销售战报:10分钟内,成交额破亿品牌数同比增长23%,超六成的新商家…...

rk3568 SD卡启动

rk3568 SD卡启动 SD卡启动系统,它可以让rk3568在没有硬盘或其他存储设备的情况下启动和运行操作系统。这使得rk3568变得与树梅派一样灵活切换系统,与此同时进行故障排查和修复,而不需要拆卸设备或者使用专业的烧录工具。SD卡启动还可以方便地…...

English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三

English Learning - L3 作业打卡 Lesson5 Day34 2023.6.7 周三 引言🍉句1: The woman reading the romantic novel could be a lawyer.成分划分弱读连读爆破语调 🍉句2: She just wants a light read to take her mind off work.成分划分弱读连读爆破语调…...

【运筹优化】最短路算法之A星算法 + Java代码实现

文章目录 一、A星算法简介二、A星算法思想三、A星算法 java代码四、测试 一、A星算法简介 A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,也是解决许多搜索问题的有效算法。算法中的距离估算值与实际值越接近,最终搜索速度越快。 二、A星算…...

[6]PCB设计实验|认识常用元器件|电阻器|18:30~19:00

目录 一、电阻器主要用途 1. 稳定和调节电路中的电流和电压 2. 作为分流、分压和负载使用 二、常见电阻器 1. 贴片电阻 2. 热敏电阻 3. 限流电阻 4. 可调电阻 5. 排阻(网络电阻) 三、几种常用电阻器的结构特点 四、电阻的参数 1. 额定功率 电阻器功率的表示 ​2…...

Webots R2021a教程

文章目录 Windows安装设置中文打开世界添加贴图 为外部控制器配置Anaconda解决报错:CondaSSLError: Encountered an SSL error. Most likely a certificate verification issue.调用Python API Windows 安装 进入下载页面 https://github.com/cyberbotics/webots/r…...

C++ 输出格式控制

C 输出格式控制 需包含头文件: 浮点数精度、域宽、填充 操作符功能right-alignedright-alignedsetprecision(int n)设置以n表示的数值精度setw(int n)设置以n表示的域宽setfill(char c)设置以c表示的填充字符 输出格式 操作符功能oct以八进制格式输出数据dec以…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

vscode里如何用git

打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天&#xff0c;大语言模型&#xff08;Large Language Models, LLMs&#xff09;已成为技术领域的焦点。从智能写作到代码生成&#xff0c;LLM 的应用场景不断扩展&#xff0c;深刻改变了我们的工作和生活方式。然而&#xff0c;理解这些模型的内部…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

【Veristand】Veristand环境安装教程-Linux RT / Windows

首先声明&#xff0c;此教程是针对Simulink编译模型并导入Veristand中编写的&#xff0c;同时需要注意的是老用户编译可能用的是Veristand Model Framework&#xff0c;那个是历史版本&#xff0c;且NI不会再维护&#xff0c;新版本编译支持为VeriStand Model Generation Suppo…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...