Skip to content

Alliance-Algorithm/RMCS

Repository files navigation

RMCS

RoboMaster Control System based on ROS2.

Development

Pre-requirements:

Step 1:获取镜像

下载开发镜像:

docker pull qzhhhi/rmcs-develop:latest

也可自行使用 Dockerfile 构建,参见 镜像构建指南

Step 2:克隆并打开仓库

克隆仓库,注意需要使用 recurse-submodules 以克隆子模块:

git clone --recurse-submodules https://github.com/Alliance-Algorithm/RMCS.git

在 VSCode 中打开仓库:

code ./RMCS

Ctrl+Shift+P,在弹出的菜单中选择 Dev Containers: Reopen in Container

VSCode 将拉起一个 Docker 容器,容器中已配置好完整开发环境,之后所有工作将在容器内进行。

如果 Dev Containers 在启动时卡住很长一段时间,可以尝试 这个解决方案

Step 3:配置 VSCode

在 VSCode 中新建终端,输入:

cp .vscode/settings.default.json .vscode/settings.json

这会应用我们推荐的 VSCode 配置文件,你也可以按需自行修改配置文件。

在拓展列表中,可以看到我们推荐使用的拓展正在安装,你也可以按需自行删减拓展。

Step 4:构建

在 VSCode 终端中输入:

build-rmcs

将会运行 .script/build-rmcs 脚本,在路径 rmcs_ws 下开始构建代码。

构建完毕后,基于 clangdC++ 代码提示将可用。此时可以正常编写代码。

Note: 用于开发的所有脚本均位于 .script 中,参见 开发脚本手册(TODO)。

Step 5 (Optional):运行

编写代码并编译完成后,可以使用:

launch-rmcs

在本机上运行代码。在首次运行代码前,需要调用 set-robot 脚本设置机器人类型。

确认设备接入

可以使用 lsusb 确定 下位机 是否已接入,若已接入,则 lsusb 输出类似:

Bus 001 Device 004: ID a11c:75f3 Alliance RoboMaster Team. RMCS Slave v2.1.2

在 WSL2 下,需要 使用 usbipd 对设备进行转接

确认权限正确

在主机(不要在 docker 容器)的终端中输入:

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="a11c", MODE="0666"' | sudo tee /etc/udev/rules.d/95-rmcs-slave.rules &&
sudo udevadm control --reload-rules &&
sudo udevadm trigger

以允许非 root 用户读写 RMCS 下位机,此指令只需执行一次。

Deployment

Pre-requirements:

Step 1:获取镜像

下载部署镜像:

docker pull qzhhhi/rmcs-develop:latest

如果不方便在 MiniPC 上配置代理,可以在开发机上下载镜像后,使用

docker save qzhhhi/rmcs-runtime:latest > rmcs-runtime.tar

然后使用任意方式(如 scp)将 rmcs-runtime.tar 传送到 MiniPC 上,并在其上执行:

docker load -i rmcs-runtime.tar

即获取部署镜像。

Step 2:启动容器

在 MiniPC 终端中输入:

docker run -d --restart=always --privileged --network=host -v /dev:/dev qzhhhi/rmcs-runtime:latest

即可启动部署镜像,此后镜像将保持开机自启。

Step 3:远程连接

在开发容器终端中输入:

set-remote <remote-host>

其中,remote-host 可以为 MiniPC 的:

  1. IPv4 / IPv6 地址 (e.g., 169.254.233.233)

  2. IPv4 / IPv6 Link-local 地址 (e.g., fe80::c6d0:e3ff:fed7:ed12%eth0)

  3. mDNS 主机名 (e.g., my-sentry.local)

参见 网络配置指南(TODO)。

接下来在开发容器终端中继续输入:

ssh-remote

即可在开发容器中,ssh 连接到远程的部署容器。

RMCS 的所有代码更新和调试,都基于从开发容器向部署容器的 ssh 连接。

部署容器会监听 TCP:2022 端口作为 ssh-server 端口,请注意保证端口空闲。

参见 容器设计思想(TODO)。

Tip: GUI 可以从部署容器中穿出,尝试在 ssh-remote 中打开 rviz2。

Step 4:同步构建产物

新启动的部署容器内是没有代码的,需要由开发容器上传。

在开发容器中构建完成后,可以执行指令:

sync-remote

这将拉起一个同步进程,自动将开发容器中的构建产物同步到部署容器。

同步进程除非主动使用 Ctrl+C 结束,否则不会退出,其会监视所有文件变更,并实时同步到部署容器。

Tip: 由于 build-rmcs 采用 symlink-install 方式构建,因此对于配置文件和 .py 文件,直接修改其源文件,无需编译即可触发同步。

Step 5:重启服务

RMCS 在部署容器中以服务方式启动 (/etc/init.d/rmcs)。

确认构建产物同步完毕后(以出现 Nothing to do 为标志),进入 ssh-remote,输入:

set-robot <robot-name>

设置启动的机器人类型(例如 set-robot sentry)。

接下来继续输入:

service rmcs restart

如果一切正常,其将会输出:

Successfully stopped RMCS daemon.
Successfully started RMCS daemon.

这证明 RMCS 已成功在部署容器中启动,并会随以后的每次容器启动而启动。

接下来可以使用:

service rmcs attach

查看 RMCS 的实时输出。

需要注意的是,service rmcs attach 本质上是连接到了一个 GNU screen 会话,因此任何按键都会被忠实地转发至 RMCS。例如,当键入 Ctrl+C 时,RMCS 会接到 SIGINT,从而停止运行。

如果希望退出对实时输出的查看,可以键入 Ctrl+A ,然后按 D

如果希望向上翻页,可以键入 Ctrl+A ,然后按 Esc

更多快捷键组合参见 Screen Quick Reference

Step 6:糖

指令 ssh-remote 后可以添加参数,参数内容即为建立链接后立即执行的指令。

例如:

ssh-remote service rmcs restart

可以在开发容器端快速重启部署容器中的 RMCS。

又如:

ssh-remote service rmcs attach

可以在开发容器端快速查看部署容器中 RMCS 的实时输出。

实际上,可以使用指令:

attach-remote

作为前者的替代(其实现就是前者)。

进一步的,还可以使用:

attach-remote -r

作为 ssh-remote "service rmcs restart && service rmcs attach" 的替代。

其在重启 RMCS 守护进程后,自动连接显示实时输出。

更进一步的,指令间还可以组合,例如:

build-rmcs && sleep 2 && attach-remote -r

可以触发 RMCS 构建,完成后等待 2 秒以保证文件同步,接下来重启 RMCS 守护进程后,显示实时输出。