RoboMaster Control System based on ROS2.
- x86-64 架构
- 任意 Linux 发行版,或 WSL2(参见 WSL2开发指南)
- VSCode,安装 Dev Containers 扩展
- 安装 Docker 并 配置代理(部分国家或地区)
下载开发镜像:
docker pull qzhhhi/rmcs-develop:latest
也可自行使用 Dockerfile
构建,参见 镜像构建指南。
克隆仓库,注意需要使用 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
在启动时卡住很长一段时间,可以尝试 这个解决方案。
在 VSCode 中新建终端,输入:
cp .vscode/settings.default.json .vscode/settings.json
这会应用我们推荐的 VSCode 配置文件,你也可以按需自行修改配置文件。
在拓展列表中,可以看到我们推荐使用的拓展正在安装,你也可以按需自行删减拓展。
在 VSCode 终端中输入:
build-rmcs
将会运行 .script/build-rmcs
脚本,在路径 rmcs_ws
下开始构建代码。
构建完毕后,基于 clangd
的 C++
代码提示将可用。此时可以正常编写代码。
Note: 用于开发的所有脚本均位于 .script
中,参见 开发脚本手册(TODO)。
编写代码并编译完成后,可以使用:
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 下位机,此指令只需执行一次。
- x86-64 架构
- 任意 Linux 发行版
- 安装 Docker
下载部署镜像:
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
即获取部署镜像。
在 MiniPC 终端中输入:
docker run -d --restart=always --privileged --network=host -v /dev:/dev qzhhhi/rmcs-runtime:latest
即可启动部署镜像,此后镜像将保持开机自启。
在开发容器终端中输入:
set-remote <remote-host>
其中,remote-host
可以为 MiniPC 的:
-
IPv4 / IPv6 地址 (e.g., 169.254.233.233)
-
IPv4 / IPv6 Link-local 地址 (e.g., fe80::c6d0:e3ff:fed7:ed12%eth0)
-
mDNS 主机名 (e.g., my-sentry.local)
参见 网络配置指南(TODO)。
接下来在开发容器终端中继续输入:
ssh-remote
即可在开发容器中,ssh 连接到远程的部署容器。
RMCS 的所有代码更新和调试,都基于从开发容器向部署容器的 ssh 连接。
部署容器会监听 TCP:2022 端口作为 ssh-server 端口,请注意保证端口空闲。
参见 容器设计思想(TODO)。
Tip: GUI 可以从部署容器中穿出,尝试在 ssh-remote 中打开 rviz2。
新启动的部署容器内是没有代码的,需要由开发容器上传。
在开发容器中构建完成后,可以执行指令:
sync-remote
这将拉起一个同步进程,自动将开发容器中的构建产物同步到部署容器。
同步进程除非主动使用 Ctrl+C
结束,否则不会退出,其会监视所有文件变更,并实时同步到部署容器。
Tip: 由于
build-rmcs
采用symlink-install
方式构建,因此对于配置文件和 .py 文件,直接修改其源文件,无需编译即可触发同步。
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。
指令 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 守护进程后,显示实时输出。