如何从Bash脚本传参至ROS Launch并配置节点运行参数
解决方案
1. 从Bash脚本向Launch传递参数并分发到节点
首先修改Bash脚本,以键值对形式传递参数给roslaunch:
#!/bin/sh foldername=camera_calibration_$(date +"%m-%d-%Y") roslaunch image_pub cam_calibrator.launch foldername:=$foldername
然后更新Launch文件,先声明外部传入的参数,再将参数传递给两个节点:
<launch> <!-- 声明外部传入的foldername参数,设置默认值避免未传入时报错 --> <arg name="foldername" default="default_calib_folder"/> <!-- 统一管理校准所需的固定参数,方便后续修改 --> <arg name="calib_size" default="12x8"/> <arg name="square_size" default="0.05"/> <arg name="image_topic" default="/topic_name"/> <!-- 给C++节点传递参数:两种可选方式 --> <node name="image_pub_sub_node" pkg="image_pub" type="image_pub_sub" output="screen"> <!-- 方式1:写入ROS参数服务器,C++通过ros::param读取 --> <param name="calib_folder" value="$(arg foldername)"/> <!-- 方式2:直接作为命令行参数,C++通过argc/argv读取 --> <args>$(arg foldername)</args> </node> <!-- 给Python校准脚本传递参数:完全对应rosrun时的命令行格式 --> <node name="cameracalibrator_node" pkg="camera_calibration" type="cameracalibrator.py" output="screen"> <args>--size $(arg calib_size) --square $(arg square_size) image:=$(arg image_topic) --folder $(arg foldername)</args> </node> </launch>
2. 节点内读取参数的实现
C++节点(image_pub_sub)读取参数
如果用<param>方式写入参数服务器,C++代码这样读取:
#include <ros/ros.h> #include <string> int main(int argc, char** argv) { ros::init(argc, argv, "image_pub_sub"); ros::NodeHandle nh; std::string foldername; // 读取参数服务器中的值,失败则用默认值 if (!nh.getParam("calib_folder", foldername)) { ROS_WARN("Failed to get calib_folder param, using default"); foldername = "default_folder"; } // 如果用<args>传递命令行参数,直接从argv读取 if (argc > 1) { foldername = argv[1]; } ROS_INFO("Using calibration folder: %s", foldername.c_str()); ros::spin(); return 0; }
Python校准脚本读取参数
原脚本已支持--size、--square等参数,新增--folder参数只需添加解析逻辑:
import argparse import rospy def main(): parser = argparse.ArgumentParser(description='Camera Calibrator') parser.add_argument('--size', type=str, required=True, help='Chessboard size (e.g. 12x8)') parser.add_argument('--square', type=float, required=True, help='Square size in meters') parser.add_argument('--folder', type=str, required=True, help='Calibration result folder') parser.add_argument('image', type=str, help='Image topic name') args = parser.parse_args() rospy.loginfo("Using folder: %s", args.folder) rospy.loginfo("Chessboard size: %s, square size: %.3f", args.size, args.square) rospy.loginfo("Image topic: %s", args.image) # 原有校准逻辑... if __name__ == '__main__': main()
3. 运行流程
- 给Bash脚本添加执行权限:
chmod +x your_script.sh
- 运行脚本启动整个流程:
./your_script.sh
内容的提问来源于stack exchange,提问作者Nagarjun Vinukonda
相关产品推荐
相关产品推荐

