几个工作流介绍
Konsole的使用
Ubuntu默认使用GNOME桌面环境,同时支持Wayland和X11两种显示服务器协议。KDE桌面环境则是另一种流行的Linux桌面环境,主要使用X11协议,但也支持Wayland。
Konsole是KDE桌面环境下的终端模拟器,可以类比超级终端(Terminator),但是他拥有更多的快捷键和功能
Konsole的快捷键和功能可以在设置中进行查看和修改,你能想到的快速分屏,复制粘贴等快捷键这里基本都有
下载后,需要将Konsole设置为默认终端模拟器,输入如下指令后按提示进行:
sudo update-alternatives --config x-terminal-emulator |
开发容器与DevContainer的使用
- DevContainer是Visual Studio Code(VS Code)中的一个功能,允许开发者在隔离的容器环境中进行开发。
- 无需在终端进行docker有关的容器创建和开启等操作,直接在VS Code中打开项目文件夹,VS Code会自动识别并提示你是否需要使用DevContainer进行开发
devcontainer的自动识别触发要求
- 首先当然是在vscode中添加devcontainer插件
- 在项目根目录下有一个名为
.devcontainer
的文件夹,该文件夹中包含一个devcontainer.json
文件,并且有Dockerfile或者docker-compose.yml文件来定义容器的配置,若你对Docker和docker-compose不熟悉,建议再去学习一下相关知识
项目根目录指的是你vscode打开文件夹的那一级目录
devcontainer.json
文件中定义了容器的配置选项
{ |
- 通过上面的配置,VS Code会识别并知道你究竟是希望通过dockerfile构建镜像并用该镜像创建容器,还是通过docker-compose.yml文件直接调用已有的镜像来创建容器
- 本质上来说,
devcontainer.json
文件只是一种配置文件格式,让你可以直接根据配置从vscode中一键创建容器并进入到容器中,但你的容器创建和使用的具体细节仍在docker-compose.yml
中管理
devcontainer的坑
除去docker容器和镜像本身自带的坑,请一定注意:当你希望使用上述devcontainer功能时,确保该容器没有已经存在于docker中,即没有同名的容器,如果有同名容器,会在vscode时进入时error
如果有同名容器,可以通过docker ps -a查看所有容器,然后docker stop
停止该容器,最后docker rm 删除该容器之后再进行上述操作
ROS1与ROS2通信
- ROS中的信息流以topic的形式进行传递,可以将ROS1和ROS2看作两个独立的信息域。
- 当然,如果是同个容器中的通讯,直接使用ROS的话题传递即可,此处不作赘述。
对于不同版本的ROS通信:当版本全ROS1时(如Kinetic,Melodic等)
- ROS1内部不同版本之间的通信是基于roscore的,即Kinetic与Melodic可以直接通信,尤其注意这个概念,宿主机上的本体,包含运行的所有容器中只能存在一个正在运行的roscore,而ros1的通信就主要依靠与一个全局roscore来进行话题的传递
- 笔者在进行ROS1不同版本通信时,只需要其中一个ROS1容器开启roscore,其他ROS1容器就可以直接接收到另一个ROS1容器发布的话题。
当为多机ROS1通信时(不重要,且不常用,故略讲)
- 同样允许不同版本的ROS1通信,但是需要配置ROS_MASTER_URI和ROS_HOSTNAME,虽说是主机从机的概念,但是其实是双向通信(细则可以看这篇帖子)
对于不同版本的ROS通信:当版本全ROS2时(如Foxy,Humble等)
- 注意!:涉及到ROS2的通信,存在有若干的深坑。
坑总结:ROS2容器与主机(装了ROS2的)的通信正确方式
network_mode: host |
1.请确保你的docker-compose.yml中包含网络,pid和ipc的host共享,这样主机与ROS2容器位于同一网络空间,才可进行通信
2.并且需要在ROS2容器中和本机设置一样的ROS_LOCALHOST_ONLY,这个环境变量的主要目的是让默认在局域网内广播发送消息的ROS2,变为在本机内广播发送消息。详细帖
export ROS_LOCALHOST_ONLY=1 # 在本终端中执行 |
- 3.请务必确保主机的UID和GID与容器内的用户UID和GID一致,否则会出现通信问题,主机和容器中均使用root也是可以的,但不推荐,尽量都用普通用户。详细帖
id -u # 查看当前用户的UID |
- 上述每一步都是笔者踩过的一个坑,如果缺少其中任何一步,都可能会导致ROS2容器与主机通信有问题
ROS2的不同版本的容器通信(已尝试过,foxy和humble通信是狗屎,humble的多容器通信却是正常的)
- 开启两个不同的基于humble镜像的容器,同样需要设置
export ROS_LOCALHOST_ONLY=1 # 在本个终端中执行 |
ROS1与ROS2桥接通信
- ROS1与ROS2的通信需要使用桥接包ros1_bridge,该桥接包允许在ROS1和ROS2之间传递消息。
- 由于该桥接包本质还是使用的ROS2的通信机制,因此需要确保ROS2容器与主机的通信正确方式,即上述的三点
- 具体的安装方式请详见该仓库readme,该仓库采用的是镜像编译产生install包,可以直接使用编译后的install包进行桥接
- 编译后的包文件如下
- 其本质是一个挂载在ROS2容器中的桥接节点,强烈推荐你读完readme复现后写一个.bash/sh文件将readme教你在包构建之后的流程打包成一个脚本文件一键执行。挂在后台即可进行Humble和Noetic的桥接(根据去年的使用经验不一定非得是这两个版本,但是作者是这样写的)
foxglove+数据包开发流
- foxglove是一个开源的机器人数据可视化工具,多数时间是rviz的更优选择,支持ROS1和ROS2,可以用来可视化机器人传感器数据、状态信息等。
- foxglove也是简单的采用deb的安装方式,安装后即可使用。
- foxglove支持图表、3D视图、多数据查看等功能,这个只能说对比rviz来说,谁用谁知道
- 但是foxglove采用的是websocket的通信方式,因此foxglove与ROS1/ROS2的通信需要一个中间节点,这个中间节点foxglove-bridge。注意,即使在容器中同理,也是只用开启这个中间节点,宿主机/其他容器中运行的foxglove即可进行通信
sudo apt install ros-$ROS_DISTRO-foxglove-bridge |
该节点会在默认端口8765开启一个websocket服务器,foxglove通过该端口与ROS1/ROS2进行通信
随后点击打开链接,在WebSocket栏输入
ws://localhost:8765
即可连接
数据包
数据包是ROS1和ROS2中用于存储和共享话题及其数据的文件,在ROS1中,数据包通常以
.bag
为后缀名,在ROS2中,数据包以.db3
为后缀名。数据包可以作为记录,记录比如比赛时的各个话题的传感器数据,回放时可以将之前记录的数据包重新发布到相应的话题上,可以方便的进行调试程序和查错。
foxglove使用数据包
- foxglove可以直接打开数据包进行可视化,只需要打开文件,选择对应的bag/db3文件即可,等待数据包加载完成就可以和看视频一样拖动回放,并可视化话题数据