ROS自动驾驶项目如何单文件运行所有脚本 选.sh还是.launch
方案选择结论
自动驾驶ROS项目做单文件统一启动,优先选择ROS原生的.launch文件作为核心启动方案,.sh脚本仅适合作为前置补充,不建议单独用.sh串所有启动命令。
.launch文件的核心优势
- 完全适配ROS运行逻辑:无需在启动脚本里反复写source工作空间、设置ROS环境变量的操作,自动处理节点间的命名空间隔离、话题重映射、参数服务关联,调整节点间的话题订阅关系时不需要修改各个功能脚本的源码,直接在launch文件里配置即可。
- 自带进程托管能力:可以直接给节点配置
respawn="true"属性,目标检测、车道检测这类核心感知节点如果异常崩溃,会被自动重启,适配自动驾驶场景的高可用要求;停止时按Ctrl+C就能一键关闭所有启动的节点,不需要手动挨个kill进程。 - 配置管理效率更高:支持直接加载yaml格式的参数文件,也可以单独给节点传参,目标检测的模型路径、置信度阈值,车道检测的ROI区域参数都可以统一在launch关联的配置文件里管理,不需要在每个启动命令后拼接长串参数。
- 支持灵活的启动逻辑:可以通过参数arg配置条件启动,比如调试时传入参数就只启动感知类节点,实车部署时再启动全量节点,也可以把节点按功能分组,统一给组内节点设置命名空间、环境变量。
.sh脚本的适用场景
不建议单独用.sh脚本逐个rosrun启动所有节点,它更适合做launch启动前的前置操作:
- 硬件预检查:启动前检查摄像头、激光雷达、CAN卡等外设是否正常连接,提前给串口、USB设备加读写权限。
- 非ROS程序启动:如果项目里包含不属于ROS节点体系的程序,比如独立的可视化前端、本地日志自动同步脚本、模型预热服务,可以在sh里先启动这类程序,最后再调用roslaunch启动所有ROS节点。
示例代码
统一启动的launch文件示例
在你的感知功能包下新建launch/autodrive_all.launch文件,内容如下:
<launch> <!-- 统一加载所有感知参数配置 --> <rosparam file="$(find 你的感知功能包包名)/config/perception_params.yaml" command="load" /> <!-- 启动目标检测节点,异常退出自动重启 --> <node pkg="你的感知功能包包名" type="object_detect.py" name="object_detection" output="screen" respawn="true" /> <!-- 启动车道线检测节点 --> <node pkg="你的感知功能包包名" type="lane_detect.py" name="lane_detection" output="screen" respawn="true" /> <!-- 其余功能节点按照相同格式添加即可 --> </launch>
写完后直接执行roslaunch 你的感知功能包包名 autodrive_all.launch就能一键启动所有配置的节点。
配合前置检查的sh脚本示例
如果需要加硬件预检查逻辑,可以新建start_all.sh:
#!/bin/bash # 给CAN卡加权限 sudo chmod 777 /dev/ttyUSB0 # 检查摄像头是否接入 if [ ! -e "/dev/video0" ]; then echo "错误:车载摄像头未连接,启动终止" exit 1 fi # 启动ROS全节点 roslaunch 你的感知功能包包名 autodrive_all.launch
给脚本加执行权限:chmod +x start_all.sh,之后直接运行这个脚本就能完成前置检查+全节点启动。
内容的提问来源于stack exchange,提问作者gurselturkeri
相关产品推荐
相关产品推荐

