基于Docker的ROS开发

ops/2024/9/23 5:15:45/

本文主要介绍如何使用Docker在Windows和Linux环境中部署并使用ROS,通过Docker Container运行ROS,可以方便我们在一个本地环境中运行多个ROS版本。
更多内容,访问专栏目录获取实时更新。

关于ROS的版本

参考ROS1 Distribution Wiki和ROS2 Distribution Wiki,推荐使用:

  • ROS1 Noetic 版本(2020/05发布,支持到2025/05)
  • ROS2 Humble版本(2022/05发布,支持到2027/05)

拉取ROS镜像并运行ROS容器

要求阅读者需要具有基础的Docker使用经验
关于ROS的镜像,可以访问Docker Hub查找对应版本的脚本,本文里我们以ROS1 Noetic和ROS2 Humble为例演示。

环境要求
在Windows环境中,需要安装Docker Desktop,并且可以通过命令行执行docker命令:
在这里插入图片描述
Linux环境使用的是Ubuntu 22,同样已经提前安装了docker
在这里插入图片描述

拉取镜像
在Windows环境中,需要首先启动Docker Desktop。然后执行下面的脚本,可以拉取ROS1和ROS2的镜像文件:

docker pull osrf/ros:noetic-desktop
docker pull osrf/ros:humble-desktop

执行完成后,通过指令查看已拉取的镜像文件:

docker images

在这里插入图片描述
运行容器

docker run --name <container-name> -it <image-name:tag>

上面的指令是运行一个容器,容器名为’container-name’的替换内容,使用’image-name:tag’指定的镜像文件,并运行在交互模式下(-it),指令示例:

docker run --name noetic-gui -it osrf:noetic-desktop

指令运行以后,命令行将会进行到该容器的交互模式下,在Docker Desktop中,能看到当前运行的容器:
在这里插入图片描述
在这里插入图片描述

运行ROS

当前我们已经启动了ROS Noetic的Docker容器,并进入了交互模式,在命令行中执行roscore来启动ROS Master (仅针对ROS1版本需要)
在这里插入图片描述
如果你也在命令行中看到了上述的内容,说明ROS1运行成功。
Windows中启动另一个命令行,执行下面的命令,进入到一个已启动容器的交互模式:

docker exec -it <container-name> bash

在这里插入图片描述
然后执行:

source /opt/ros/noetic/setup.bash
printenv | grep ROS
rostopic list

第一条指令在每启动一个shell时都需要执行一下(除非你将该指令加入到了.bashrc文件中),它能配置你的shell让你获取到ROS的程序和帮助这些程序找到依赖的包。
第二,三条指令分别是查看已安装ROS的环境变量和当前的ROS Topic列表,如果已正确完成了上述步骤,你可以看到下图类似的内容:
在这里插入图片描述

Docker容器中的GUI程序

如果我们运行的ROS程序需要打开一些用户交互界面,比如Gazebo,RViz等,在Docker容器中要怎么办呢?

以经典的小乌龟(turtlesim)为例,演示如何在docker容器中使用GUI。

rosrun turtlesim turtlesim_node

我相信执行完上面的指令后你将会得到下面的错误:
在这里插入图片描述
这时就需要我们安装XLaunch来实现界面的显示,你可以访问Xming网站获取,或通过SourceForge下载。在安装时基本不许要任何配置,仅注意同时安装XLaunch即可。
在这里插入图片描述
安装完成后,启动XLaunch,只需要在下图标注的步骤修改值为0,其他一直点击下一步直至结束在这里插入图片描述
这时在电脑的状态栏里你应该能够看到启动的XServer.
在这里插入图片描述
确保XServer正常运行,这时再重新运行Noetic的容器,不过通过下面的指令运行:

docker run --name noetic-gui -e DISPLAY=host.docker.internal:0.0 -it osrf/ros:noetic-desktop

然后运行roscore并在另一个命令行中重复之前的命令(不要忘记source一下),启动turtlesim

rosrun turtlesim turtlesim_node

在这里插入图片描述
我们的小乌龟就正常的显示在桌面上了。
启动另一个命令行,我们来通过键盘上下左右控制小乌龟:

rosrun turtlesim turtle_teleop_key

在这里插入图片描述
在Ubuntu中,步骤基本类似,在启动ROS时,建议通过一个bash文件来启动容器,run_noetic_gui.bash:

xhost local:rootXAUTH=/tmp/.docker.xauthdocker run -it \--name=noetic-gui \--env="DISPLAY=$DISPLAY" \--env="QT_X11_NO_MITSHM=1" \--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \--env="XAUTHORITY=$XAUTH" \--volume="$XAUTH:$XAUTH" \--net=host \--privileged \osrf/ros:noetic-desktop \bashecho "Done."

如何访问Docker容器中的文件

在之后的开发中,我们需要创建工作空间并创建自己的工程项目,而当前的ROS运行在Docker容器中,要怎样访问的到呢。

这里推荐使用VisualStudio Code,并安装插件Dev Container
在这里插入图片描述
成功安装了插件后,我们就可以通过VS Code打开一个Docker Container的文件目录啦。
在这里插入图片描述
在这里插入图片描述
至此,我们成功的在Windows或Ubuntu环境下,通过Docker中运行了ROS Noetic,并且能够显示用户界面,并且通过VS Code访问容器中的文件和工程。

如有错误,欢迎留言或来信指正:hbin6358@163.com

http://www.ppmy.cn/ops/44672.html

相关文章

pd.DataFrame 列数值显示 (3.57778585285+0j) 可以转成正常的格式么

要将 pd.DataFrame 列中的复数&#xff08;例如 (3.577785852850j)&#xff09; 转换为只显示实数部分&#xff0c;可以使用 pandas 的 apply 函数配合一个 lambda 表达式来实现。具体步骤如下&#xff1a; 1. 创建一个示例 DataFrame。 2. 使用 apply 函数和 lambda 表达式遍…

链接物化视图在 ClickHouse 中的应用

本文字数&#xff1a;7728&#xff1b;估计阅读时间&#xff1a;20 分钟 作者&#xff1a;Mark Needham 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 在 ClickHouse 中&#xff0c;物化视图【https://clickhouse.com/docs/en/guide…

JAVA云HIS医院管理系统源码 云HIS系统源码 云HIS的优势 云HIS的发展

JAVA云HIS医院管理系统源码 云HIS系统源码 云HIS的优势 云HIS的发展 HIS系统&#xff0c;即医院信息系统&#xff08;Hospital Information System&#xff09;&#xff0c;在医院的运营和管理中扮演着至关重要的角色。关于HIS系统的溯源&#xff0c;简单从以下几个方面进行讲…

CTF网络安全大赛简单web题目:eval

题目来源于&#xff1a;bugku 题目难度&#xff1a;简单 一道简单web的题目 题目源代码&#xff1a; <?phpinclude "flag.php";$a $_REQUEST[hello];eval( "var_dump($a);");show_source(__FILE__); ?> 这个PHP脚本有几个关键部分&#xff0c;但…

数字化学校渠道的建造内容

数字化学校渠道的建造内容可以用阶段来区分&#xff1a; 1.网络硬件为主的建造 这一阶段首要重视的是学校网络的硬件基础建造&#xff0c;一起供给部分网络根本服务&#xff0c;与此一起&#xff0c;也进行部分信息使用内容的建造&#xff0c;如电子阅览室、归纳管理信息体系等…

用 vue3 + phaser 实现经典小游戏:飞机大战

本文字数&#xff1a;7539字 预计阅读时间&#xff1a;30分钟 01 前言 说起小游戏&#xff0c;最经典的莫过于飞机大战了&#xff0c;相信很多同学都玩过。今天我们也来试试开发个有趣的小游戏吧&#xff01;我们将从零开始&#xff0c;看看怎样一步步实现一个H5版的飞机大战&a…

ChatGPT API 开发人员实施指南

在技​​术以惊人的速度发展的世界中&#xff0c;ChatGPT API 已经成为游戏规则的改变者&#xff0c;为开发人员开辟了无限的可能性。ChatGPT API 使将类人人工智能的强大功能集成到您的应用程序中成为可能。 在本教程中&#xff0c;您将学习如何在应用程序中利用 ChatGPT API…

Java导出excel带图片(希望能帮助你们节省时间)

第一天太慌张&#xff0c;下班逃跑&#xff0c;一夜没睡好&#xff0c;第二天决定搞出来。 查了好多博客&#xff0c;感觉都挺繁琐的&#xff0c;好多工具类、引入类找不到。经过一上午的琢磨&#xff0c;终于搞定。记录一下 借鉴了这个博主的文章 需求前端点击导出按钮&#…