如何在HPC上使用多终端运行ROS仿真并提交对应作业
HPC运行多进程ROS仿真作业脚本编写指南
核心思路
本地多终端运行ROS本质是启动多个相互依赖的进程:roscore作为主服务优先启动,后续功能节点在roscore可用后依次启动。HPC作业脚本不需要启动可视化终端,直接按依赖顺序启动后台进程,仿真结束后统一回收进程即可。
前置准备
- 确认HPC计算节点已安装对应版本的ROS,优先推荐将ROS环境和仿真依赖打包为Singularity/Apptainer镜像,避免节点环境依赖冲突
- 提前在本地测试所有ROS命令的启动顺序、最小等待间隔,确认全链路功能正常
- 若仿真有可视化需求,提前修改配置将rviz等工具的输出改为离线保存帧图/视频,不要在作业中启动交互类可视化工具
作业脚本示例(适配Slurm调度器,绝大多数HPC默认使用Slurm)
以下是可直接提交的作业脚本模板,文件命名为ros_simulation.job:
#!/bin/bash # Slurm资源配置部分,根据你的仿真需求调整 #SBATCH --job-name=ros_simu #SBATCH --output=ros_simu_%j.out #SBATCH --error=ros_simu_%j.err #SBATCH --nodes=1 #SBATCH --ntasks-per-node=4 #SBATCH --time=02:00:00 #SBATCH --mem=8G # 加载ROS环境,若使用容器镜像则替换为Singularity执行前缀 source /opt/ros/noetic/setup.bash source 你的ROS工作空间绝对路径/devel/setup.bash # 第一步:启动roscore,后台运行并记录进程ID roscore & ROSCORE_PID=$! # 可靠等待roscore启动完成,替代固定时长sleep until rostopic list > /dev/null 2>&1; do sleep 1; done # 第二步:按依赖顺序启动其他ROS节点/launch文件,全部后台运行 roslaunch 你的功能包名 simulation.launch & SIMU_PID=$! sleep 3 roslaunch 你的功能包名 controller.launch & CONTROLLER_PID=$! sleep 3 rosrun 你的功能包名 data_recorder.py & RECORDER_PID=$! # 等待仿真结束:可替换为等待指定进程退出,例如wait $SIMU_PID sleep 3600 # 仿真结束后按顺序终止所有相关进程 kill $RECORDER_PID kill $CONTROLLER_PID kill $SIMU_PID kill $ROSCORE_PID # 等待所有进程完全退出 wait
脚本编写完成后执行sbatch ros_simulation.job即可提交到HPC队列。
注意事项
- 所有需要持续运行的ROS命令后必须加
&放到后台,否则脚本会卡在当前命令无法执行后续启动逻辑 - 如果使用Singularity/Apptainer镜像运行ROS,所有ROS命令前统一添加执行前缀即可,例如
singularity exec ros_noetic.sif roscore &,整体逻辑和上述模板完全一致 - 若你的仿真有明确的结束触发条件(例如指定节点运行完成自动退出),可以把固定时长
sleep的逻辑替换为wait 对应进程ID,仿真结束后会自动执行后续的进程回收逻辑
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

