ROS运行cnn_bridge报logdir参数未设置RLException错误咨询
运行cnn_bridge功能包的segmentation_publisher.launch时抛出异常:
RLException: [/home/user/catkin_ws/src/cnn_bridge/launch/segmentation_publisher.launch] requires the 'logdir' arg to be set.
The traceback for the exception was written to the log file
ROS launch的<arg>参数规则没有特殊逻辑:
- 定义时带
default属性的是可选参数,启动时不手动传值就自动使用默认值 - 定义时不带
default属性的是必传参数,启动时必须显式赋值,否则roslaunch会直接终止启动流程,抛出要求设置对应参数的异常
对照提供的launch文件内容,source、logdir、metadata_source、mode、input_tensor、output_tensor这6个参数都没有配置默认值,属于必传项。本次报错是因为启动时未传入logdir参数,即使补传了logdir,剩余5个未赋值的必传参数也会挨个触发同类报错,直到所有必传参数都完成赋值才会正常启动节点。
额外标注两处该launch文件本身的编写疏漏:一是定义了mode参数但节点内未引用,直接把mode值写死为segmentation;二是source参数定义后也未被节点引用,节点内的source话题直接写了$(dirname /camera/rgb/image_raw),实际解析结果为/camera/rgb,并非原始图像话题,这两个问题不影响本次报错排查,但实际运行时需要根据自身话题配置和需求修正。
选择其中一种方式处理即可:
- 命令行启动时直接传入所有必传参数,参考命令如下:
roslaunch cnn_bridge segmentation_publisher.launch \ logdir:=本地训练好的分割模型权重目录的绝对路径 \ metadata_source:=对应数据集的元数据文件绝对路径 \ input_tensor:=模型输入张量名称 \ output_tensor:=模型输出张量名称 \ source:=待订阅的输入图像话题名
- 直接修改launch文件,为所有无默认值的必传参数配置符合自身使用场景的默认值,例:
<arg name="logdir" default="/home/user/catkin_ws/model/segmentation" />
剩余几个必传参数按相同方式补完默认值后,后续直接用常规roslaunch命令启动即可,无需每次启动时手动输入长串参数。
不需要为launch文件中的所有参数手动设置取值,只有未配置default属性的必传参数必须赋值,带默认值的参数无特殊需求直接使用预设值即可。
环境适配提示:当前运行环境使用Tensorflow 2.2.0版本,该功能包如果基于TF1.x接口开发,运行时可能出现API兼容报错,可在代码开头添加TF1.x兼容配置,或修改对应接口调用逻辑适配TF2版本。
内容的提问来源于stack exchange,提问作者Anto

