工作流介绍(算法组第六课)

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文件中定义了容器的配置选项
{
"name": "yolo_container",
"dockerComposeFile": "docker-compose.yml",
"service": "ros2yolo-service",
"workspaceFolder": "/home/Nagisa/yolo",
"shutdownAction": "stopCompose",
"customizations": {
"vscode": {
"extensions": [
"twxs.cmake",
"josetr.cmake-language-support-vscode",
"llvm-vs-code-extensions.vscode-clangd",
"ms-vscode.cmake-tools",
"cschlosser.doxdocgen",
"augustocdias.tasks-shell-input",
"ms-vscode.cpptools",
"ms-python.python",
"ms-iot.vscode-ros",
"njpwerner.autodocstring",
"vadimcn.vscode-lldb",
"llvm-vs-code-extensions.lldb-dap"
]
},
"jetbrains": {
"extensions": []
}
}
}
  • 通过上面的配置,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_URIROS_HOSTNAME,虽说是主机从机的概念,但是其实是双向通信(细则可以看这篇帖子

对于不同版本的ROS通信:当版本全ROS2时(如Foxy,Humble等)

  • 注意!:涉及到ROS2的通信,存在有若干的深坑。

坑总结:ROS2容器与主机(装了ROS2的)的通信正确方式

network_mode: host
pid: "host" # 添加 pid 命名空间共享
ipc: "host" # 添加 ipc 命名空间共享
  • 1.请确保你的docker-compose.yml中包含网络,pid和ipc的host共享,这样主机与ROS2容器位于同一网络空间,才可进行通信

  • 2.并且需要在ROS2容器中和本机设置一样的ROS_LOCALHOST_ONLY,这个环境变量的主要目的是让默认在局域网内广播发送消息的ROS2,变为在本机内广播发送消息。详细帖

export ROS_LOCALHOST_ONLY=1 # 在本终端中执行
echo 'export ROS_LOCALHOST_ONLY=1' >> ~/.bashrc # 永久写入,每次进入终端自动执行
  • 3.请务必确保主机的UID和GID与容器内的用户UID和GID一致,否则会出现通信问题,主机和容器中均使用root也是可以的,但不推荐,尽量都用普通用户详细帖
id -u # 查看当前用户的UID
id -g # 查看当前用户的GID
  • 上述每一步都是笔者踩过的一个坑,如果缺少其中任何一步,都可能会导致ROS2容器与主机通信有问题

ROS2的不同版本的容器通信(已尝试过,foxy和humble通信是狗屎,humble的多容器通信却是正常的)

  • 开启两个不同的基于humble镜像的容器,同样需要设置
export ROS_LOCALHOST_ONLY=1 # 在本个终端中执行
echo 'export ROS_LOCALHOST_ONLY=1' >> ~/.bashrc # 永久写入,每次进入终端自动执行

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
ros2 launch foxglove_bridge foxglove_bridge_launch.xml
  • 该节点会在默认端口8765开启一个websocket服务器,foxglove通过该端口与ROS1/ROS2进行通信

  • 随后点击打开链接,在WebSocket栏输入ws://localhost:8765即可连接

数据包

  • 数据包是ROS1和ROS2中用于存储和共享话题及其数据的文件,在ROS1中,数据包通常以.bag为后缀名,在ROS2中,数据包以.db3为后缀名。

  • 数据包可以作为记录,记录比如比赛时的各个话题的传感器数据,回放时可以将之前记录的数据包重新发布到相应的话题上,可以方便的进行调试程序和查错。

foxglove使用数据包

  • foxglove可以直接打开数据包进行可视化,只需要打开文件,选择对应的bag/db3文件即可,等待数据包加载完成就可以和看视频一样拖动回放,并可视化话题数据